Presentation is loading. Please wait.

Presentation is loading. Please wait.

岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/ トランスポート層 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/ 情報ネットワーク.

Similar presentations


Presentation on theme: "岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/ トランスポート層 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/ 情報ネットワーク."— Presentation transcript:

1 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/
トランスポート層 岡村耕二 情報ネットワーク

2 階層とプロトコル (OSI 参照モデル) アプリケーション層 プレゼンテーション層 セッション層 トランスポート層 ネットワーク層
階層とプロトコル (OSI 参照モデル) 物理層 データリンク層 ネットワーク層 アプリケーション層 トランスポート層 プレゼンテーション層 セッション層 プロトコル 情報ネットワーク

3 7層の概略(IT辞典 http://e-words.jp)
アプリケーション層 データ通信を利用した様々なサービスを人間や他のプログラムに提供する。 プレゼンテーション層 第5層から受け取ったデータをユーザが分かりやすい形式に変換したり、第7層から送られてくるデータを通信に適した形式に変換したりする。 セッション層 通信プログラム同士がデータの送受信を行なうための仮想的な経路(コネクション)の確立や解放を行なう。 トランスポート層 相手まで確実に効率よくデータを届けるためのデータ圧縮や誤り訂正、再送制御などを行なう。 ネットワーク層 相手までデータを届けるための通信経路の選択や、通信経路内のアドレス(住所)の管理を行なう。 データリンク層 通信相手との物理的な通信路を確保し、通信路を流れるデータのエラー検出などを行なう。 物理層 データを通信回線に送出するための電気的な変換や機械的な作業を受け持つ。ピンの形状やケーブルの特性なども第1層で定められる。 情報ネットワーク

4 トランスポート層 セッション層より上位では,個々の応用プロセスが処理を実現するのに必要な情報が、メッセージ単位まで分割される。トランスポート層以下は、このメッセージを通信相手の応用プロセスまで、詳細な伝達手段を意識せずに、確実に送り届ける機能を果たしている。 トランスポート層では、両端のコンピュータシステム内で機能してるアプリケーションプロセス間で、データ送信の保証をすることができる。データ通信の保証のために、通信エラーの検出や回復の機能を持つ。また、上位層が要求するスループットや伝送遅延などのサービス品質(QoS: Quality of Service) を保証する。 代表的なプロトコルに、インターネットにおける誤りのないコネクション型サービス TCP (Transmission Control Protocol) や、動画像などを伝送するための効率の良いコネクションレス型サービス UDP (User Datagram Protocol) などがある。 情報ネットワーク

5 トランスポート 一度に複数の人としゃべったり 相手によってゆっくりしゃべったり、一度にたくさんしゃべったり 情報ネットワーク

6 典型的な構成(近距離) アプリケーション プレゼンテーション セッション トランスポート ネットワーク データリンク 物理 情報ネットワーク

7 典型的な構成(長距離) アプリケーション プレゼンテーション セッション トランスポート ネットワーク データリンク・物理
情報ネットワーク

8 トランスポート層 プロセスとプロセスの通信 TCP (Transmission Control Protocol )
信頼性があるが、速度が不定 メール、WEBアクセス UDP (User Datagram Protocol) 信頼性がないが、 速度は一定 マルチメディア通信 情報ネットワーク

9 トランスポート層 IPアドレスだけでは識別子が足りない ポート番号 特定のサービスを固定的に割り当てる
ホスト内でもっと細かく識別できる必要がある プロセス ウインドウ IP Address + Port = トランスポートアドレス ポート番号 16bit 特定のサービスを固定的に割り当てる 25: 電子メール 80: WWW 情報ネットワーク

10 ネットワーク層とトランスポート層 アプリケーション プレゼンテーション セッション トランスポート ネットワーク データリンク・物理
情報ネットワーク

11 決められたポート番号 http://www.iana.org/assignments/port-numbers 情報ネットワーク
The range for assigned ports managed by the IANA is Port Assignments: Keyword Decimal Description References 0/tcp Reserved 0/udp Reserved # Jon Postel tcpmux /tcp TCP Port Service Multiplexer tcpmux /udp TCP Port Service Multiplexer # Mark Lottor compressnet /tcp Management Utility compressnet /udp Management Utility compressnet /tcp Compression Process compressnet /udp Compression Process # Bernie Volz 情報ネットワーク

12 信頼性のある TCP 通信の実現と工夫 Slow Start Sliding Window 遅延時間に弱い なかなかスピードが出ない。 送信
受信 送信 受信 Slow Start Sliding Window 遅延時間に弱い なかなかスピードが出ない。 スループット 時間 情報ネットワーク

13 通信アプリケーション 電子メール WWW DNS VoD テレビ会議 SMTP/POP/IMAP HTTP/FTP DNS RTSP RTP
情報ネットワーク

14 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/
UDP通信プログラミング 岡村耕二 情報ネットワーク

15 UDP通信プログラム(ソケットの準備) 情報ネットワーク #include <stdio.h>
#include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> main(narg,arg) int narg; char **arg; { int sock; int s_addr; unsigned short port; struct sockaddr_in saddr; char ch; s_addr=inet_addr(arg[1]); port=atoi(arg[2]); bzero(&saddr,sizeof(struct sockaddr_in)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = s_addr; saddr.sin_port = htons(port); sock=socket(AF_INET,SOCK_DGRAM, IPPROTO_UDP); if(connect(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0) perror("bind "); getchar(); } 情報ネットワーク

16 送信、受信の準備 if(connect(sock, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in))<0){ perror("connect"); return -1; } if(bind(sock, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in))<0){ perror("bind"); return -1; } 情報ネットワーク

17 UDP通信プログラム(送信) 情報ネットワーク #include <stdio.h>
#include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> main(narg,arg) int narg; char **arg; { int sock; int s_addr; unsigned short port; struct sockaddr_in saddr; char ch; s_addr=inet_addr(arg[1]); port=atoi(arg[2]); bzero(&saddr,sizeof(struct sockaddr_in)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = s_addr; saddr.sin_port = htons(port); sock=socket(AF_INET,SOCK_DGRAM, IPPROTO_UDP); if(connect(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0) perror(“connect "); write(sock, arg[3], strlen(arg[3])); } 情報ネットワーク

18 UDP通信プログラム(受信) 情報ネットワーク #include <stdio.h>
#include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> main(narg,arg) int narg; char **arg; { int sock; int s_addr; unsigned short port; struct sockaddr_in saddr; char ch; char buf[1024]; s_addr=inet_addr(arg[1]); port=atoi(arg[2]); bzero(&saddr,sizeof(struct sockaddr_in)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = s_addr; saddr.sin_port = htons(port); sock=socket(AF_INET,SOCK_DGRAM, IPPROTO_UDP); if(bind(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0) perror("bind "); bzero(buf,1024); read(sock,buf,1024); printf("receive %s\n",buf); } 情報ネットワーク

19 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/
TCP通信プログラミング 岡村耕二 情報ネットワーク

20 TCP通信プログラム(基本接続) 情報ネットワーク #include <stdio.h>
#include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> main(narg,arg) int narg; char **arg; { int sock,sock2,saddr2_len; int s_addr; unsigned short port; struct sockaddr_in saddr,saddr2; s_addr=inet_addr(arg[1]); port=atoi(arg[2]); bzero(&saddr,sizeof(struct sockaddr_in)); bzero(&saddr2,sizeof(struct sockaddr_in)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = s_addr; saddr.sin_port = htons(port); sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); switch (arg[3][0]){ case 'b': if(bind(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0){ perror("TCPbind "); return -1; } listen(sock,8); saddr2_len = sizeof(saddr2); sock2=accept(sock,(struct sockaddr *)&saddr2,&saddr2_len); printf("connected from %s.\n",inet_ntoa(saddr2.sin_addr)); break; case 'c': if(connect(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0){ perror("TCPconnect "); getchar(); close (sock); 情報ネットワーク

21 TCP通信プログラム(基本送受信) 情報ネットワーク #include <stdio.h>
#include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> main(narg,arg) int narg; char **arg; { int sock,sock2,saddr2_len; int s_addr; unsigned short port; struct sockaddr_in saddr,saddr2; char buf[1024]; s_addr=inet_addr(arg[1]); port=atoi(arg[2]); bzero(&saddr,sizeof(struct sockaddr_in)); bzero(&saddr2,sizeof(struct sockaddr_in)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = s_addr; saddr.sin_port = htons(port); sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); switch (arg[3][0]){ case 'b': if(bind(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0){ perror("TCPbind "); return -1; } listen(sock,8); saddr2_len = sizeof(saddr2); sock2=accept(sock,(struct sockaddr *)&saddr2,&saddr2_len); printf("connected from %s.\n",inet_ntoa(saddr2.sin_addr));   bzero(buf,1024); read(sock2,buf,1024); printf("receive %s\n",buf); break; case 'c': if(connect(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0){ perror("TCPconnect ");   write(sock, arg[4], strlen(arg[4])); perror("weite"); close (sock); 情報ネットワーク

22 TCP と UDP の違い(bind) UDP: TCP bind したソケットIDから直接受信を行う
bind したソケットはID は accept により、接続要求受け付けに用いられ、accept 後、通信用のソケットIDが生成され、その ID を用いて通信が行われる。 情報ネットワーク

23 bind で与えるべきIPアドレス saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = s_addr; saddr.sin_port = htons(port); sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(bind(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0){ perror("TCPbind "); 接続は誰が行うかわからない。つまり、 予想はできないし、指定できる場合は少ない。そのため、誰とでも接続が行えるように を指定する。ただし、サービスを識別するためのポート番号は適切な値にする必要がある。 情報ネットワーク

24 TCP と UDP の違い(connect) UDP: TCP 通信相手が bind していなくても connect の発行は可能
connect するためには、通信相手が先に予め、 bind/listen/accept しておく必要がある。 情報ネットワーク

25 送信、受信する関数は同じ TCP も UDP と同じく write() 関数によるソケットへの書き込みで送信を行い、read()関数によるソケットからの読み出しで受信を行う。 ただし、TCP は bind したソケットIDではなく、accept したソケットID。 int sock; char ch; read(sock,&ch,sizeof(ch)); write(sock,&ch,siezof(ch)); 情報ネットワーク

26 練習問題 標準入力でファイルを読み込み、送受信するプログラムを作成せよ。 通信時間に要した時間・その時の転送速度を表示できるようにせよ。
転送速度が速くなるように工夫せよ。 情報ネットワーク

27 TCP通信プログラム(応用送受信) 情報ネットワーク #include <stdio.h>
#include <strings.h> #include <time.h> #include <sys/time.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> main(narg,arg) int narg; char **arg; { int sock,sock2,saddr2_len; int s_addr; unsigned short port; struct sockaddr_in saddr,saddr2; char buf[1024]; struct timeval tv1,tv2; int cnt=0; s_addr=inet_addr(arg[1]); port=atoi(arg[2]); bzero(&saddr,sizeof(struct sockaddr_in)); bzero(&saddr2,sizeof(struct sockaddr_in)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = s_addr; saddr.sin_port = htons(port); sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); switch (arg[3][0]){ case 'b': if(bind(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0){ perror("TCPbind "); return -1; } listen(sock,8); saddr2_len = sizeof(saddr2); sock2=accept(sock,(struct sockaddr *)&saddr2,&saddr2_len); printf("connected from %s.\n",inet_ntoa(saddr2.sin_addr)); while(1){ char ch; read(sock2,&ch,sizeof(char)); printf("%c",ch); if(ch==EOF) break; }   情報ネットワーク

28 TCP通信プログラム(応用送受信) 情報ネットワーク case 'c':
if(connect(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0){ perror("TCPconnect "); return -1; }  gettimeofday(&tv1,NULL); while(1){ char ch; ch=getchar(); write(sock, &ch, sizeof(char)); cnt++; if(ch==EOF) break; gettimeofday(&tv2,NULL); printf("Time %f, Size %d, Rate %f (Kbps) \n", (tv2.tv_sec+tv2.tv_usec * 1e-6) - (tv1.tv_sec+tv1.tv_usec * 1e-6), cnt, (cnt * 8)/(((tv2.tv_sec+tv2.tv_usec * 1e-6) - (tv1.tv_sec+tv1.tv_usec * 1e-6)) * 1e3) );   close (sock); 情報ネットワーク


Download ppt "岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/ トランスポート層 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/ 情報ネットワーク."

Similar presentations


Ads by Google