を介してTCPパケットを送信してasio::tcp::socket
います。
私の問題は、送信するデータが約800バイトで、最大パケットサイズが1500バイトであるにもかかわらず、データが5パケット以上で送信されることです。
(sniffsmartソフトウェアでパケット数とデータを確認します)
何故ですか?!
これをどのように解決または追跡する必要がありますか?
を介してTCPパケットを送信してasio::tcp::socket
います。
私の問題は、送信するデータが約800バイトで、最大パケットサイズが1500バイトであるにもかかわらず、データが5パケット以上で送信されることです。
(sniffsmartソフトウェアでパケット数とデータを確認します)
何故ですか?!
これをどのように解決または追跡する必要がありますか?
編集:TCPなどのストリーミングプロトコルのパケット数は、ネットワーク構成によって異なります。ただし、この回答はソケットの使用を最適化するため、送信されたパケットの数に関してプログラムによってオーバーヘッドが追加されることはありません。
より大きなパケットを取得しようとしている場合は、すべてのデータを一度にソケットに配置するようにしてください。あなたはおそらくそれを自分で複数のパケットに分割しています。NagleのTCPアルゴリズムにより、TCPスタックは利用可能なデータをすぐにピアに送信します。したがって、データを何度もソケットに置くと、残りのデータは次のパケットに送られます。
または、次のようにNagleのアルゴリズムをオフにすることができます。
m_socket.set_option(tcp::no_delay(true));
TCPはストリームです。特定のパケットに含まれる内容を制御することはできません。Nagleアルゴリズムをオン/オフできます。これは転送速度に影響を与える可能性がありますが、パケット自体のサイズを制御することはできません。さらに、これらのパケットは、途中の任意のルーターによって分割/結合できます。したがって、そのストリームは本質的に、これを変更することはできません。
TCPは一種のストリームデータです。send()はデータを送信バッファーに入れるだけで、システムTCPスタックの実装はデータをネットワークに置く方法を決定します。これが、sniffを介して見たパケットがsend()呼び出しと一致しない理由です。sendパケットをsend()と一致させたい場合は、TCPオプションがあることを覚えています。あなたはそれをチェックするかもしれません、私はそれを今正確に思い出すことができません。