TCP LinuxのMSSは少なくとも88(include/net/tcp.h)である必要があります:
/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS 88U
私の質問は、彼らが「60 + 60 + 8」をどこで思いついたのか、そしてその理由は何ですか? 20 +20はIPヘッダー+ TCPヘッダーから来ていることがわかります。
編集:ヘッダーを詳しく調べた後、式は次のように私を探します:
(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)
疑問はまだ残っています:なぜ? Linuxカーネルがこの式を使用し、それによってTCP、たとえば20バイトのセグメント)を禁止するのはなぜですか?ここでiperfを考えてください。
EDIT2:これが私のユースケースです。ソケット/接続でMSSを低くすることにより、allスタックによって送信されるパケットのサイズが小さくなります。パケット/秒のテストでiperfを使用する場合は、MSSを低く設定したいと思います。 MSSのこの下限のために、ワイヤ上で128バイト(142バイトのイーサネットフレーム)よりも小さいIPパケットを取得できません。 RFC 2544に従って64バイトのイーサネットフレームサイズにできるだけ近づけたいと思います。理論的には、これは可能であるはずです:18 + 20 + 20 <64。
最大サイズのTCPおよびIPヘッダー(それぞれ60バイト)をサポートするには、実装が必要です。
実装は576バイトのデータグラムをサポートする必要があります。これは、最大ヘッダーがある場合でも、データグラムに8バイトを超えるデータがあることを意味します。 8バイトを超えるデータを含むデータグラムを送信するには、IPフラグメンテーションにより、データグラムのフラグメントを表すパケットの少なくとも1つに少なくとも8バイトのデータを入れる必要があります。したがって、実装はパケット内で少なくとも8バイトのデータをサポートする必要があります。
これをまとめると、実装は60 + 60 +8バイトのパケットをサポートする必要があります。
TCPストリームの一部であるパケットを送信する場合、それらには20バイトのIPヘッダー(およびオプション)と20バイトのTCPヘッダー(プラスオプション)。これにより、データとオプション用に最小(60 + 60 + 8)-(20 + 20)バイトが残ります。したがって、これは、実装のTCP MSS。
その番号がどこから来ているのかはわかりませんが、仕様の範囲外であると言えます。 IPネットワークでサポートされる最小MTUは576バイトです。これは、512データバイトに加えて、IP + TCPヘッダーおよびTCPオプションの場合は最大64バイトです。その値典型的なケースでは、かなり低いオーバーヘッドを与えるために選択されました。
カーネルコードのビットを読んだところ、表示している値は任意ではないことがわかりました。 TCP_MIN_MSS
の代わりに生の定数64を使用するという古い慣習がありました。したがって、カーネル開発者が遭遇した奇妙なIP-over-Fooネットワークがあり、それが彼らにあなたが見ているものに価値を上げることができると彼らに決めさせたと思います。
しかし、その非標準のネットワークタイプが何であるかは言えません。