TCP 3 ウェイ ハンドシェイクでは、3 つのセグメントが送信されます (SYN、SYN ACK、ACK)。3 番目のセグメント (ACK) が失われた場合はどうなりますか? 送信者はセグメントを再送信するか、接続の確立をあきらめますか? また、セグメントが失われたことを 2 つのホストがどのように認識するのでしょうか。
2 に答える
TCP では、すべてのパケットにシーケンス番号があります。したがって、パケットが失われたかどうかを簡単に知ることができます。ホストがパケットで ACK を取得しない場合、ホストはそれを再送信します。
ただし、ほとんどの場合、たとえその ACK が失われたとしても、非常に単純な理由で再送はありません。ACK の直後に、TCP プロトコルを開いたホストがデータの送信を開始する可能性があります。そのデータには、すべての TCP パケットと同様に ACK 番号があるため、受信者はその方法で ACK を取得します。したがって、SYN-ACK の送信者は、次のパッケージで「暗黙の」ACK を取得するため、ACK を取得しなかったことを合理的に気にする必要はありません。
SYN-ACK の再送信は、データがまったく受信されない場合にのみ必要です。
更新: RFC で正確にこれを指定した場所を見つけました:
SYN が (おそらくこの着信セグメントで) 確認された場合、着信セグメントの優先レベルはローカルの優先レベルと正確に一致する必要があります。そうでない場合は、リセットを送信する必要があります。
つまり、ACK がドロップされても次のパケットがドロップされない場合、すべて問題ありません。それ以外の場合は、接続をリセットする必要があります。これは完全に理にかなっています。
私はこの特定の状況の専門家ではありませんが、クライアントは接続されていると思いますが、サーバーはそうではないのではないかと思います。クライアントがサーバーにデータを送信しようとすると、サーバーはそれを拒否し、「接続」をリセットできるように RST パケットをクライアントに送信します。