3

キープアライブ オプションのない TCP 接続で、ワイヤを物理的に切断した場合、FIN/ACK の可能性がない場合、このソケットはすべてのアプリケーション データを喜んで受け入れ、送信バッファに入れ、永遠に送信しようとしますか?

そうでない場合、いつ、どのように停止するか = データの小さなチャンクを送信するアプリケーションにどのエラーが返されるか? Linuxとcについて話します。

ありがとうございました

4

3 に答える 3

5

ソケットが送信中の場合、(1) 最終的に送信バッファがいっぱいになるため、次の送信呼び出しがブロックされ、(2) 最終的に TCP は ACK を受信しないために送信試行がタイムアウトし、接続がリセットされ、次の送信呼び出しにエラー。

于 2013-08-11T23:24:43.483 に答える
1

送信側では、データをクライアントに送信できないため、送信バッファーがいっぱいになります。発信パケット (受信ウィンドウと送信バッファー内の使用可能なスペースによって許可される限り) は、単純に送信バッファーに留まり、TCP はそれらを再送信することになります。

URL: http://linux.die.net/man/2/send

ソケットがブロックされている場合、send()呼び出しは単にブロックされ、アプリケーションはこの呼び出しを待機することになります。ソケットが非ブロッキングの場合、send() 呼び出しは -1 を返し、errno を EAGAIN または EWOULDBLOCK に設定します。

SO_KEEPALIVE を設定することは、確かにそのようなソケットの主なオプションです。さらに、/proc/sys/net/ipv4/ に記載されている tcp_retries1 と tcp_retries2 の値をいじることもできます。tcp_retries2 の制限に達したために送信者が接続を切断すると、次のブロッキング呼び出しで値 -1 が返され、errno が ETIMEDOUT に設定されます。これらのオプションは、ボックスのすべてのソケットにグローバルに適用されることに注意してください。そのため、注意して使用する必要があります。

于 2013-08-11T23:16:46.353 に答える