TCP接続の最大パケットサイズはどのくらいですか、または最大パケットサイズを取得するにはどうすればよいですか?
TCP接続の最大パケットサイズはどのくらいですか、または最大パケットサイズを取得するにはどうすればよいですか?
回答:
TCPパケットサイズの絶対制限は64K(65535バイト)ですが、実際には、下位層(イーサネットなど)のパケットサイズが小さいため、これは表示されるパケットのサイズよりもはるかに大きくなります。
たとえば、イーサネットのMTU(最大転送単位)は1500バイトです。一部のタイプのネットワーク(トークンリングなど)のMTUは大きく、一部のタイプのMTUは小さくなっていますが、値は物理テクノロジーごとに固定されています。
これは素晴らしい質問で、実際に仕事でこれに出くわします。65kや1500など、「技術的に正しい」答えはたくさんあります。ネットワークインターフェイスの作成に多くの作業を行ってきましたが、65kを使用するのはばかげています。1500でも大きな問題が発生する可能性があります。私の作業はさまざまなハードウェア/プラットフォーム/ルーターで行われ、正直に言うと、私が開始する場所は1400バイトです。1400以上必要な場合は、1450に、時には1480に移動できますか?それ以上必要な場合は、もちろん2つのパケットに分割する必要があります。そのうちのいくつかの明らかな方法があります。
問題は、データパケットを作成し、それをTCP経由で書き出すことについて話していることですが、もちろんヘッダーデータなどが付加されているため、1500以上に到達するための「手荷物」があります。また、多くのハードウェアには下限があります。
「プッシュ」すると、非常に奇妙なことが起こります。切り捨てられたデータ、またはめったに見たことのないドロップされたデータ。データの破損もめったに発生しませんが、確実に発生します。
send()
都合がいいので2Gを1つに書けない理由はありません。
1480'ish
必要があります1460
。IPヘッダーとTCPヘッダーは、少なくとも(オプションのヘッダーフィールドが使用されていない限り)それぞれ20バイトを占めるため、(非ジャンボフレーム)イーサネットの最大値は1500 - 20 -20 = 1460
です。
アプリケーションレベルでは、アプリケーションはTCPをストリーム指向プロトコルとして使用します。次にTCPにはセグメントがあり、信頼性の低いIPパケットの処理の詳細を抽象化します。
TCPはパケットの代わりにセグメントを扱います。各TCPセグメントには、TCPヘッダー内に含まれるシーケンス番号があります。TCPセグメントで送信される実際のデータは可変です。
最大のTCPセグメントサイズ(MSS)を取得するTCP_MAXSEGと呼ばれる、使用可能な一部のOSでサポートされるgetsockoptの値があります。ただし、すべてのOSでサポートされているわけではありません。
あなたが何をしようとしているのか正確にはわかりませんが、使用されているバッファサイズを減らしたい場合は、SO_SNDBUFとSO_RCVBUFを調べることもできます。
http://en.wikipedia.org/wiki/Maximum_segment_sizeによると、ネットワーク上のIPV4パケットのデフォルトの最大サイズは536オクテット(サイズ8ビットのバイト)です。RFC 879を参照
TCP APIにはパケットはありません。
TCPがIPを介して行われる場合など、基本的なプロトコルにはパケットが頻繁にあります。これは、関心がないと思われる非常に繊細なパフォーマンス最適化を除いて、ユーザーとは何の関係もないためです(質問の定式化)。
send()
1回のAPI呼び出しで可能な最大バイト数を尋ねると、これは実装と設定に依存します。通常、数キロバイトまでのチャンクに対してsend()を呼び出し、システムが全体的または部分的にそれを受け入れるのを拒否する準備ができています。その場合、データを小さなチャンクに分割して手動でデータをフィードする必要があります。 TCP send()API。
通常、これは接続が使用しているインターフェースに依存します。おそらくioctl()を使用してMTUを取得できます。それがイーサネットの場合は、通常、ハードウェアヘッダーのサイズを差し引いて最大パケットサイズを取得できます。これは、VLANのないイーサネットの場合は14です。
これは、MTUが少なくともネットワーク全体で大きい場合にのみ当てはまります。TCPはパスMTUディスカバリーを使用して、有効なMTUを削減することがあります。
問題は、なぜあなたは気にするのですか?
インターネット上のほとんどのWebサイトは、MTUの値に1460バイトを使用しているようです。場合によっては1452で、VPNを使用している場合、IPSecヘッダーの場合はさらにドロップされます。
デフォルトのウィンドウサイズは、最大65535バイトまでかなり異なります。私はhttp://tcpcheck.comを使用して、自分のソースIP値を確認し、他のインターネットベンダーが使用しているものを確認しています。
1つの解決策は、ソケットオプションTCP_MAXSEG(http://linux.die.net/man/7/tcpを設定することです。)を、基盤となるネットワークで「安全」な値に設定することです(たとえば、イーサネット上で安全になるように1400に設定)。 sendシステムコールで大きなバッファを使用します。このようにすると、高価なシステムコールを減らすことができます。カーネルは、MSSに一致するようにデータを分割します。
このようにして、データの切り捨てを回避でき、アプリケーションは小さなバッファーについて心配する必要がありません。
IPプロトコル(Ip4)のTCP設定のパケットサイズ。このフィールド(TL)には16ビットが割り当てられているため、パケットの最大サイズは65535バイトです。IPプロトコルの詳細