TCPの信頼性〜再送時間(RTO)と再送回数、チェックサム〜

TCPの信頼性は、前述の通り、シーケンス番号(Seq#)と応答確認番号(Ack#)(で実装されます。

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

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

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

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

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

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

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

なお、WindowsではTCPコネクション時の初期値としてRTO=3秒がセットされ、以降は上記サンプリングが完了したタイミングでRTO値が更新されます。

また、WindowsではTCP再送回数はレジストリにより5回となっています。変更したい場合は以下のように「TcpMaxDataRetransmissions」レジストリを修正します。

  1. Windowsキー+R
  2. regedit [Enter]
  3. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters と辿る
  4. 右ペインで右クリックし、「新規」⇒「DWORD」で左クリック
  5. 名前を「TcpMaxDataRetransmissions」に設定する
  6. 再送回数を10回にしたい場合は16進数ならa、10進数なら10でセットする
  7. 下記のようになったら再起動

チェックサム

データが欠けるパターンとして、データが送られてこない、というパターンと、送られてきたデータが誤っている、というパターンがあります。 送られてきたデータの誤りを検出する仕組みがチェックサムです。

チェックサムの計算方法は、以下の擬似IPヘッダフォーマットを利用します。

チェックサムの対象は擬似IPヘッダとTCPヘッダ(ただしチェックサムのフィールドを0に置き換える)、TCPデータの3つです。 これらを16bit単位に分割し、各々で1の補数を計算し、それらを合計します。さらにその合計値の1の補数を取ることで、 チェックサムに入る16bitが決まります。

TCPであるにもかかわらず、レイヤーの低いIPヘッダも一部ではありますがチェックしていることに注目して下さい。

IPv4では、IPヘッダ自身のチェックサムも行なっており、IPの上にTCPが使われる場合はIPヘッダを重複してチェックをかけていることになります。

IPv6においては、TCPと一緒に使われる機会が多いことと、通信技術の向上により誤り率が低くなったことから、 IPv6ヘッダのチェックサムは無くなりました。その代わり、TCP等のように、上位レイヤーでこれを実施することが望まれます。

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

シェアする

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

フォローする