LinuxのTCP 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カーネルがこの式を使用して、たとえば20バイトのTCPセグメントフローを許可しないのはなぜですか?ここでiperfを考えてみましょう。
EDIT2:これは私のユースケースです。ソケット/接続に低MSSを適用することによってみんなスタックから送信されるパケットサイズが小さくなります。 iperfを使用してパケット/秒テストを実行しながら、より低いMSSを設定したいと思います。 MSSの下限のため、回線で128バイト(142バイトイーサネットフレーム)未満のIPパケットを取得できません! RFC 2544に従って、可能な限り64バイトに近いイーサネットフレームサイズを取得したいと思います。理論的には18 + 20 + 20 < 64が可能です。
ベストアンサー1
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の最大値です。