1 / 28

トランスポート層

トランスポート層. 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/. プロトコル. アプリケーション層. アプリケーション層. プロトコル. プレゼンテーション層. プレゼンテーション層. プロトコル. セッション層. セッション層. プロトコル. トランスポート層. トランスポート層. プロトコル. ネットワーク層. ネットワーク層. プロトコル. データリンク層. データリンク層. プロトコル. 物理層. 物理層. 階層とプロトコル (OSI 参照モデル).

ulmer
Download Presentation

トランスポート層

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. トランスポート層 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/

  2. プロトコル アプリケーション層 アプリケーション層 プロトコル プレゼンテーション層 プレゼンテーション層 プロトコル セッション層 セッション層 プロトコル トランスポート層 トランスポート層 プロトコル ネットワーク層 ネットワーク層 プロトコル データリンク層 データリンク層 プロトコル 物理層 物理層 階層とプロトコル (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 0-1023. Port Assignments: Keyword Decimal Description References ------- ------- ----------- ---------- 0/tcp Reserved 0/udp Reserved # Jon Postel <postel@isi.edu> tcpmux 1/tcp TCP Port Service Multiplexer tcpmux 1/udp TCP Port Service Multiplexer # Mark Lottor <MKL@nisc.sri.com> compressnet 2/tcp Management Utility compressnet 2/udp Management Utility compressnet 3/tcp Compression Process compressnet 3/udp Compression Process # Bernie Volz <VOLZ@PROCESS.COM> 情報ネットワーク

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

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

  14. UDP通信プログラミング 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/

  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. TCP通信プログラミング 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/

  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 "); return -1; } getchar(); break; } 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 "); return -1; } write(sock, arg[4], strlen(arg[4])); perror("weite"); break; } close (sock); } 情報ネットワーク

  22. TCP と UDP の違い(bind) • UDP: • bind したソケットIDから直接受信を行う • TCP • 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 "); 接続は誰が行うかわからない。つまり、 予想はできないし、指定できる場合は少ない。そのため、誰とでも接続が行えるように 0.0.0.0 を指定する。ただし、サービスを識別するためのポート番号は適切な値にする必要がある。 情報ネットワーク

  24. TCP と UDP の違い(connect) • UDP: • 通信相手が bind していなくても connect の発行は可能 • TCP • 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; } 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); } 情報ネットワーク

More Related