通信のしくみ(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/IPシーケンス キャプチャデータを図示したものが左図になる。

TCP通信は、SYNパケット--->SYN+ACKパケット--->ACKパケットで接続を確立する。 片方向の接続確立を、クライアント側からとサーバ側からそれぞれ実施する。

通信の終了は、FINパケット--->ACKパケットで行う。 終了処理も、クライアント側からとサーバ側からそれぞれ実施する。

データパケットは、シーケンス番号とACK番号を持つ。 シーケンス番号は「何番目のデータから送ってますよー」という意味(だと思う)。 実際のデータを持たないACKパケットは、シーケンス番号を持たない。 ACK番号は、「次は何番のデータから送ってねー」ということを相手に伝えている。 クライアントまたはホストが送信するシーケンス番号は、前回受信したパケットのACK番号と同じになる。

シーケンス番号が4行目で1にリセットされているように見える。 これは、接続が確立したあとのシーケンス番号を、SYNパケットが持つシーケンス番号からの相対値で表示しているため。 実際は通しのシーケンス番号を使って、通信を行っている。

TCP状態遷移図

参考:RFC793 Transmission Control Protocol

TCP状態遷移図


[サーバの実験室 基礎]