0

Linux での send() についての私の理解では、送信プロセスのデータをカーネル バッファーに正常にコピーできる場合、send() は返されます。その後、アプリケーションは自由に移動できます。

  1. これが本当で、TCP がそのパケットを配信できないと言う場合、TCP はどのようにエラーを報告しますか?

  2. 複数の send() の後でエラーを受け取った場合 (最初は Rwnd が大きかった)、アプリケーションはどの特定の send() が失敗したか、つまりどのメッセージが到達できなかったのかをどのように知るのでしょうか?

4

2 に答える 2

3

これが本当で、TCP がそのパケットを配信できないと言う場合、TCP はどのようにエラーを報告しますか?

TCP は、接続が終了するか異常終了するまで、サイレントに再試行/再送信します。

受信したかどうかを知りたい場合は、受信アプリケーションが確認 (アプリケーションレベルのメッセージ) を送信する必要があります。


編集:

TCP プロトコルはエンドツーエンドの ACK を受信します ... しかし、その ACK は TCP スタックによって飲み込まれます: 通常の「ソケット」API を介してアプリケーションに公開されているとは思いません。

パケット スニファは、ACK を確認できるレベルでネットワーク/TCP スタックにフックします。たとえば、TCP パケットが C# で ACK を受信したことを確認する方法を参照してください。... Linux に相当するものはわかりませんが、あるに違いありません。

メッセージがリモート TCP スタックによって受信されたとしても、受信アプリケーションによって処理された (つまり、スタックから取得された) ことを保証しないことを警告するこの回答に注意してください。

于 2012-12-04T17:04:35.990 に答える
0

最終的に別の送信または受信によってエラーが報告されます。最終的に- デフォルトでは、TCP が接続に問題があると判断するまでに非常に長い時間がかかることがあります。最初に「成功した」送信の全選択を取得する場合がありますが、これはエラーの状態によって異なります。バッファがいっぱいであるといううめき声を送信することによってのみ、物事がうまくいかなかったことがわかる場合があります。

于 2012-12-04T17:04:07.100 に答える