2

を介してTCPパケットを送信してasio::tcp::socketいます。

私の問題は、送信するデータが約800バイトで、最大パケットサイズが1500バイトであるにもかかわらず、データが5パケット以上で送信されることです。

(sniffsmartソフトウェアでパケット数とデータを確認します)

何故ですか?!

これをどのように解決または追跡する必要がありますか?

4

3 に答える 3

4

編集:TCPなどのストリーミングプロトコルのパケット数は、ネットワーク構成によって異なります。ただし、この回答はソケットの使用を最適化するため、送信されたパケットの数に関してプログラムによってオーバーヘッドが追加されることはありません。

より大きなパケットを取得しようとしている場合は、すべてのデータを一度にソケットに配置するようにしてください。あなたはおそらくそれを自分で複数のパケットに分割しています。NagleのTCPアルゴリズムにより、TCPスタックは利用可能なデータをすぐにピアに送信します。したがって、データを何度もソケットに置くと、残りのデータは次のパケットに送られます。

または、次のようにNagleのアルゴリズムをオフにすることができます。

m_socket.set_option(tcp::no_delay(true));
于 2012-12-24T08:00:34.093 に答える
1

TCPはストリームです。特定のパケットに含まれる内容を制御することはできません。Nagleアルゴリズムをオン/オフできます。これは転送速度に影響を与える可能性がありますが、パケット自体のサイズを制御することはできません。さらに、これらのパケットは、途中の任意のルーターによって分割/結合できます。したがって、そのストリームは本質的に、これを変更することはできません。

于 2012-12-24T09:39:20.990 に答える
0

TCPは一種のストリームデータです。send()はデータを送信バッファーに入れるだけで、システムTCPスタックの実装はデータをネットワークに置く方法を決定します。これが、sniffを介して見たパケットがsend()呼び出しと一致しない理由です。sendパケットをsend()と一致させたい場合は、TCPオプションがあることを覚えています。あなたはそれをチェックするかもしれません、私はそれを今正確に思い出すことができません。

于 2012-12-24T06:24:59.887 に答える