「もしも、TCP/IPがストライキを起こしたら、世界は金縛りにあうだろう」
(アルベルト・クリストフ 1428年)
という偽引用がそれらしく聞こえる程、世界中の情報を伝えているプロトコル、TCP。大抵の人は、知らず知らずのうちに一日何十回と接続を確立しては切断しています(Webやメールを使うたび)。
今回は、このTCPの接続に注目してみたいと思います。
まず、TCPは接続の際に「SYNパケット」と「ACKパケット」という電文をお互いに投げ合ってます。SYNが「接続させて〜」、ACKが「いいよ〜」みたいな感じ。
Client Server
| syn(c) |
|-------------------->>|
| syn(s) + ack(c) |
|<<--------------------|
| ack(s) |
|-------------------->>|
大抵のプログラムでは、標準ライブラリとして用意されている便利なインターフェースを通じて、3way handshakeを意識することなく、接続を確立させます。C言語であればconnect()で一発。PerlであればIO::Socket::INET->new()。RubyだとTCPSocket.newとかでしょうか。
さて、tcpdumpなどのパケットモニターを使うと接続時の3way handshakeの動きが良くわかります。
サーバー側
$ ruby -rsocket -e 'TCPServer.new("0.0.0.0", 4321).accept'
$ telnet 127.0.0.1 4321
$ sudo tcpdump -i lo0 -s 4096 -nX tcp port 4321
23:48:24.605423 IP 127.0.0.1.64686 > 127.0.0.1.4321: S 3609819251:3609819251(0) win 65535
0x0000: 4510 0040 9b7c 4000 4006 a129 7f00 0001 E..@.|@.@..)....
0x0010: 7f00 0001 fcae 10e1 d729 7873 0000 0000 .........)xs....
0x0020: b002 ffff 7fc5 0000 0204 3fd8 0103 0301 ..........?.....
0x0030: 0101 080a cea0 5347 0000 0000 0402 0000 ......SG........
23:48:24.605532 IP 127.0.0.1.4321 > 127.0.0.1.64686: S 4197038158:4197038158(0) ack 3609819252 win 65535
0x0000: 4500 0040 9b7d 4000 4006 a138 7f00 0001 E..@.}@.@..8....
0x0010: 7f00 0001 10e1 fcae fa29 b84e d729 7874 .........).N.)xt
0x0020: b012 ffff ab53 0000 0204 3fd8 0103 0301 .....S....?.....
0x0030: 0101 080a cea0 5347 cea0 5347 0402 0000 ......SG..SG....
23:48:24.605580 IP 127.0.0.1.64686 > 127.0.0.1.4321: . ack 1 win 35840
0x0000: 4510 0034 9b7e 4000 4006 a133 7f00 0001 E..4.~@.@..3....
0x0010: 7f00 0001 fcae 10e1 d729 7874 fa29 b84f .........)xt.).O
0x0020: 8010 8c00 9942 0000 0101 080a cea0 5347 .....B........SG
0x0030: cea0 5347
そしてもう一つ。それぞれ、4行程度の16進数ダンプがついていますが、これがSYN/ACKパケットの全てです。たったの40バイトです。
この程度だったらconnect()に頼らず地力で出来そうじゃないですか?3way handshake。
ということで頑張ってみることにしました。次回。
Techno Exchange
DELL連載第4回 〜「Microsoft System Center」
ZDNet Japan ホスティング特集
ZDNet Japan Green IT
契約してわかった、iPhoneのさまざまな注意事項
フォトレポート:USIMカードはどこに?--「iPhone」開封の儀
iPhone 3G、発売前夜から祭りのあとまで