自力で3way handshake

こまつ みつのり(Mitsunori Komatsu) 2008-02-08 12:46:08

 

「もしも、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。

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

※このエントリはZDNetブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet編集部の見解・意向を示すものではありません。

SpecialPR

  • 【3/31まで早期割引受付中!】「IBM Watson Summit 2017」開催

    日本IBMが主催する最大の国内総合イベント。テクノロジー・リーダーの疑問を紐解く「企業IT、セキュリティー、モバイル、データ解析などの進化を探る」詳細はこちらから!

  • デジタル変革か?ゲームセットか?

    デジタルを駆使する破壊的なプレーヤーの出現、既存のビジネスモデルで競争力を持つ
    プレイヤーはデジタル活用による変革が迫られている。これを読めばデジタル変革の全体像がわかる!