通信のしくみ(TCP/IP)
作成 : 2002/10/12
TCP/IP
インターネットの通信はTCP/IPプロトコル群を用いて行われ、TCP(RFC793)はOSI参照モデルのトランスポート層、IP(RFC791)はネットワーク層にあたる。 ....と書いていくとはまりそうなので、やめる。 RFCはhttp://www.faqs.org/rfcs/あたりを見てね。
ここでは、tcpdumpコマンドを使用して、サーバ・クライアント間でのパケットのやりとりを確認してみる。
tcpdumpコマンド
tcpdumpを使用すると、ネットワークに流れるパケットをキャプチャすることができる。 オプションをつけないとデータが膨大になってしまうので、ホストやポートを指定して、対象となるパケットを絞り込む。
ホストAとのパケットを対象とするには、次のようにする。
# tcpdump host A
任意のホストのポート80番とのパケットを対象とするには、次のようにする。
# tcpdump port 80
「and」を使うと、論理積で条件を指定することができる。 次の例は、ホストAのポート80番とのパケットを対象としている。
# tcpdump host A and port 80
「or」を使うと、論理和で条件を指定することができる。 次の例は、ポート20番もしくはポート21番とのパケットを対象としている。
# tcpdump port 20 and port 21
オプションとして「-x」を指定すると、パケットを16進でダンプする。
# tcpdump -x
192.168.1.X.1124 > www.goo.ne.jp.http: S 584059030:584059030(0) win 5840 <mss 1460,sackOK,timestamp 29031906 0,nop,wscale 0> (DF) [tos 0x10] www.goo.ne.jp.http > 192.168.1.X.1124: S 2866452602:2866452602(0) ack 584059031 win 8472 <mss 1412> (DF) 192.168.1.X.1124 > www.goo.ne.jp.http: . ack 1 win 5840 (DF) [tos 0x10] 192.168.1.X.1124 > www.goo.ne.jp.http: P 1:17(16) ack 1 win 5840 (DF) [tos 0x10]
オプションとして「-X」を指定すると、パケットを16進でダンプするとともに、ASCII変換した結果も表示する。
# tcpdump -X
192.168.1.X.1159 > www.goo.ne.jp.http: S 136122613:136122613(0) win 5840 <mss 1460,sackOK,timestamp 36720523 0,nop,wscale 0> (DF) [tos 0x10]
0x0000 4510 003c 5f7e 4000 4006 2dc7 c0a8 01XX E..<_~@.@.-.....
0x0010 d296 1925 0487 0050 081d 10f5 0000 0000 ...%...P........
0x0020 a002 16d0 142c 0000 0204 05b4 0402 080a .....,..........
0x0030 0230 4f8b 0000 0000 0103 0300 .0O.........
www.goo.ne.jp.http > 192.168.1.X.1159: S 1410913123:1410913123(0) ack 136122614 win 8472 <mss 1412> (DF)
0x0000 4500 002c b839 4000 7606 9f2b d296 1925 E..,.9@.v..+...%
0x0010 c0a8 01XX 0050 0487 5418 d363 081d 10f6 .....P..T..c....
0x0020 6012 2118 8461 0000 0204 0584 0000 `.!..a........
192.168.1.X.1159 > www.goo.ne.jp.http: . ack 1 win 5840 (DF) [tos 0x10]
0x0000 4510 0028 5f7f 4000 4006 2dda c0a8 01XX E..(_.@.@.-.....
0x0010 d296 1925 0487 0050 081d 10f6 5418 d364 ...%...P....T..d
0x0020 5010 16d0 a636 0000 P....6..
192.168.1.X.1159 > www.goo.ne.jp.http: P 1:17(16) ack 1 win 5840 (DF) [tos 0x10]
0x0000 4510 0038 5f80 4000 4006 2dc9 c0a8 01XX E..8_.@.@.-.....
0x0010 d296 1925 0487 0050 081d 10f6 5418 d364 ...%...P....T..d
0x0020 5018 16d0 d488 0000 4745 5420 2f20 4854 P.......GET./.HT
0x0030 5450 2f31 2e30 0d0a TP/1.0..
サーバとクライアントの通信
クライアントからWEBサーバ「www.goo.ne.jp」へHTTP接続したときのパケットを、tcpdumpでキャプチャしてみる。
# tcpdump host www.goo.ne.jp 192.168.1.X.1124 > www.goo.ne.jp.http: S 584059030:584059030(0) win 5840 <mss 1460,sackOK,timestamp 29031906 0,nop,wscale 0> (DF) [tos 0x10] www.goo.ne.jp.http > 192.168.1.X.1124: S 2866452602:2866452602(0) ack 584059031 win 8472 <mss 1412> (DF) 192.168.1.X.1124 > www.goo.ne.jp.http: . ack 1 win 5840 (DF) [tos 0x10] 192.168.1.X.1124 > www.goo.ne.jp.http: P 1:17(16) ack 1 win 5840 (DF) [tos 0x10] www.goo.ne.jp.http > 192.168.1.X.1124: . ack 17 win 8456 (DF) 192.168.1.X.1124 > www.goo.ne.jp.http: P 17:19(2) ack 1 win 5840 (DF) [tos 0x10] www.goo.ne.jp.http > 192.168.1.X.1124: . 1:1413(1412) ack 19 win 8454 (DF) .... www.goo.ne.jp.http > 192.168.1.X.1124: FP 35301:35433(132) ack 19 win 8454 (DF) 192.168.1.X.1124 > www.goo.ne.jp.http: . ack 35434 win 57892 (DF) [tos 0x10] 192.168.1.X.1124 > www.goo.ne.jp.http: F 19:19(0) ack 35434 win 57892 (DF) [tos 0x10] www.goo.ne.jp.http > 192.168.1.X.1124: . ack 20 win 8454 (DF) ソース.ポート > デスティネーション.ポート フラグ シーケンス番号:シーケンス番号(データ長) ack番号 その他 フラグは「S」はSYN、「F」はFIN、「P」はPUSHを示す
WEBサーバにアクセスするときに使用するポートは、クライアント・サーバともに80番ポートを使用するわけではない。 クライアントは1025番以上の任意のポートから、サーバの80番ポートにアクセスする。
キャプチャデータを図示したものが左図になる。
TCP通信は、SYNパケット--->SYN+ACKパケット--->ACKパケットで接続を確立する。 片方向の接続確立を、クライアント側からとサーバ側からそれぞれ実施する。
通信の終了は、FINパケット--->ACKパケットで行う。 終了処理も、クライアント側からとサーバ側からそれぞれ実施する。
データパケットは、シーケンス番号とACK番号を持つ。 シーケンス番号は「何番目のデータから送ってますよー」という意味(だと思う)。 実際のデータを持たないACKパケットは、シーケンス番号を持たない。 ACK番号は、「次は何番のデータから送ってねー」ということを相手に伝えている。 クライアントまたはホストが送信するシーケンス番号は、前回受信したパケットのACK番号と同じになる。
シーケンス番号が4行目で1にリセットされているように見える。 これは、接続が確立したあとのシーケンス番号を、SYNパケットが持つシーケンス番号からの相対値で表示しているため。 実際は通しのシーケンス番号を使って、通信を行っている。
TCP状態遷移図
参考:RFC793 Transmission Control Protocol