Presentation is loading. Please wait.

Presentation is loading. Please wait.

Network Programming in C Lecture 6: Network Programming (1) ネットワークプログラミング 第6回「ネットワークとプログラミング(1)」 2010年秋学期 Rodney Van Meter.

Similar presentations


Presentation on theme: "Network Programming in C Lecture 6: Network Programming (1) ネットワークプログラミング 第6回「ネットワークとプログラミング(1)」 2010年秋学期 Rodney Van Meter."— Presentation transcript:

1 Network Programming in C Lecture 6: Network Programming (1) ネットワークプログラミング 第6回「ネットワークとプログラミング(1)」
2010年秋学期 Rodney Van Meter

2 今期の授業スケジュール(予定) 第1回 9/28: Introduction / イントロダクション
第2回 10/5:C Basics~Functions, Variables, Data Types・ Makefiles 第3回 10/12:C Basics~Command Line Arguments ・ Structures ・ Pointers 第4回 10/19:C Basics~Pointers & Arrays ・ Lists 第5回 10/26: file I/O・ Network Protocols 第6回 11/2: Network Programming (1)‏ 第7回 11/9: Network Programming (2)‏ 第8回 11/16: Network Programming (3) 第9回 11/30: Applied Network Programming (1) 第10回 12/7: Applied Network Programming (2) 第11回 12/14: Work on Projects 第12回 12/21: Work on Projects 第13回 1/19: Final Presentations!!!

3 今日の目標

4 Try My Message Server (Simpler even than the attendance server)
IP address: 2001:200:0:8801:20c:29ff:fe27:6c98 Port : 12345 telnet! 課題:サーバ作成

5 Outline for Today Projects Tools Sockets Practice/Homework
Make your own TCP “Success!” server

6 Wireshark

7 Internet Layered Model
アプリケーション層 Application Layer アプリケーション層 Application Layer トランスポート層 Transport Layer トランスポート層 Transport Layer ネットワーク層 Network Layer ネットワーク層 Network Layer ネットワーク層 Network Layer データリンク層 Data Link Layer データリンク層 Data Link Layer データリンク層 Data Link Layer 物理層 Physical Layer 物理層 Physical Layer 物理層 Physical Layer エンドノード 中継ノード エンドノード 送信元から中継ノード(ルータ)を通ってあて先に到達する 7 7

8 OSI Model & Internet Architecture
アプリケーション層 Application Layer Web XML Webサービス NNTP ・・・ Messaging File transfer File sharing プレゼンテーション層 Presentation Layer セッション層 Session Layer トランスポート層 Transport Layer TCP UDP ネットワーク層 Network Layer IP データリンク層 Data Link Layer Ethernet xDSL Optical fiber 無線LAN (WLAN) 物理層 Physical Layer 8

9 Protocol Stack & Encapsulation
Sender side Each layer in stack adds headers as necessary Receiver side Each layer extracts headers, processes, then sends to higher layer in stack n.b.: Messages may not be 1:1! Application アプリケーション ex:HTTP hdr Data データ TCP hdr TCP TCP IP hdr IP IP Ethernet Frame Ethernet/100M Ethernet/100M CAT5e CAT5e phy. signal sender side receiver side 9

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

11 Client-Server Model Client Server サービス要求 Time サービス提供
Primary model used on the Internet Server (e.g., web server, DNS server, file server) Waits to receive communication from client 反復サーバ/平行サーバ Client (e.g., web browser) Initiates connection to server Client Server サービス要求 Time サービス提供

12 Port & Socket Port Socket Access point for transport layer
TCP/UDP both have Appears in packet headers Socket “Adapter” that connects a software process to a network port Much like a file descriptor Internal to your computer

13 ソケット(Socket)‏ Process Process
Process-to-process data I/O entrance/exit Allows process to send/receive like a file descriptor Process Process socket socket

14 socket() System Call int socket(int family, int type, int proto)‏
family defines choice of protocol family AF_INET IPv4 protocol AF_INET6 IPv6 protocol AF_LOCAL UNIX Domain Socket AF_ROUTE routing socket (経路制御ソケット) (special) Type defines how data is managed SOCK_STREAM as a stream (TCP) SOCK_DGRAM as individual datagrams (UDP) SOCK_RAW raw packets Proto is 0, except for RAW

15 socket() System Call Return value Code usually looks like…
success: socket descriptor number failure: -1 same as with file descriptors Code usually looks like… listenfd = socket(AF_INET, SOCK_STREAM, 0)‏ AF_INETの場合の利用されるIPv4の上位層 SOCK_STREAM TCP SOCK_DGRAM UDP SOCK_RAW なし

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

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

18 bindした状態 Proto LocalAddress 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.

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

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

21 sockaddr_in構造体 ソケットの情報 7 15 31 長さ Port番号 アドレス unused unused
アドレス … 32bit (IPv4), 128bit (IPv6)‏ ポート番号 … 16bit プロトコルファミリー … AF_INET… 7 15 31 長さ protocol Port番号 アドレス unused unused

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

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

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

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

26 Naming: inet_aton()‏ (don’t use!)
int inet_aton (const char *cp, struct in_addr *inp); アドレスを表す文字列を, ネットワークバイト順序のバイナリ値へ 「 」という文字列は人間 には分かりやすいが,コンピュータには分かりにくい 返り値は, 指定したアドレスが正当ならば0以外,不当なら0. 仲間 inet_ntoa()‏

27 “Modern” naming getaddrinfo() See:
Gilligan et al., RFC 2553 Metz, “Protocol Independence...,” FreeNix 2000 Yoshifuji et al., “Linux IPv6 Networking,” Linux Symposium 2003 More next week, when we start clients

28 実習/課題:TCP-echoクライアント作成
IP address: 2001:200:0:8801:20c:29ff:fe27:6c98 Port : 12345 telnet! 次ページに必要な関数・構造体の説明あり

29 Important Structure #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*/ }

30 Important functions socket bind sendto recvfrom UDP client UDP Server
Data (request)‏ sendto()‏ recvfrom()‏ Data (reply)‏

31 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

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

33 Example of Old-Style Code for filling in sockaddr
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);

34 Using 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); }

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

36 #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; }

37 今日の目標

38 Homework Create your own TCP “Success!” message server.

39 コンピュータ・プロトコル 通信の手順をきめた約束事 通信規約と訳される 例: IP、HTTP、TCP、FTP、UDP、ICMP、etc…
それぞれ対応しているプロトコルが違うとお互い に通信できない

40 同じ決まりで通信するということ 相手が英語,自分が日本語で 話しても会話は成立しない 電話では始めに 「もしもし,xx です」
1) 受話器を上げる 相手が英語,自分が日本語で 話しても会話は成立しない 電話では始めに 「もしもし,xx です」 コンピュータの世界でも同じ UNIX-Windows間の通信 無線-有線間の通信 2) 電話番号を入力 5) 会話する 6) どちらかが受話器を置く 7) 回線が切れる 3) 着信を通知する 4) 受話器を上げる 電話の例

41 階層化の特徴 責任範囲(役割)の規定,限定 各階層が独立 スケーラビリティ 新しい技術への柔軟性 階層化していないと・・・
上位のプロトコルは,自分のすぐ下のプロトコルの使い方(イン ターフェース)さえ知っていれば,それより下で何が起きている かをまったく気にする必要がない 階層毎に共通のインターフェイスを定義 スケーラビリティ 処理を各層に分散できる 新しい技術への柔軟性 同一レベルの階層同士を交換出来る 新しく技術が開発された部分だけ交換すれば進化できる ISDN→ADSL→FTTH,IPv4→IPv6 階層化していないと・・・ 規格が変わるとシステムすべてを更新する必要がある 41


Download ppt "Network Programming in C Lecture 6: Network Programming (1) ネットワークプログラミング 第6回「ネットワークとプログラミング(1)」 2010年秋学期 Rodney Van Meter."

Similar presentations


Ads by Google