【Wireshark】TCP解析(Retransmission/Dup ACK など)

ネットワーク遅延などの調査で、TCPのパケットキャプチャをした際に、黒背景、赤字で TCP RetransmissionTCP Dup Ack などの出力を見かけることがあります。
これらは、WiresharkがTCP通信のシーケンスを追跡し、再送など、なんらかの注意が必要な際に出力されます。
この記事では、TCPシーケンスの考え方と、Wiresharkの代表的な出力内容の意味を確認していきます。
スポンサーリンク

TCPシーケンスの考え方

TCPでは、途中でデータが欠けることなく、確実に宛先へ届けるため、シーケンス番号(SEQ)確認応答番号(ACK)を使って、やりとりをします。
SEQACKには、下記の関係式があります。TCPセグメントとは、TCPのデータ部分で、このデータ部分のサイズに、シーケンス番号(SEQ)を加えると、確認応答番号(ACK)になります。

TCPセグメントを図示すると、下記の緑色になります。

送信者は、データ送信時に初期値のシーケンス番号(SEQ)を割り当て、送信するTCPセグメント長(LEN)と合わせて、受信者へ伝えます。
受信者はそのデータを受け取ると、シーケンス番号(SEQ)とTCPセグメント長(LEN)を加えた値を確認応答番号(ACK)として応答します。
例えば、シーケンス番号(SEQ)0とし(初期値はなんでもよい)、TCPセグメント100Byteのデータを送信したとします。
その通信を受け取った受信者は、確認応答番号(ACK)100 (0+100)として応答します。

送信者は、次にデータを送信する際は、受け取った確認応答番号(ACK)をシーケンス番号(SEQ)にして送信します。
下記は、ACK=100を受け取った送信者が、受信者に対して、さらにTCPセグメント200Byteのデータを送信したものとします。
その通信を受け取った受信者は、確認応答番号(ACK)300 (100+200)として応答します。

TCPシーケンスは、下記のサイトも参考にしてください。

  >> 参考記事 :  【TCP】シーケンス番号とACK番号について解説

【TCP】シーケンス番号とACK番号について解説
TCP通信では、シーケンス番号と確認応答(ACK)番号を使用して、データバイトのやり取りします。 シーケンス番号は、TCPデータセグメントを正しい順番で並び替えることができるよう、追跡する数字で、ACK番号は、接続先にどこからのデータを要求...
スポンサーリンク

TCP再送(TCP Retransmission)

TCP再送を意味し、期待したACK番号のパケットを受信していない場合に発生します。例えば、送信者が”Seq=100 、Len=200“のデータを送信すると、送信者は受信者からACK=300の応答があることを期待して、待機します

送信者からのデータがドロップした等で、受信者からのACK=300のレスポンスが来ない場合に、送信者は同じパケットを再送信します。このパケットがTCP Retransmissionとして記録されます。

再送タイムアウトRTO:Retransmission Time Out)までに期待したACKが返ってこないと、再送します。RTOは、パケットを送信してからACKを受信するまでの往復時間RTT:Round Trip Time)により決定されます。RTTの算出方法は、OSなどにより異なります。

実際にTCP RetransmissionのパケットのTCP Analysis Flagsを見ると、再送された際のRTOが確認できます。

スポンサーリンク

重複ACK(TCP Dup Ack)

受信者が期待したシーケンス番号のパケットを受信していない場合に発生します。
例えば、受信者がAck=300をレスポンスすると、受信者は送信者からSeq=300のパケットが来ることを期待して、待機します

このときに、送信者からSeq=500のパケットが来たとします。受信者は、Seq =300のパケットが消失したと考え、Ack=300のパケットを再送します。これが、重複Ack(TCP Dup Ack)です。

スポンサーリンク

TCP高速再送(TCP Fast Retransmission)

TCPの再送はRTO(再送タイムアウト)を経過して、期待したACKのパケットが届かない場合に、再送します。
ただし、送信者が重複Ackを3回以上受信すると、RTOを待たずに、再送します。これが、TCP高速再送(TCP Fast Retransmission)です。

スポンサーリンク

TCPスプリアス再送信(TCP Spurious Retransmission)

受信者側ですでにACK応答された通信に対して、送信者側が再送している通信は、TCP Spurious Retransmission と表示されます。
下記の例では、受信者はACK=300 を応答していますが、送信者は、Seq=100, Len=200を送信しています。

受信者からのACKが送信者に届いていない受信者からのACKが届く前に、送信者がTCP再送した などが考えられます。

コメント