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

32
第 5 第第第第第第第第第第第第 第第 第第 第

Upload: moana

Post on 20-Jan-2016

62 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

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

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

中村 修

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

今日のお題 講義

7   layer model のおさらいTCP と UDPネットワークプログラミング基本手順

練習1 :echo client を作ろう

--------- 休憩 -------------------------------- 実習: UDP でデータを送る / 受け取る

udp で echo server を作ろう

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

インターネットの階層モデル

物理データリンク

IP

物理データリンク

IP

TCP

アプリケーション

物理データリンク

IP

TCP

アプリケーション

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

OSI 参照モデルとインターネットの階層構造の関係

セッショントランスポート

アプリケーションプレゼンテーション

ネットワークデータリンク物理

UDPTCP

アプリケーション

IP

Network Interface

物理

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

階層型プロトコルでのデータ送受信 送信側

各層がそれぞれ必要な情報を付加して下層へ渡す 受信側

各層がそれぞれ情報をもとに処理を行い、その使った情報を取り除いて上層へ渡す

UDP

Network Interface

TCP

アプリケーション

物理

IP

UDP

Network Interface

TCP

アプリケーション

物理

IP

送信ノード 受信ノード

データ データ各層の

情報

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

プロトコル 2つの機器間で,通信の手順を決めた約

束ごと IP , TCP , HTTP , FTP

コンピュータは「決まり」がないと通信できない

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

ネットワークアプリケーションとは?

ARP

hardwareinterface

RARP

media

IPICMP IGMP

TCP UDP

networklayer

data linklayer

transportlayer

process process process process

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

クライアント・サーバモデル ネットワークを介したサービスにおける通信モデル

サーバ 受動的にサービス提供する側、待っててくれる

クライアント 能動的にサービス提供を促す側、接続しに行く

Client Serverサービス要求

サービス提供

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

ポートとソケット ポート

トランスポート層のアクセスポイントTCP/UDP 毎に持っている

ソケットプロセスとポートを繋ぐアダプタ

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

socketsocket

ソケット (Socket)

プロセス間通信を行う為のデータの出入り口 プロセスからはファイルディスクプリタを用いてアクセス プロセスにとってはプロセス間通信もファイル入出力も同

じインターフェイス

プロセス プロセス

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

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

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

socket() システムコール 返り値

成功 : ソケットディスクリプタが返る 失敗 : -1 が返る

ソケットディスクリプタはファイルディスクリプタの友達 実際のコードでは…

listenfd = socket(AF_INET, SOCK_STREAM, 0)

AF_INET の場合の利用される IPv4 の上位層 SOCK_STREAM TCP SOCK_DGRAM UDP SOCK_RAW なし

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

初期状態

クライアントプロセス

ホスト A

サーバプロセス

ホスト B

Port B

IP Address: xx.xx.xx.xx.IP Address: xx.xx.xx.xx.

Port C

Port A

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

Socket を開いた状態

クライアントプロセス

ホスト A

サーバプロセス

ホスト B

Port B

IP Address: xx.xx.xx.xx.IP Address: xx.xx.xx.xx.

Port C

Port A

Socketを開く

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

bind した状態

クライアントプロセス

ホスト A

サーバプロセス

ホスト B

Port B

IP Address: xx.xx.xx.xx.IP Address: xx.xx.xx.xx.

Port C

Port A

Proto LocalAdddress ForeignAddress StateTCP *.A *.* Closed

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

Stream example (TCP)Server

socket()

bind()

Client

socket()listen()

accept()

recv()

send()

connect()

send()

recv()

Block untilconnect

Processrequest

Connection Establishmt.

Data (request)

Data (reply)

暗黙に bind()

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

Datagram example (UDP)Server

socket()

bind()Client

socket()

recvfrom()

sendto()

bind()

sendto()

recvfrom()

Block untilData from client

Processrequest

Data (request)

Data (reply)

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

Datagram example2 (UDP)Server

socket()

bind()Client

socket()

recvfrom()

sendto()

bind()

send ()

recv ()

Block untilData from client

Processrequest

Data (request)

Data (reply)

connect()

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

sockaddr_in 構造体 ソケットの情報

アドレス … 32bit ポート番号 … 16bit プロトコルファミリー … AF_INET…

長さ protocol Port番号

アドレス

unused

unused

0 7 15 31

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

sockaddr 構造体 ソケットの情報を一般化した形

ソケットを使った通信のためのテンプレート 利用するプロトコルに依存しない 共通: 長さ・プロトコルファミリ (AF_XXX)

長さ protocol unused

unused

unused

unused

0 7 15 31

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

キャスト ある変数・構造体を無理やり違う型の変数や構造体とし

て扱う方法 変数を使う時に扱いたい型をカッコで括る

(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++);}

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

inet_addr()

in_addr_t inet_addr(const char *strptr); アドレスを表す文字列を,

ネットワークバイト順序のバイナリ値へ 「 127.0.0.1 」という文字列は人間には

分かりやすいが,コンピュータには分かりにくい

仲間 inet_aton() inet_ntoa()

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

ネットワーク・バイト・オーダ Network Byte Order CPU アーキテクチャによって、バイトの並びが違う

一般に Big Endian(sparc 等 ) と Little Endian(Intel 等 ) の二つ ネットワーク上に流すバイト順を統一しなくてはならない

Big Endian に統一 htons()/htonl()/ntohs()/ntohl() を利用

リトルエンディアン ビッグエンディアン

16ビット整数( short)

32ビット整数( long)

1 2 12

1 2 3 4 1234

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

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

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

練習 1:echo クライアント作成 echo サーバは以下

  hi.sfc.wide.ad.jp

port   7 番

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

必要な構造体 #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*/

}

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

必要な関数 socket bind sendto recvfrom

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

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

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

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))

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

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 s

ockaddr *)&server, sizeof(server)) < 0) { perror("sendto"); exit(-1);

}

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

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);

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

実習

echo サーバを作ろう。基本的に echo クライアントと同じ

sendto,recvfrom の順番が逆