TCP基礎講座 徳田研 ECN sada.

Slides:



Advertisements
Similar presentations
TCP/IP によるチャットプログラ ム 薄井 秀晃. 基礎知識編 TCP/IP とは? IP とは・・・ Internet Protocol の略称であり通信方法の技術的なルールで あり、実際にデータを送受信する前にデータを小さなデータ に分割し、それに発信元と受信先の IP アドレスを付加させて.
Advertisements

第1章 ネットワークとコミュニケーション 第2節 ネットワークのしくみ 2 ネットワークを支える技術 (教科書 p36 ~ p37) 今日の用語  モデム (modulator/demodulator:modem)  IP アドレス (internet protocol address)  ドメインネーム.
N チャンネル通信のための 経路制御 小川 真人 木下研究室. Nチャンネル通信 N本の経路を用いて、ファイルを分散させて通信を行う方式である。 分散されたファイルが、すべて違う経路を通り相手に届くことが理想である。
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
Step.5 パケットダンプ Wiresharkでパケットをキャプチャする PC 1 PC 2 PC 3 PC 4 ネットワーク
アルゴリズムとデータ構造 第2回 線形リスト(復習).
Timeout と再送 往復時間 予知が困難 他のトラフィックに依存 適応再送アルゴリズム データの採取.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
第1回.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
前回の課題 IPv6アドレス IP ARP ICMP NAT インターネット層 2003年12月4日 情報ネットワーク論 新村太郎.
ネットワーク層.
基礎プログラミングおよび演習 第9回
TCP Timeout and Retransmission
詳解TCP/IP TCPタイムアウトと再転送 れにうむ.
TCP (Transmission Control Protocol)
ネットワーク コミュニケーション トランスポート層 TCP/UDP 6/28/07.
詳解TCP/IP ACE B2 mewtwo.
ファイル送信機能付きマルチキャストチャット
第6章 2重ループ&配列 2重ループと配列をやります.
HTTPプロトコルとJSP (1) データベース論 第3回.
トランスポート層.
HTTPプロトコル J2EE I 第7回 /
Telnet, rlogin などの仮想端末 ftp などのファイル転送 rpc, nfs
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第11回 プロセス間通信4 仮想FTPの実現 担当:青木義満
コンテンツ配信 エンコード (符号化) CBR (Constant Bit Rate) VBR (Variable Bit Rate)
パケットの流れ ブラウザ OS TCP IP LANアダプタ ハブ ルータ HTTPメッセージ TCP HTTP断片 TCP HTTP断片
画像情報特論 (3) - TCP/IP (2) TCP (Transport Control Protocol)
Linux リテラシ 2006 第4回 ネットワーク CIS RAT.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
ネットワークプログラミング 中村 修.
第11章 UDPユーザ・データグラム・プロトコル
TCP/UDP プロセス間の通信のためのプロトコル TCP:信頼性高、処理時間大 UDP:信頼性低、処理時間小 ftp SMTP HTTP
インターネットの基礎知識 その3 ~TCP・UDP層編~
第9章 Error and Control Messages (ICMP)
プログラミング応用 printfと変数.
岡村耕二 トランスポート層 ソケットプログラミング 岡村耕二 情報ネットワーク.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Cプログラミング演習 第7回 メモリ内でのデータの配置.
画像情報特論 (3) - TCP/IP (2) TCP (Transport Control Protocol)
画像情報特論 (3) - マルチメディアインフラとしてのTCP/IP (2)
インターネットにおける真に プライベートなネットワークの構築
画像処理プログラムの説明.
画像情報特論 (3) - TCP/IP (2) TCP (Transport Control Protocol)
プログラミング演習I 2003年5月7日(第4回) 木村巌.
超高速ネットワークの弱点 光は速い 光は遅い 300km / 1msec (真空中) 180km / 1msec (光ファイバ中)
UDPマルチキャストチャット    空川幸司.
演習第6回 情報通信技術論 インターネット工学
岡村耕二 トランスポート層 岡村耕二 情報ネットワーク.
TCP制御フラグの解析による ネットワーク負荷の推測
最低限インターネット ネットワークにつなぎましょ!
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
GbEにおける TCP/IP の研究について
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第11回 プロセス間通信4 仮想FTPの実現 担当:青木義満
4.3 IPとルーティングテーブル 国際産業情報学科 2年 大竹 雅子.
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
画像情報特論 (3) - TCP/IP (2) TCP (Transport Control Protocol)
TCP/IPの通信手順 (tcpdump)
UDPデータグラムヘッダ 牧之内研究室 修士1年 久保正明.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
プロトコル番号 長野 英彦.
ユーザ認証の盗聴 2002/9/10 峯 肇史 牧之内研究室「インターネット実習」Webページ
プログラミング演習I 補講用課題
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
HTTPプロトコルの詳細 M1 峯 肇史.
Presentation transcript:

TCP基礎講座 徳田研 ECN sada

TCP とは? Transmission Control Protocol と言われてもイメージが湧かないですよね

隣の人、受け渡しが遅いけど、いつも通り送っちゃえ IPのイメージ IPって実は結構テキトウ 途中でデータを無くしてもお構いなし 途中のネットワークが混んでてもお構いなし 隣の人、受け渡しが遅いけど、いつも通り送っちゃえ 水こぼしちゃったけど まあいいか

TCPのイメージ(1) TCPはテキトウな部分を補う データの到達保証(信頼性確保) ネットワーク混雑の回避(輻輳制御) 返ってくるバケツが足りないな・・・ ・再送しないと ・少し送る頻度を控えよう

TCPのイメージ(2) コネクション型 初めに信頼関係をガッチリ作っておく 今からバケツを送るけどいい? いいよー、自分も今からバケツを送るけどいい? いいよー

もっと詳しく見てみよう 以下の手順で話します コネクション確立 信頼性確保をするには 効率良く送信するには 輻輳制御するには コネクション切断

1.コネクション確立 スリーウェイハンドシェイク SYN SYN+ACK ACK 今からコネクション確立するよ? 了解、自分からも確立するよ? いいよー SYN SYN+ACK ACK

データの分割 セグメント データはMSSのサイズで分割されます 3000 1000 1000 1000 MSS: Maximum Segment Size 例えば MSS = 1000 だとすると... 元のデータ 3000 分割された データ 1000 1000 1000 セグメント

シーケンス番号 分割されたデータ(TCPセグメント)に識別するために,ユニークな番号を割り当てます 初期値を例えば10000とすると 10001 11000 11001 12000 12001 13000

1.コネクション確立 スリーウェイハンドシェイク時に,初期シーケンス番号,ACK番号,MSS長を交換する SYN SYN+ACK ACK Seq No. Ack No. MSS 10000 1000 SYN+ACK Seq No. Ack No. MSS 20000 10001 1000 ACK Seq No. Ack No. MSS 10001 20001 1000

× 2.信頼性確保をするには データ 1000 データ 1000 データ 1000 データ 1000 1000 20001 10001 MSS Ack No. Seq No. データ 1000 1000 11001 20000 MSS Ack No. Seq No. × 1000 20001 11001 MSS Ack No. Seq No. データ 1000 1000 20001 12001 MSS Ack No. Seq No. データ 1000 1000 11001 20000 MSS Ack No. Seq No. 1000 20001 11001 MSS Ack No. Seq No. データ 1000

3.効率良く送信するには 毎回ACKを待っているのは効率悪い! まとめて送っちゃおう データ 1000 データ 1000 データ 1000 20001 10001 MSS Ack No. Seq No. データ 1000 1000 20001 11001 MSS Ack No. Seq No. データ 1000 1000 20001 12001 MSS Ack No. Seq No. データ 1000 1000 11001 20000 MSS Ack No. Seq No.

ウィンドウ セグメントのどの部分を送るか 送信に成功したらウィンドウをずらす →スライディングウィンドウ ウィンドウ

3.効率良く送信するには ウィンドウ 効率よく送信する=ウィンドウを大きくする ただし,単にウィンドウを大きくしてもダメ 輻輳(ふくそう)が発生する 送信相手の限界を超える可能性がある 最大ウィンドウサイズをスリーウェイハンドシェイクに,現在の利用可能ウィンドウサイズをACKに含める ウィンドウ

出典: 3 Minutes Networking 4.輻輳制御するには 一般的なアルゴリズム (AIMD) ウィンドウサイズを倍々に大きくする ある程度の閾値で少しずつ大きくする 輻輳が起きたらウィンドウを半分にする 出典: 3 Minutes Networking

5.コネクション切断 最後も礼儀正しく FIN ACK FIN ACK もうコネクションを切るよ? 了解 自分からもコネクションを切るよ? いいよー FIN ACK FIN ACK

TCPヘッダ 20バイトで構成される

ネットワークの中身を覗こう

ネットワークの中身を覗く ソフトウェアといえば 09:51:42.562095 localhost.miteksys-lm > localhost.echo: P 1:7(6) ack 1 win 57344 (DF) [tos 0x10] 4510 0042 5c5a 4000 4006 e049 7f00 0001 7f00 0001 05ca 0007 0248 8030 0249 a535 a018 e000 85de 0000 0101 080a 0001 5ffd 0001 5fea 0101 0b06 0000 0229 7465 7374 0d0a 09:51:42.562533 localhost.echo > localhost.miteksys-lm: P 1:23(22) ack 7 win 57344 (DF) 4500 0052 5c5b 4000 4006 e048 7f00 0001 7f00 0001 0007 05ca 0249 a535 0248 8036 a018 e000 b4ad 0000 0101 080a 0001 5ffd 0001 5ffd 0101 0b06 0000 022a 6f72 6967 696e 616c 2065 6368 6f64 3a20 7465 7374 09:51:42.568522 localhost.miteksys-lm > localhost.echo: . ack 23 win 57322 (DF) [tos 0x10] 4510 003c 5c5c 4000 4006 e04d 7f00 0001 7f00 0001 05ca 0007 0248 8036 0249 a54b a010 dfea 7ab7 0000 0101 080a 0001 5ffd 0001 5ffd 0101 0b06 0000 0229 tcpdump Ethereal 3D-tcpdump

自作ネットワーク監視ツール 自分で簡単に作成することが出来ます 今日はWindows上で作成してみましょう 必要なもの UNIX系OSならもっと簡単にできます 必要なもの WinPcap http://www.winpcap.org/install/default.htm Cygwin + gcc (C言語コンパイラ) http://www.cygwin.com/

今日の授業のURL ここからも情報を参照できます http://www.ht.sfc.keio.ac.jp/~ichiriki/kg-tutorial2006f-wiki/

今日の目標 サンプルプログラムに下記の改造を加えよう Ehternetフレームを16進表示しよう IPの送信元・送信先アドレスを表示しよう pingを受け取ったら “Hello, ping world” と表示しよう HTTPのGETリクエストだったら, “HTTP DATA” と表示しよう (発展編)自分でパケットを組み立てて送信しよう

1.Ethernetフレームを16進表示しよう 122行目の pkt_data に取得したネットワークのデータが入っています 構造 pkt_data Ethernet ヘッダ IPヘッダ TCPヘッダ ペイロード

1.Ethernetフレームを16進表示しよう header->len で参照できます 表示するには printf(“%2X”, pkt_data[0]) とすると最初の1バイトを表示できます あとはフレームのサイズ分を繰り返すだけ

1.Ethernetフレームを16進表示しよう 16進表示する関数 void hexdump(unsigned char *p, int count) { int i, j; for(i = 0; i < count; i += 16) { printf("%04x : ", i); for (j = 0; j < 16 && i + j < count; j++) printf("%2.2x ", p[i + j]); for (; j < 16; j++) { printf(" "); } printf(": "); for (j = 0; j < 16 && i + j < count; j++) { char c = toascii(p[i + j]); printf("%c", isalnum(c) ? c : '.'); printf("\n\n");

2. IPの送信元・送信先アドレスを表示しよう struct ip *ip = (struct ip_header *) (pkt_data + sizeof(struct eth_header)); pkt_data Ethernet ヘッダ IPヘッダ TCPヘッダ ペイロード

2. IPの送信元・送信先アドレスを表示しよう ip->src IPの送信先アドレスを取得するには ip->dst でも,このアドレスはバイナリ表現(32ビットの整数)

2. IPの送信元・送信先アドレスを表示しよう 表示例 winsock2 のinet_ntoa を利用する方法もあります そっちの方が一般的かも? printf("SRC %d.%d.%d.%d DST %d.%d.%d.%d\n", ip->src.a, ip->src.b, ip->src.c, ip->src.d, ip->dst.a, ip->dst.b, ip->dst.c, ip->dst.d );

3. pingを受け取ったら “Hello, ping world” と表示しよう IPパケットがICMPかどうかを参照するには ip->protocol を見ます ICMPなら1 TCPなら6 UDPなら17

3. pingを受け取ったら “Hello, ping world” と表示しよう 解答例 if (ip->protocol == ICMP){ printf("Hello, ping world!\n");

4. HTTPのGETリクエストだったら, “HTTP DATA” と表示しよう この問題文はつまり トランスポートプロトコルがTCPであること ポートが80番であること ペイロードの最初の3文字が“GET”であること

4. HTTPのGETリクエストだったら, “HTTP DATA” と表示しよう IPパケットがICMPかどうかを参照するには ip->protocol を見ます ICMPなら1 TCPなら6 UDPなら17

4. HTTPのGETリクエストだったら, “HTTP DATA” と表示しよう TCPの定義 struct tcp_header{ short int Port[2]; unsigned int Squence; unsigned int Ack; u_char Offset; u_char FLG; short int Window; short int CheckSum; short int Urgent; unsigned char Option; };

4. HTTPのGETリクエストだったら, “HTTP DATA” と表示しよう TCPヘッダを取得するには 送信先ポートを参照するには Port[1] struct tcp_header *tcp = (struct tcp_header *) (pkt_data + sizeof(struct eth_header) + sizeof(struct ip_header)); pkt_data Ethernet ヘッダ IPヘッダ TCPヘッダ ペイロード

4. HTTPのGETリクエストだったら, “HTTP DATA” と表示しよう ペイロードを取得するには 最初の3文字がGETであるかを確認するには strncmp を使いましょう struct u_char *payload = (u_char *) (pkt_data + sizeof(struct eth_header) + sizeof(struct ip_header) + sizeof(struct tcp_header)); pkt_data Ethernet ヘッダ IPヘッダ TCPヘッダ ペイロード

5.(発展編)自分でパケットを組み立てて送信しよう ここを参考に... http://dog.tele.jp/winpcap/html/group__wpcap__tut8.html pcap_sendpacket 関数を使います ヘンテコなEthernetフレーム・IPパケットも簡単に作れます 悪用厳禁!