TCP 最大セグメント・サイズのチューニング
ネットワーク上で可能な限り大きなサイズのパケットを送信するほうが効率的なので、TCP 送信のパケット最大サイズは、帯域幅に大きな影響を与える可能性があります。
TCP は TCP 接続ごとに、この最大サイズを制御します。このサイズのことを最大セグメント・サイズ (MSS) といいます。 直接接続のネットワークの場合、TCP は、 ネットワーク・インターフェースの MTU サイズからプロトコル・ヘッダーのサイズを差し引いて MSS サイズを計算し、TCP パケット内のデータ・サイズを導き出します。 例えば、MTU が 1500 のイーサネットでは、 20 バイトの IPv4 ヘッダーと 20 バイトの TCP ヘッダーを差し引いた 1460 が MSS サイズになります。
TCP プロトコルには、接続の作成時に、その接続上で使用される MSS を接続の両端で通知するための機構が組み込まれています。 両端ではそれぞれ、TCP ヘッダー内の OPTIONS フィールドを使用して、提示された MSS を通知します。 選択される MSS は、両端が提供した値の小さい方です。 片方の端点が MSS を提供しない場合は、536 バイトが想定され、パフォーマンスの低下が発生します。
ここでの問題は、それぞれの TCP 端点が接続先のネットワークの MTU しか知らないということです。 2 つの端点の間に存在する可能性のある他のネットワークの MTU サイズは分かりません。 したがって、両方の端点が同一のネットワーク上に存在する場合にのみ、TCP は正しい MSS を知ることになります。 そのため TCP は、MTU の小さいネットワーク上で IP フラグメント化が必要になるようなパケット送信を回避する場合には、ネットワークの構成に基づいて MSS の通知を別々の方法で処理します。
接続セットアップ時に TCP ソフトウェアによって通知される MSS の値は、もう一方の接続端が同じ物理ネットワーク上のローカル・システムであるか (つまりシステムのネットワーク番号が同じであるか)、または別の (リモート) ネットワーク上にあるかによって異なります。