4

2 つの TCP エンドポイント間で確立された TCP 接続を考えてみましょう。そのうちの 1 つは次のいずれかを呼び出します。

  1. close(): ここでは、これ以上の読み取りまたは書き込みは許可されていません。

  2. shutdown(fd, SHUT_WR): これにより、全二重接続がシンプレックス接続に変換されます。この場合、エンドポイントの呼び出しSHUT_WRは引き続き読み取ることができます。

ただし、どちらの場合も、FIN パケットがワイヤ上でピア エンドポイントに送信されます。問題は、FIN を受信する TCP エンドポイントが、他のエンドポイントがclose()またはを使用したかどうかをどのように区別できるかというSHUT_WRことです。後者のシナリオでは、まだデータを送信できるはずだからです。

4

1 に答える 1

2

基本的に、答えはそうではありません。 または、一般的な唯一の方法は、何らかのデータを送信して、ACK または RST の応答を受信するかどうかを確認することです。

もちろん、アプリケーション プロトコルは、これ以上データを受信したくないことを事前に示すために、接続の一方の側に何らかのメカニズムを提供する場合があります。しかし、TCP 自体にはそのようなメカニズムはありません。

于 2013-01-12T12:31:30.727 に答える