2013-04-28 7 views
15

TCP 3ウェイハンドシェイクでは、3つのセグメントが送信されます(SYN、SYN ACK、ACK)。 3番目のセグメント(ACK)が失われたらどうなりますか?送信者はセグメントを再送するか、接続を確立することを諦めますか? 2人のホストは、セグメントが失われていることをどのように知っていますか?TCPハンドシェイクセグメントが失われた場合はどうなりますか?

+1

https://tools.ietf.org/rfc/rfc793.txtは何が起こるかを説明します。 –

+0

@EdHeal:特定の部分を指すことができますか? – skrtbhtngr

答えて

16

TCPはすべてのパケットにシーケンス番号を持っています。したがって、パケットが失われたかどうかを知ることは簡単です。ホストがパケット上でACKを受け取らない場合、ホストはただそれを再送します。

しかし、ほとんどの場合、そのACKが失われたとしても、非常に簡単な理由で再送はありません。 ACKの直後に、TCPプロトコルを開いたホストがデータの送信を開始する可能性があります。そのデータはすべてのTCPパケットと同様にACK番号を持つので、受信者はそのようにACKを得るでしょう。したがって、SYN-ACKの送信者は、次のパッケージで「暗黙の」ACKを取得するため、ACKを受け取っていないことを合理的に気にする必要はありません。

SYN-ACKの再送は、データが全く受信されていない場合にのみ必要です。

更新:

たちのSYNが(この 入って来るセグメントでおそらく)認められている場合は、着信セグメントの優先レベル必要 試合:私はまさにこれを指定したRFCで場所を見つけたリセットされていない場合は、ローカルの優先レベルを正確に設定してください。 を送信する必要があります。

つまり、ACKが破棄されたにもかかわらず、次のパケットが破棄されない場合、すべて正常です。それ以外の場合は、接続をリセットする必要があります。それは完璧な意味合いがあります。

+2

ハンドシェイクの最終的なACK自体はACKではありません。 –

+8

ACKを確認すると、実際のデータの送信が不可能になります。 –

+0

私はポイントを得た。ありがとうございました! – ZHOU

1

私はこの特定の状況について専門家ではありませんが、クライアントが接続されているとは思うが、サーバーはそうではないと思われます。クライアントがサーバーにデータを送信しようとすると、サーバーはそれを拒否し、RSTパケットをクライアントに送信して、「接続」をリセットします。

+0

サーバは、SYN-ACKを送信するときに確立された接続を認識します。しかし、これは実装の詳細かもしれない、私はこの場合に何をすべきかについての実際の仕様を見つけていない。たぶんそこには何もない。 –

+0

@LennartRegebro:[RFC 793 Section 3.4](http://tools.ietf.org/html/rfc793#section-3.4)によると、サーバは最終的なACKを受け取るまで、「ESTABLISHED」状態に入らない。 'SYN + ACK 'を送信すると、' SYN-RECEIVED'状態になります。クライアントは 'SYN + ACK 'を受信すると' ESTABLISHED'状態に入ります。 –

+3

見つけた: "私達のSYNが(おそらくこの入って来るセグメントの)承認されているならば、リセットが送られなければならない場合、着信セグメントの優先順位レベルは がローカル優先レベルと正確に一致しなければなりません。言い換えると、ACKと* only * ACKが破棄された場合、接続が確立されます。より多くのものが落とされれば、リセットがあります。 " –

関連する問題