1 / 32

第 5 回ネットワークプログラミング

第 5 回ネットワークプログラミング. 中村 修. 今日のお題. 講義 7 layer model のおさらい TCP と UDP ネットワークプログラミング基本手順 練習1 :echo client を作ろう --------- 休憩 -------------------------------- 実習: UDP でデータを送る / 受け取る udp で echo server を作ろう. アプリケーション. TCP. アプリケーション. IP. TCP. IP. データリンク. IP. データリンク. データリンク. 物理. 物理.

moana
Download Presentation

第 5 回ネットワークプログラミング

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第5回ネットワークプログラミング 中村 修

  2. 今日のお題 • 講義 • 7layer modelのおさらい • TCPとUDP • ネットワークプログラミング基本手順 • 練習1:echo clientを作ろう ---------休憩-------------------------------- • 実習:UDPでデータを送る/受け取る • udpで echo serverを作ろう

  3. アプリケーション TCP アプリケーション IP TCP IP データリンク IP データリンク データリンク 物理 物理 物理 インターネットの階層モデル

  4. アプリケーション プレゼンテーション セッション トランスポート ネットワーク データリンク 物理 OSI参照モデルとインターネットの階層構造の関係 アプリケーション TCP UDP IP Network Interface 物理

  5. データ 階層型プロトコルでのデータ送受信 • 送信側 • 各層がそれぞれ必要な情報を付加して下層へ渡す • 受信側 • 各層がそれぞれ情報をもとに処理を行い、その使った情報を取り除いて上層へ渡す 各層の 情報 アプリケーション アプリケーション データ TCP UDP TCP UDP IP IP Network Interface Network Interface 物理 物理 送信ノード 受信ノード

  6. プロトコル • 2つの機器間で,通信の手順を決めた約束ごと • IP,TCP,HTTP,FTP • コンピュータは「決まり」がないと通信できない

  7. ネットワークアプリケーションとは? process process process process TCP UDP transport layer ICMP IP IGMP network layer ARP RARP data link layer hardware interface media

  8. クライアント・サーバモデル • ネットワークを介したサービスにおける通信モデル • サーバ • 受動的にサービス提供する側、待っててくれる • クライアント • 能動的にサービス提供を促す側、接続しに行く Client Server サービス要求 サービス提供

  9. ポートとソケット • ポート • トランスポート層のアクセスポイント • TCP/UDP毎に持っている • ソケット • プロセスとポートを繋ぐアダプタ

  10. ソケット(Socket) • プロセス間通信を行う為のデータの出入り口 • プロセスからはファイルディスクプリタを用いてアクセス • プロセスにとってはプロセス間通信もファイル入出力も同じインターフェイス プロセス プロセス socket socket

  11. socket()システムコール • int socket(int family, int type, int proto) • familyにはプロトコルファミリを指定 • AF_INET IPv4プロトコル • AF_INET6 IPv6プロトコル • AF_LOCAL UNIX Domain Socket • AF_ROUTE 経路制御ソケット • Typeにはソケットのタイプ(以下のどれか) • SOCK_STREAM ストリームソケット • SOCK_DGRAM データグラムソケット • SOCK_RAW rawソケット • Protoにはrawソケット以外、通常0

  12. socket()システムコール • 返り値 • 成功: ソケットディスクリプタが返る • 失敗: -1が返る • ソケットディスクリプタはファイルディスクリプタの友達 • 実際のコードでは… listenfd = socket(AF_INET, SOCK_STREAM, 0) • AF_INETの場合の利用されるIPv4の上位層 • SOCK_STREAM TCP • SOCK_DGRAM UDP • SOCK_RAW なし

  13. 初期状態 クライアント プロセス サーバ プロセス Port A Port B Port C ホストA ホストB IP Address: xx.xx.xx.xx. IP Address: xx.xx.xx.xx.

  14. Socketを開いた状態 Socketを開く クライアント プロセス サーバ プロセス Port A Port B Port C ホストA ホストB IP Address: xx.xx.xx.xx. IP Address: xx.xx.xx.xx.

  15. bindした状態 Proto LocalAdddress ForeignAddress State TCP *.A *.* Closed クライアント プロセス サーバ プロセス Port A Port B Port C ホストA ホストB IP Address: xx.xx.xx.xx. IP Address: xx.xx.xx.xx.

  16. Stream example (TCP) Server socket() bind() Client listen() socket() accept() Connection Establishmt. connect() 暗黙にbind() Block until connect Data (request) send() recv() Process request Data (reply) send() recv()

  17. Datagram example (UDP) Server socket() Client bind() socket() recvfrom() bind() Block until Data from client sendto() Data (request) Process request Data (reply) sendto() recvfrom()

  18. Datagram example2 (UDP) Server socket() Client bind() socket() recvfrom() bind() Block until Data from client connect() Data (request) send () Process request Data (reply) sendto() recv ()

  19. sockaddr_in構造体 • ソケットの情報 • アドレス … 32bit • ポート番号 … 16bit • プロトコルファミリー … AF_INET… 7 15 31 0 長さ protocol Port番号 アドレス unused unused

  20. sockaddr構造体 • ソケットの情報を一般化した形 • ソケットを使った通信のためのテンプレート • 利用するプロトコルに依存しない • 共通: 長さ・プロトコルファミリ(AF_XXX) 7 15 31 0 長さ protocol unused unused unused unused

  21. キャスト • ある変数・構造体を無理やり違う型の変数や構造体として扱う方法 • 変数を使う時に扱いたい型をカッコで括る • (int)no_int_variable; ← int型にキャスト • 関数の引数を一般化するのに便利 • sockaddrの例 • struct sockaddr_in sin; (struct sockaddr)sin; • 型やサイズに依存せず1バイトずつ読みたいときにも使う long addr = 1234567; char *cp = (char *)&addr; for(j = 0; j < 4; j++) { printf("%c ", *cp++); }

  22. inet_addr() • in_addr_t inet_addr(const char *strptr); • アドレスを表す文字列を,ネットワークバイト順序のバイナリ値へ • 「127.0.0.1 」という文字列は人間には分かりやすいが,コンピュータには分かりにくい • 仲間 • inet_aton() • inet_ntoa()

  23. ネットワーク・バイト・オーダ • Network Byte Order • CPUアーキテクチャによって、バイトの並びが違う • 一般にBig Endian(sparc等)とLittle Endian(Intel等)の二つ • ネットワーク上に流すバイト順を統一しなくてはならない • Big Endianに統一 • htons()/htonl()/ntohs()/ntohl()を利用 リトルエンディアン ビッグエンディアン 1 2 2 1 16ビット整数 (short) 1 2 3 4 4 3 2 1 32ビット整数 (long)

  24. エンディアン変換 • u_long htonl(u_long hostlong); • u_short htons(u_short hostshort); • u_long ntohl(u_long netlong); • u_short ntohs(u_short netshort);

  25. 練習1:echoクライアント作成 • echoサーバは以下 hi.sfc.wide.ad.jp port7番

  26. 必要な構造体 • #include<netinet/in.h> struct sockaddr_in{ u_char sin_len; /*IP addressのサイズ*/ u_char sin_family; /*AF_INET etc*/ u_short sin_port; /*port num*/ struct in_addr sin_addr; /*IP address*/ char sin_zero[8]; /*padding*/ }

  27. 必要な関数 • socket • bind • sendto • recvfrom

  28. socket • int socket(int domain, int type, int protocol); (例) sd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP) AF_UNIX , SOCK_STREAM,IPPROTO_TCP SOCK_RAW,IPPROTO_ICMP

  29. bind • int bind(int sockfd,struct sockaddr *addr,int addrlen); (例) struct sockaddr_in server; memset((void *)&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(7); server.sin_addr.s_addr = INADDR_ANY;/* local host*/ bind(sd,(struct sockaddr *)&server, sizeof(server))

  30. sendto • ssize_t sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, int tolen); (例) if (sendto(s, (char *)&msg, sizeof(msg), 0 , (struct sockaddr *)&server, sizeof(server)) < 0) { perror("sendto"); exit(-1); }

  31. recvfrom • ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, int *fromlen); (例) recvlen = recvfrom(sd, (void *)buf, 1024, 0, (struct sockaddr *)&client, &clientlen);

  32. 実習 echoサーバを作ろう。 • 基本的にechoクライアントと同じ • sendto,recvfromの順番が逆

More Related