自力で3way handshake

2008年02月08日 12:46
トラックバック (0)   コメント (0)
「もしも、TCP/IPがストライキを起こしたら、世界は金縛りにあうだろう」
(アルベルト・クリストフ 1428年)

という偽引用がそれらしく聞こえる程、世界中の情報を伝えているプロトコル、TCP。大抵の人は、知らず知らずのうちに一日何十回と接続を確立しては切断しています(Webやメールを使うたび)。


今回は、このTCPの接続に注目してみたいと思います。


まず、TCPは接続の際に「SYNパケット」と「ACKパケット」という電文をお互いに投げ合ってます。SYNが「接続させて〜」、ACKが「いいよ〜」みたいな感じ。


Client Server
| syn(c) |
|-------------------->>|
| syn(s) + ack(c) |
|<<--------------------|
| ack(s) |
|-------------------->>|

この手順は俗に「3way handshake」と呼ばれています。すごくかっこいいですね。名前が。


大抵のプログラムでは、標準ライブラリとして用意されている便利なインターフェースを通じて、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

tcpdumpの結果

$ 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

まず、着目してほしいのは太字になっているSとackの部分です。それぞれSYNとACKを表しています。これ見ると「3way handshakeって本当なんだ!絵空事じゃないんだ!」って感動しませんか?しませんか…


そしてもう一つ。それぞれ、4行程度の16進数ダンプがついていますが、これがSYN/ACKパケットの全てです。たったの40バイトです。


この程度だったらconnect()に頼らず地力で出来そうじゃないですか?3way handshake。


ということで頑張ってみることにしました。次回。

最新エントリー
カテゴリ
月別のアーカイブ
プロフィール
こまつ みつのり(Mitsunori Komatsu)
ブレインハーツ株式会社のプログラマー兼マネージャー。プログラミングからプロジェクト管理、サーバ管理、そして雑用までを器用にこなす。趣味で自作システムトレードプログラムを開発中。
Powered by
 

企画特集

Techno ExchangeTechno Exchange
仮想化技術がグリーンITにもたらすもの
DELL連載第4回 〜「Microsoft System Center」DELL連載第4回 〜「Microsoft System Center」
PowerEdgeサーバに最適な運用管理ソリューション後編
ZDNet Japan ホスティング特集ZDNet Japan ホスティング特集
2008年夏のホスティングサービスのトレンドは何?
ZDNet Japan Green ITZDNet Japan Green IT
サミットだけでは終わらせない!エンタープライズの取り組みはこれからだ!
契約してわかった、iPhoneのさまざまな注意事項
7月11日にソフトバンクモバイルから発売された、アップル製携帯電話「iPhone 3G」。その契約手続きの中で、機種変更時の料金やメールの保存期間など、iPhoneが持つさまざまな注意事項が見えてきた。
フォトレポート:USIMカードはどこに?--「iPhone」開封の儀
ソフトバンクモバイルが7月11日に発売したiPhoneを、編集部が早速入手した。ガジェット恒例の「開封の儀」をお届けする。なお、今回取り上げるのは黒色の8Gバイトモデルだ。
iPhone 3G、発売前夜から祭りのあとまで
iPhone 3Gがついに発売された。ユーザーからの期待は大きく、ソフトバンク表参道、ビックカメラ 有楽町店、ヨドバシカメラマルチメディアAkibaなどの旗艦店舗には多くの人が行列をなした。発売前後の様子を記事とともに振り返る。