web-dev-qa-db-ja.com

TCP接続の最大パケットサイズ

TCP接続の最大パケットサイズはいくつですか、または最大パケットサイズを取得する方法

172
Alexa

TCPパケットサイズの絶対的な制限は64K(65535バイト)ですが、実際には、下位レイヤ(イーサネットなど)のパケットサイズが小さいため、これは表示されるパケットのサイズよりはるかに大きくなります。

たとえば、イーサネットのMTU(最大伝送単位)は1500バイトです。 (トークンリングのような)一部の種類のネットワークではより大きいMTUがあり、一部の種類ではより小さいMTUがありますが、値は各物理テクノロジごとに固定されています。

155
Ether

これはすばらしい質問です、そして私は実際に仕事でたくさんこれに遭遇します。 65kや1500のような「技術的に正しい」答えはたくさんあります。私はネットワークインターフェースを書くために多くの仕事をしました。65kを使うのはばかげています。私の仕事はさまざまなハードウェア/プラットフォーム/ルーターで行われています、そして正直に言うと1400バイトです。あなたが1400を超える必要がある場合は、途中でインチングを始めることができます、あなたはおそらく1450に行き、時には1480フィートに行くことができますか?それ以上のものが必要な場合は、もちろん2パケットに分割する必要があります。そのうちのいくつかは明白な方法です。

問題は、データパケットの作成とTCP経由での書き出しについて話しているということですが、もちろんヘッダデータが付け加えられているなどの理由で、1500以上のサイズになる「バゲッジ」があります。多くのハードウェアには下限があります。

あなたが "それをプッシュ"した場合、あなたはいくつかの本当に奇妙なことが起こって得ることができます。明らかに切り捨てられたデータ、またはめったに見たことのないデータをドロップした。破損したデータもまれにしか発生しませんが、確かに発生します。

74
Nektarios

アプリケーションレベルでは、アプリケーションはストリーム指向プロトコルとしてTCPを使用します。 TCPは順番にセグメントを持ち、信頼できないIPパケットを扱う詳細を抽象化します。

TCPはパケットではなくセグメントを扱います。各TCPセグメントには、TCPヘッダー内に含まれるシーケンス番号があります。 TCPセグメントで送信された実際のデータは可変です。

getsockopt には、最大TCPセグメントサイズ(MSS)を取得するTCP_MAXSEGという名前の使用可能な値があります。ただし、すべてのOSでサポートされているわけではありません。

あなたが何をしようとしているのか正確にはわかりませんが、使用されているバッファサイズを減らしたい場合は、SO_SNDBUFとSO_RCVBUFを調べることもできます。

17
Brian R. Bondy

http://ja.wikipedia.org/wiki/Maximum_segment_size によると、ネットワーク上のIPV4パケットのデフォルトの最大サイズは536オクテット(サイズ8ビットのバイト)です。 RFC 879 を参照してください。

6
Robert Jacobs

TCP AP​​Iにはパケットがありません。

IPを介してTCPを実行する場合のように、基礎となるプロトコルにパケットがあることがよくあります。これは、非常にデリケートなパフォーマンスの最適化以外はユーザーとは関係ないためです。 (質問の定式化に従って)に興味がある。

1回のAPI呼び出しでsend()にできる最大バイト数を尋ねると、これは実装と設定によって異なります。通常、数キロバイトまでのチャンクに対してsend()を呼び出し、システムがそれを完全にまたは部分的に受け入れることを拒否する準備ができている場合は、手動で小さいチャンクへの分割を管理してデータをTCP send()API。

4

Linuxマシンを使用している場合は、「ifconfig eth0 mtu 9000 up」がインターフェイスのMTUを設定するためのコマンドです。ただし、ネットワーク伝送がそれほど安定していないと、大きなMTUにはいくつかの欠点があり、カーネルスペースメモリが増える可能性があります。

3
DAG

一般に、これは接続が使用しているインターフェースに依存します。 MTUを取得するためにおそらくioctl()を使用することができます、そしてそれがイーサネットであるならば、あなたは通常それからハードウェアヘッダのサイズを引くことによって最大パケットサイズを取得できます。

MTUが少なくともネットワーク全体でそれほど大きい場合は、これが当てはまります。 TCPは、有効なMTUを減らすためにパスMTU検出を使用することがあります。

問題は、なぜあなたは気にしているのですか?

3
WhirlWind

1つの解決策は、ソケットオプションTCP_MAXSEG( http://linux.die.net/man/7/tcp )を、基盤となるネットワークに対して "安全な"値に設定することです(たとえば、1400に設定する)。 (イーサネットで安全であることを確認してから)sendシステムコールで大きなバッファを使用します。こうすれば、高価なシステムコールを減らすことができます。カーネルはMSSに合わせてデータを分割します。

こうすれば、切り捨てられたデータを避けることができ、アプリケーションは小さなバッファを心配する必要がありません。

2
hashtpaa

IPプロトコルのTCP設定のパケットサイズ(Ip4)。このフィールド(TL)には16ビットが割り当てられているため、パケットの最大サイズは65535バイトです。 IPプロトコルの詳細

2
Ziegfried

インターネット上のほとんどのWebサイトはMTUの値として1460バイトを使用しているようです。時々それは1452であり、あなたがVPN上にいるならばそれはIPSecヘッダのためにさらにもっとドロップするでしょう。

デフォルトのウィンドウサイズは最大65535バイトまでかなり変化します。私は http://tcpcheck.com を使用して、自分自身の送信元IP値を調べ、他のインターネットベンダーが使用しているものを確認します。

2
David McCulloch