TCPコネクション〜3wayハンドシェイクとTCP FIN〜

TCPのコネクションは、3wayハンドシェイクにより始まります

3wayハンドシェイク時には、TCPのペイロードにはデータは一切入りません。この3wayハンドシェイクが終わってから、TCPのペイロードに上位レイヤの情報(例えばhttp)のデータやり取りが開始されます。

TCPコネクションを開始する(SYNを最初に送信する)ホストをクライアント、TCPコネクションを受ける(SYNを最初に受信する)ホストをサーバと言います。

以下に、TCPコネクションのサンプルを示します。

スポンサーリンク
スポンサーリンク

TCPのデータ送信

TCPはデータを信頼性は、シーケンス番号と応答確認番号で実装されます。

データが欠けている場合、再送をしますが、再送タイマのタイムアウト時間(RTO: Retransmission TimeOut)はRTT値を元に計算されます。

スポンサーリンク

RTT値は、データを送ってからackが戻ってくるまでの時間のことで、Windowサイズ毎に1パケットだけサンプリングされます。

さらにこのRTT値はSmooth RTT(SRTT)値の計算に用いられます。SRTT値の計算式は以下の通りです。

SRTT(new) = α * SRTT(old) + (1-α) * RTT

αは0.9が推奨されています。

また、RTOは以下の式が利用されています。

RTO = SRTT + 4 * (平均偏差)

TCPコネクションの終了

TCPのコネクションは、ハーフクローズという方法で終了されます。つまり、片方ずつコネクションを切断します。

コネクションを切断したいほうは、FIN bitをセットしてTCPセグメントを相手に贈ります。 最初にFINを出す側をActive Closeといいます。

一方、FIN を受け取った側はACK bitとともにFIN bitをセットしてTCPセグメントを送信します。 後にFINを出す側をPassive Closeといいます。

Active Closeはどちらから行なっても良いことになっていますが、大抵の場合、クライアントがActive Closeすることになります。(アプリケーションでのソケットAPIの使い方次第です)

なお、『FINを受け取った側はまずACK bitをセットしたTCPセグメントを送り、一定待ち時間を待った後にFIN bitをセットしたTCPセグメントを送る』という実装もありますが、上記のようにACKとFINを一緒にしてしまう実装もあります。このあたりはアプリケーションでどのように実装しているかに依存します。

TCP/UDP の勉強については、以下の書籍がお薦めです。

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク