Linux中最少的TCP MSS


9

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。


这如何禁止20个字节的TCP段?
大卫·史瓦兹

MSS代表最大网段大小,它是特定连接中网段大小的上限(而不是下限)。TCP_MIN_MSS指定此限制的下限。因此,它不以任何方式禁止少于88个字节的段,它只是指出任何连接的MSS应该大于等于88个字节。
gelraen

当然!抱歉,不清楚。请查看最新编辑。
Mircea Gherzan

你为什么让赏金过期?大卫的回答至少可以使我满意。他的回答和我的回答之间的区别在于,我们所谈论的是不同的最小值。就其价值而言,还有第三个最小值,即41或20 + 20 + 1字节的TCP数据。因此,最小数据包大小取决于您询问的原因。我希望68在内核使用的情况下是正确的答案TCP_MIN_MSS
沃伦·杨

我对答案仍然不满意。我仍然看不到内核不允许我向应用程序强加任何小型MSS的原因。我很想拥有41个字节的IP数据包(源源不断的TCP数据包),但是由于,我不能TCP_MIN_MSS。为什么不能为1?它会破坏什么RFC?它会引起什么理论/实践问题?您确定它在“规格之外”吗?“不同的最小值”?这里只有一个最低要求:内核允许的最小MSS。
Mircea Gherzan

Answers:


5

需要实现以支持最大大小的TCP和IP标头,每个标头为60个字节。

一个实现必须支持576字节的数据报,即使具有最大报头,也意味着该数据报中的数据超过8字节。要发送具有8个字节以上数据的数据报,IP分片必须在至少一个表示数据报片段的数据包中放置至少8个字节的数据。因此,一个实现必须在一个数据包中支持至少8个字节的数据。

放在一起,实现必须支持60 + 60 + 8字节数据包。

当我们发送作为TCP流一部分的数据包时,它们具有20字节的IP标头(加上选项)和20字节的TCP标头(加上选项)。这样就剩下了至少(60 + 60 + 8)-(20 + 20)个字节用于数据和选项。因此,这是我们可以放心地假设实现的TCP MSS的最大值。


1
MSS却不包括标题(它只是有效载荷),并且60出现了两次
Michael Mrozek

实现必须能够支持具有最大大小的标头的数据包,但是我们没有发送最大大小的标头。因此,最大值与我们实际发送的值之间的差可用于数据,并且应添加到MSS中。
David Schwartz

好的,所以您已经解释了8个字节。我不知道您所说的“ TCP / IP”头是什么意思。我知道一个IP标头和一个TCP标头。而且,正如迈克尔所指出的,60出现了两次。RFC仅讨论“有效的MSS”,而不是最小的讨论。
Mircea Gherzan

图60出现了两次,一次是IP标头,一次是TCP标头。
David Schwartz

68只是关于碎片。“ 60 + 60 + 8”可能会碎片化,那么为什么要关心碎片化呢?甚至“ 68 + 20”也可能变得支离破碎。为什么要“必须”另一边“接受”“ 60 + 60 + 8”?“接受”与“没有碎片”一样?底线:为什么我不允许发送“ 20 + 20” + 10个字节的数据?
Mircea Gherzan

3

我不知道该数字来自何处,但我可以告诉您它不在规格范围内。IP网络支持的最小MTU为576字节,即512个数据字节,再加上IP + TCP标头和TCP选项的最大64个字节。在典型情况下,选择该值可大大降低开销。

我对内核代码的一些读取表明,您显示的值不是任意的。有一种较旧的做法是只使用原始常量64代替TCP_MIN_MSS。因此,我假设内核开发人员遇到了一些奇怪的IP-over-Foo网络,使他们决定可以将价值提高到您所看到的。

但是,我不能说那是非标准网络类型。


576是数据报的MTU 。在这种情况下,重要的是数据包限制,而不是数据报限制,因为TCP数据包设置了DF位。
大卫·史瓦兹

为IP数据报定义的最小MTU,TCP数据包也是IP数据报。
gelraen

是的,但是这个TCP限制是针对数据包的,而不是数据报的,因为TCP数据报从不(通常)是分段的。576字节数据报规则重要的唯一意义是,它意味着实现必须能够在一个数据包中支持至少8个字节的数据(因此公式中为8个字节)。否则,将无法分割576字节的数据报。
David Schwartz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.