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


196

TCP接続の最大パケットサイズはどのくらいですか、または最大パケットサイズを取得するにはどうすればよいですか?


24
TCPはストリームベースです。個々のパケットについて心配している特定の理由はありますか?
Matti Virkkunen、

27
その下のレイヤーはパケットベースであるため...一般的な実装->レイヤー1-イーサネットPHY、レイヤー2-イーサネットMAC(MACパケット定義、レイヤー3-インターネットプロトコル(IPパケット定義)、レイヤー4-TCP(伝送制御プロトコル) )-その下のパケットベースのサービスを使用します

2
「TCPパケット」のようなものはありません。長さが32ビットワードで記述されているTCP セグメントがあり、それらは長さが16ビットで記述されているIPパケット内またはIPパケット全体に含まれています。これらすべてを含むイーサネットフレームもあります。次のうち、尋ねていることはどれですか。いずれにせよ、TCPを使用している場合、TCPとIPはすべての面倒を見る必要があります。
ローン侯爵

回答:


178

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

たとえば、イーサネットのMTU(最大転送単位)は1500バイトです。一部のタイプのネットワーク(トークンリングなど)のMTUは大きく、一部のタイプのMTUは小さくなっていますが、値は物理テクノロジーごとに固定されています。


15
「しかし、値は物理テクノロジーごとに固定されています」-これは真実ではありません。イーサネットの最大MTUは1500でしたが、それより低いものを使用することもできます。ジャンボフレームの登場により、実際に指定された最大値はなく、最大値はハードウェアとドライバーによって異なります。
WhirlWind 2010

4
@Whirl:true、構成可能ですが、通常は構成できません。「構成可能」は主観的です。なぜなら、そうするためにはカーネルを詳しく調べなければならないからです。これは、アプリケーションレベルで操作できるものではありません。これは、OPが存在するように見える場所です。
Ether

3
@HiroProtagonist:最大値は1500であるため、600に設定しても当然です。
ニコラ・ラウル

28
なぜ64K(65535バイト)の制限があるのですか?これは、TCPヘッダーのウィンドウサイズ属性が16ビットしかないためです。私はただ言及したかった、誰かをいつか助けることができる..... @Ether素晴らしい答え
Cacho Santa

2
また、ウィンドウスケーリングを使用してブーストすることもできます。その場合、最大は1 GiBです
Martin Melka

86

これは素晴らしい質問で、実際に仕事でこれに出くわします。65kや1500など、「技術的に正しい」答えはたくさんあります。ネットワークインターフェイスの作成に多くの作業を行ってきましたが、65kを使用するのはばかげています。1500でも大きな問題が発生する可能性があります。私の作業はさまざまなハードウェア/プラットフォーム/ルーターで行われ、正直に言うと、私が開始する場所は1400バイトです。1400以上必要な場合は、1450に、時には1480に移動できますか?それ以上必要な場合は、もちろん2つのパケットに分割する必要があります。そのうちのいくつかの明らかな方法があります。

問題は、データパケットを作成し、それをTCP経由で書き出すことについて話していることですが、もちろんヘッダーデータなどが付加されているため、1500以上に到達するための「手荷物」があります。また、多くのハードウェアには下限があります。

「プッシュ」すると、非常に奇妙なことが起こります。切り捨てられたデータ、またはめったに見たことのないドロップされたデータ。データの破損もめったに発生しませんが、確実に発生します。


GETリクエストの平均が約600バイトなのはなぜですか?

10
65Kではなく64Kを意味します。「私が開始する場所は1400バイト」という意味がわかりません。TCP APIのパケットサイズについて心配する必要はありません。パスMTUの決定と監視を行います。send()都合がいいので2Gを1つに書けない理由はありません。
ローン侯爵、2013

19
あなたがする1480'ish必要があります1460。IPヘッダーとTCPヘッダーは、少なくとも(オプションのヘッダーフィールドが使用されていない限り)それぞれ20バイトを占めるため、(非ジャンボフレーム)イーサネットの最大値は1500 - 20 -20 = 1460です。
ユージーンベレソフスキー2014

2
私はWiresharkを介して、サーバーが大きなパケット(1400バイトを超える)を送信し、クライアントがそれを逆アセンブルして最大1400バイトの少数のパケットとして受信することを確認しました。パケットの分解の責任者は誰ですか?@nektario ...?
インバリー2015年

2
@EugeneBeresovskyはオプションのヘッダーthats +最大40バイトまで追加できますが、可変なので、1420が制限のようです。1400の提案により、小さなパディングが得られます。128で割り切れるため、1408を使用します
Garet Claborn

22

アプリケーションレベルでは、アプリケーションはTCPをストリーム指向プロトコルとして使用します。次にTCPにはセグメントがあり、信頼性の低いIPパケットの処理の詳細を抽象化します。

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

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

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


大きなTCPパケット内にすべてのメッセージを収めることができる場合、メッセージキューとしてTCPを使用できるかどうかは疑問です。
CMCDragonkai、2015年


4

TCP APIにはパケットはありません。

TCPがIPを介して行われる場合など、基本的なプロトコルにはパケットが頻繁にあります。これは、関心がないと思われる非常に繊細なパフォーマンス最適化を除いて、ユーザーとは何の関係もないためです(質問の定式化)。

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


8
TCPにはパケットとパケットヘッダーがあり、その一部はIPヘッダーと重複しています。あなたがそれを見ることになっていないからといって、それが存在しないという意味ではありません。TCPは常に IP経由で行われます。ヘッダーが重複しているため、IPなしでは実行できません。
WhirlWind 2010

23
@WhirlWind TCPにはセグメントあります。IPにはパケットがあります。
ローン侯爵、2013

1
TCPにはセグメントがあります(またはパケットと呼んでもかまいません)。TCP APIにはパケットがありません。
Pavel Radzivilovsky 2013

13
@NathanLong害はあなたが不必要な混乱を引き起こすことです。TCPにはセグメントがあり、UDPにはデータグラムがあり、IPにはパケットがあり、イーサネットにはフレームがあります...
Lorneの侯爵

1
@Chexxorでは、イーサネットフレーム内のIPパケット内のTCPセグメントを記述するためにどの言語を使用するのでしょうか。これらのものの作者がさまざまな用語を使用するのに多くの問題を抱えている場合、同じものを異なるものに使用することで問題を混乱させる必要はまったくありません。
ローン侯爵

3

通常、これは接続が使用しているインターフェースに依存します。おそらくioctl()を使用してMTUを取得できます。それがイーサネットの場合は、通常、ハードウェアヘッダーのサイズを差し引いて最大パケットサイズを取得できます。これは、VLANのないイーサネットの場合は14です。

これは、MTUが少なくともネットワーク全体で大きい場合にのみ当てはまります。TCPはパスMTUディスカバリーを使用して、有効なMTUを削減することがあります。

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


6
これにより、最初のリンクでの最大パケットサイズのみが取得されます。私の知る限り、ルート上の他のノードは大きなパケットを嫌うことが許可されており、パス上のどこかに分割される可能性があります。
Matti Virkkunen、

うん、それは本当です...だからあなたの質問は良いです-なぜこれが欲しいのですか?
WhirlWind 2010

LAN接続を介してビデオ/画像を送信したい
Alexa

1
TCPはストリーム指向なので、なぜこれが問題になるのですか?
WhirlWind 2010

3

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


3

インターネット上のほとんどのWebサイトは、MTUの値に1460バイトを使用しているようです。場合によっては1452で、VPNを使用している場合、IPSecヘッダーの場合はさらにドロップされます。

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


2

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

このようにして、データの切り捨てを回避でき、アプリケーションは小さなバッファーについて心配する必要がありません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.