ネットワークプログラミング 第 6 回「ネットワークとプログラミング (1)...
DESCRIPTION
2009年秋学期 Rodney Van Meter. ネットワークプログラミング 第 6 回「ネットワークとプログラミング (1) 」. 授業 Web ページ. SFC-SFS https://vu.sfc.keio.ac.jp/sfc-sfs/ 課題・授業資料などの情報を掲示 課題は毎回こちらに提出 今日の課題締め切り 11/16( 月 )23:59 分まで! 遅れて提出する方は要連絡. 今期の授業スケジュール(予定). 第1回:イントロダクション 第2回: C 言語の基礎~関数・変数・ Makefile - PowerPoint PPT PresentationTRANSCRIPT
授業Webページ SFC-SFS
https://vu.sfc.keio.ac.jp/sfc-sfs/
課題・授業資料などの情報を掲示 課題は毎回こちらに提出 今日の課題締め切り
11/16(月 )23:59分まで! 遅れて提出する方は要連絡
今期の授業スケジュール(予定) 第1回:イントロダクション 第2回: C言語の基礎~関数・変数・Makefile 第3回: C言語の基礎~コマンドライン引数・構造体・ポインタ 第4回: C 言語の基礎~ポインタと配列・リスト構造 (10/20) 第5回: File I/O・ネットワークプログラミング (10/27) 第6回:ネットワークとプログラミング(1) (11/10) 第 7 回:ネットワークとプログラミング(2) () 第 8回:ネットワークとプログラミング( 3 ) () 第 9 回:応用ネットワークプログラミング(1) () 第1 0 回:応用ネットワークプログラミング(2) () 第1 1 回:ミニプロ 中間発表 (12/22!) 第1 2 回:ミニプロ () 第1 3 回:ミニプロ () 最終発表
実習 /課題 :TCP-echoクライアント作成
echoサーバは以下 IP address:
2001:200:0:8801:20c:29ff:fe27:6c98 Port : 12345
telnet!
次ページに必要な関数・構造体の説明あり
コンピュータ・プロトコル 通信の手順をきめた約束事 通信規約と訳される 例 :
IP、 HTTP、 TCP、 FTP、 UDP、 ICMP、 etc…
それぞれ対応しているプロトコルが違うとお互いに通信できない
同じ決まりで通信するということ
相手が英語,自分が日本語で話しても会話は成立しない
電話では始めに 「もしもし, xxです」
コンピュータの世界でも同じ UNIX-Windows間の通信 無線 -有線間の通信
1) 受話器を上げる
2) 電話番号を入力
3) 着信を通知する4) 受話器を上げる
5) 会話する6) どちらかが受話器を置く
7) 回線が切れる
電話の例
ネットワーク層Network Layer
データリンク層Data Link Layer
物理層Physical Layer
インターネットの階層モデル
エンドノード 中継ノード エンドノード
アプリケーション層
Application Layer
トランスポート層Transport Layer
ネットワーク層Network Layer
データリンク層Data Link Layer
物理層Physical Layer
アプリケーション層
Application Layer
トランスポート層Transport Layer
ネットワーク層Network Layer
データリンク層Data Link Layer
物理層Physical Layer
インターフェース処理 経路制御処理
プロトコル処理
アプリケーション層Application Layer
プレゼンテーション層Presentation Layer
セッション層Session Layer
トランスポート層Transport Layer
ネットワーク層Network Layer
データリンク層Data Link Layer
物理層Physical Layer
OSIモデルとインターネットアーキテクチャ
11
WebXML Webサービス
メールニュース・・・
WebXML Webサービス
メールニュース・・・
メッセージングファイル共有ファイル転送・・・
メッセージングファイル共有ファイル転送・・・
TCPTCP UDPUDP
IPIP
イーサネット
イーサネット
xDSL光ファイバ
xDSL光ファイバ 無線 LAN無線 LAN
アプリケーション
TCP
IP
Ethernet/100M
CAT5e
アプリケーション
TCP
IP
Ethernet/100M
CAT5e
データデータ
例: HTTPヘッダ
プロトコルスタックとカプセル化
TCPヘッダ
IPヘッダ
信号へ
送信側 受信側
送信側 各層がそれぞれ必要な情報(ヘッダ)を付加して下層へ渡す
受信側各層はヘッダの情報をもとに処理を行い,そのヘッダ部分を取り除いて上層へ渡す
Ethernet Frame
データデータ
階層化の特徴
責任範囲 (役割 )の規定,限定各階層が独立
上位のプロトコルは,自分のすぐ下のプロトコルの使い方(インターフェース )さえ知っていれば,それより下で何が起きているかをまったく気にする必要がない
階層毎に共通のインターフェイスを定義スケーラビリティ
処理を各層に分散できる新しい技術への柔軟性
同一レベルの階層同士を交換出来る新しく技術が開発された部分だけ交換すれば進化できる
ISDN→ADSL→FTTH, IPv4→IPv6階層化していないと・・・
規格が変わるとシステムすべてを更新する必要がある
ネットワークアプリケーションとは?
ARP
hardwareinterface
RARP
media
IPICMP IGMP
TCP UDP
networklayer
data linklayer
transportlayer
process process process processApplicationlayer
クライアント・サーバモデル ネットワークを介したサービスにおける通信モデル サーバ
受動的にサービス提供する側、待っててくれる 反復サーバ /平行サーバ
クライアント 能動的にサービス提供を促す側、接続しに行く
Client Serverサービス要求
サービス提供
socketsocket
ソケット (Socket) プロセス間通信を行う為のデータの出入り口 プロセスからはファイルディスクプリタを用いてアクセス プロセスにとってはプロセス間通信もファイル入出力も同じインターフェイス
プロセス プロセス
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
socket()システムコール
返り値 成功 : ソケットディスクリプタが返る 失敗 : -1が返る
ソケットディスクリプタはファイルディスクリプタの友達
…実際のコードではlistenfd = socket(AF_INET, SOCK_STREAM, 0)
AF_INETの場合の利用される IPv4の上位層 SOCK_STREAM TCP SOCK_DGRAM UDP SOCK_RAW なし
初期状態
クライアントプロセス
ホスト A
サーバプロセス
ホスト B
Port B
IP Address: xx.xx.xx.xx.IP Address: xx.xx.xx.xx.
Port C
Port A
Socketを開いた状態
クライアントプロセス
ホスト A
サーバプロセス
ホスト B
Port B
IP Address: xx.xx.xx.xx.IP Address: xx.xx.xx.xx.
Port C
Port A
Socketを開く
bindした状態
クライアントプロセス
ホスト A
サーバプロセス
ホスト B
Port B
IP Address: xx.xx.xx.xx.IP Address: xx.xx.xx.xx.
Port C
Port A
Proto LocalAddress ForeignAddress StateTCP *.A *.* Closed
Datagram example (UDP)Server
socket()
bind()Client
socket()
recvfrom()
sendto()
bind()
sendto()
recvfrom()
Block untilData from client
Processrequest
Data (request)
Data (reply)
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()
sockaddr_in構造体 ソケットの情報
… アドレス 32bit (IPv4), 128bit (IPv6) … ポート番号 16bit … プロトコルファミリー AF_INET…
長さ protocol Port番号
アドレス
unused
unused
0 7 15 31
sockaddr構造体 ソケットの情報を一般化した形
ソケットを使った通信のためのテンプレート 利用するプロトコルに依存しない 共通: 長さ・プロトコルファミリ (AF_XXX)
長さ protocol unused
unused
unused
unused
0 7 15 31
キャスト ある変数・構造体を無理やり違う型の変数や構造体として扱う方法 変数を使う時に扱いたい型をカッコで括る
(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++);}
ネットワーク・バイト・オーダ 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
エンディアン変換 u_long htonl(u_long hostlong); u_short htons(u_short hostshort); u_long ntohl(u_long netlong); u_short ntohs(u_short netshort);
inet_aton()
int inet_aton(const char *cp, struct in_addr *inp);
アドレスを表す文字列を,ネットワークバイト順序のバイナリ値へ
「 127.0.0.1 」という文字列は人間には分かりやすいが,コンピュータには分かりにくい
返り値は,指定したアドレスが正当ならば 0以外,不当なら0.
仲間 inet_ntoa()
実習 /課題 :TCP-echoクライアント作成
echoサーバは以下 IP address:
2001:200:0:8801:20c:29ff:fe27:6c98 Port : 12345
telnet!
次ページに必要な関数・構造体の説明あり
必要な構造体
#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*/}
必要な関数 socket bind sendto recvfrom
socket()
bind()
recvfrom()
socket()
bind()
recvfrom()
UDP client UDP Server
sendto()
sendto()
Data (request)
Data (reply)
socket
int socket(int domain, int type, int protocol);
(例 )int sd;
sd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)
AF_UNIX , SOCK_STREAM,IPPROTO_TCP
SOCK_RAW,IPPROTO_ICMP
bind
int bind(int sockfd,struct sockaddr *addr,int addrlen);(例 )
struct sockaddr_in cl_addr;
memset((void *)&cl_addr, 0, sizeof(cl_addr));cl_addr.sin_family = AF_INET;cl_addr.sin_port = htons(0);cl_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* local host*/
bind(sd,(struct sockaddr *)&cl_addr, sizeof(cl_addr))
サーバのソケットアドレスを準備するstruct sockaddr_in sv_addr;
memset((void *)&sv_addr, 0, sizeof(sv_addr));sv_addr.sin_family = AF_INET;sv_addr.sin_port = htons(?????);inet_aton(?????, &sv_addr.sin_addr);
sendto
ssize_t sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, int tolen);
(例)if (sendto(sd, (char *)&msg, sizeof(msg), 0 ,
(struct sockaddr *)&sv_addr, sizeof(sv_addr)) < 0) { perror("sendto"); exit(-1);
}
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 *)&sv_addr, &svadlen);
#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <stdio.h>
#define BUFMAX 1024
int main(int argc, char *argv[]){int sd; int cc, svadlen;char buf[BUFMAX]char rmsg[BUFMAX];struct sockaddr_in cl_addr, sv_addr;
/* socket の作成 */????
/* socket に名前をつける */????
/* サーバのソケットアドレスの設定 */????
/* 処理ルーチン (メッセージの送信,受信 ) */????
return 0;
}