TCP再送(TCP Retransmission)
送信したパケットに対するACKが返ってこないとき、TCPが同じデータを再度送信する仕組みである。
再送
RTO(再送タイマ)
この時間内にACKが返らなければ再送する、RTTの推定値から計算されるTCPの再送タイマである。
TCPタイムスタンプオプション
TCPヘッダーに付く、種別8・長さ10バイトのオプションで、RTTM(RTT測定)とPAWS(シーケンス番号一周対策)のために送信側の時刻値TSvalとその応答TSecrを運ぶ仕組みである。
RFC1323タイムスタンプ
パケットロス
送信されたパケットが途中の経路で失われ、受信側に届かなくなる現象である。
パケット損失
RTT(往復時間)
送ってからACKが返るまでの往復時間である。
断続的な数秒間の通信停止
平均では速いのに、まれに数秒単位で応答が止まる通信症状で、多くはアプリの停止ではなくTCPの再送待ちが原因になる。
まれに数秒止まる通信
秒単位の停止
Wireshark
キャプチャしたパケットをパケット詳細ペインとバイト列ペインで対応づけて表示できる、パケット解析ツール。
RTTM(往復時間測定)
TCPタイムスタンプオプションの目的の1つで、TSvalとTSecrの往復によりRTTをより細かく正確に測る仕組みである。
PAWS(シーケンス番号一周対策)
TCPタイムスタンプオプションのもう1つの目的で、シーケンス番号が一周してしまう事故を防ぐ仕組みである。
Karnのアルゴリズム
再送したセグメントに対するACKはどちらの送信への応答か分からないため、そこからRTTサンプルを取ってはいけないとする規則である。
再送時のRTT測定の曖昧さ
再送が入ると、ACKが最初の送信に対するものか再送に対するものか区別できなくなる問題である。
再送時の曖昧さ
fast retransmit(高速再送)
同じシーケンス番号を指すDuplicate ACKが一定数(Windowsの既定では3つ)たまったら、RTOの満了を待たずに再送する仕組みである。
Duplicate ACK(重複ACK)
同じシーケンス番号を指すACKが重複して返ることで、途中に抜けがある合図となるものである。
TCPの3-way handshake
SYN・SYN-ACK・ACKの3つのパケットでコネクションを確立するTCPの接続開始手順で、タイムスタンプなどのTCPオプションもここで交渉される。
WindowsのTCPタイムスタンプ設定
netsh interface tcp、PowerShellのSet-NetTCPSetting、レジストリのTcp1323Optsのいずれかで行う、WindowsのTCPタイムスタンプオプションの有効化設定である。
netsh interface tcp set global timestamps
途中でパケットが失われるとACKが返らず、送信側はRTOの満了後に再送する
ACKが来ない場合、送信側は再送タイマ(RTO)の満了を待ってから再送する(ただしDuplicate ACKが十分にたまればRTOの満了を待たずfast retransmitで再送されることもあり、TCP再送のすべてがRTO満了を前提とするわけではない)
RTOはRTTの推定値をもとに計算される
初期RTOは1秒が基準で、タイムアウトが起きるたびに倍化するため、条件が悪いと数秒単位の停止に見える
Time delta from previous displayed packetとRetransmission表示で、停止時間がRTOの待ち方と噛み合うかを確認できる
tcp.analysis.retransmissionなどの表示フィルタと、Bad TCP色分けの行で再送パケットを識別できる
tcp.analysis.lost_segmentという表示フィルタでロスを確認できる
TCPのtimestamps optionはRTTM(往復時間測定)の実現に使われる
同じtimestamps optionはPAWS(シーケンス番号一周対策)にも使われる
再送されたセグメントからはRTTサンプルを取らないことで、どちらの送信へのACKか分からないという曖昧さの影響を避ける
ACKに入るTSecrを見ればどのTSvalを持つセグメントへの応答かを識別できるため、再送時のRTT測定の曖昧さを外せる
再送を含む場面でもRTTの見積もりを更新しやすくなり、RTOが古いまま保守的に残る時間を抑えられる場合があるが、パケットロス自体を消す仕組みではない
Duplicate ACKを3つ集められればRTOの満了を待たずに再送できるが、未ACKデータの少ない小さなrequest/response通信では十分に集まらず、RTO待ちが表に出やすい
fast retransmitは、同じシーケンス番号を指すDuplicate ACKが一定数たまることをトリガーにする
途中に抜け(ロス)があると、受信側は同じシーケンス番号を指す重複ACKを返す。ただし重複ACKはロス以外にパケットの順序入れ替えや重複でも発生するため、ロスは重複ACKの原因の一つである
timestamps optionはTCP接続の3-way handshake(SYN/SYN-ACK/ACK)で交渉されるため、既に張られている接続には効かず、新規接続からしか使われない
Windows環境では、netsh interface tcp set global timestamps=enabled、PowerShellのSet-NetTCPSetting -Timestamps Enabled、レジストリのTcp1323Optsのいずれかで設定できる。Linux等ではsysctlなど別の設定手段になる
設定が効いているかは、設定値そのものより、SYN/SYN-ACKの実パケットにTSoptが乗っているかをWiresharkで確認するほうが確実
バックオフしたRTOは新しいRTT測定が得られると元に戻るが、Karnのアルゴリズムにより再送したセグメントからはその測定を得られない