3

相手方が個々のパッケージではなくマージされた TCP パケットを受け取る方法と理由を知っている人はいますか? すでにソケット レベルで TCP Nodelay を true に設定していますが、tcpdump ではまだいくつかのパケットがマージされていると見なされます。サイズが 310 バイトの 4 つのパケットが正常に送信された後、15 x 310 バイトではなく 3 x 1400 バイトが返されました。これにより、重大な遅延が発生しています。ありがとう。

http://www.2shared.com/photo/_bN9UEqR/tcpdump2.html

s = new Socket(host, port);
s.setTcpNoDelay(true);
s.getOutputStream().write(byteMsg); 
s.getOutputStream().flush()
4

4 に答える 4

5

TCP はストリームベースのプロトコルです。send/recv呼び出しに関する境界は保持されません。保証されている唯一のことは、's の連結がsend's の連結と同じになることですrecv(通常の状況では)。

カスタム プロトコルを実装していて、データを複数の論理メッセージに分割する何らかの方法が必要な場合は、そのためのエンコーディングが必要です。

簡単なエンコーディングは、各メッセージを、メッセージ ペイロードの長さを示す 32 ビットの符号なし整数としてエンコードし、その後に実際のメッセージ ペイロードを続けることです。次に、受信側では、このエンコーディングに従って入力を適切にデコードします。そのためには、部分的に受信したメッセージを格納するバッファが必要です。生の整数の操作が問題になる場合は、別の方法で長さをエンコードできます。たとえば、10 進数の後に改行を付けるなどです。

于 2012-06-28T10:25:34.763 に答える
1

setTcpNoDelay()使用されているソケット (メソッド)で TCP_NODELAY オプションを有効にすることができます。

デフォルトでは無効になっています。つまり、送信されるデータは、送信されるパッケージの最小数に対して最適化されます ( Nagle のアルゴリズムを参照してください)。

于 2012-06-28T09:40:54.557 に答える
0

取引相手が個々のパッケージではなくマージされた TCP パッケージを受け取る方法と理由を知っている人はいますか?

これは、TCP が特別に設計されているためです。

于 2012-06-28T10:59:00.460 に答える