ネットワーク遅延などの調査で、TCPのパケットキャプチャをした際に、黒背景、赤字で TCP RetransmissionやTCP Dup Ack などの出力を見かけることがあります。
これらは、WiresharkがTCP通信のシーケンスを追跡し、再送など、なんらかの注意が必要な際に出力されます。
この記事では、TCPシーケンスの考え方と、Wiresharkの代表的な出力内容の意味を確認していきます。
TCPシーケンスの考え方
TCPでは、途中でデータが欠けることなく、確実に宛先へ届けるため、シーケンス番号(SEQ)と確認応答番号(ACK)を使って、やりとりをします。
SEQとACKには、下記の関係式があります。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再送した などが考えられます。
コメント