首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux中的最小TCP MSS

Linux中的最小TCP MSS
EN

Unix & Linux用户
提问于 2011-10-11 11:21:54
回答 2查看 5.7K关注 0票数 9

Linux中的TCP MSS必须至少为88 (include/net/tcp.h):

代码语言:javascript
复制
/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS             88U

我的问题是:他们在哪里提出了"60 + 60 + 8“,为什么?我知道20 + 20来自IP报头+ TCP报头。

编辑:在仔细查看了标题之后,公式如下所示:

代码语言:javascript
复制
(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)

问题仍然存在:为什么?为什么Linux内核使用这个公式,从而禁止TCP段(例如20个字节的强制流)?在这里想一想。

EDIT2:这是我的用例。通过在套接字/连接上强制使用较低的MSS,堆栈发送的所有数据包都将具有较小的大小。在使用iperf进行数据包/秒测试时,我希望设置一个较低的MSS。我不能在线路上得到小于128字节的IP数据包( 142字节的以太网帧),因为MSS的这个下限!我想得到接近64字节的以太网帧大小按照RFC 2544。理论上这应该是可能的: 18 + 20 + 20 < 64。

EN

回答 2

Unix & Linux用户

发布于 2011-10-23 04:17:33

需要一个实现来支持最大大小的TCP和IP报头,它们每个都是60个字节.

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

综合起来,实现必须支持60+60+8字节数据包。

当我们发送作为TCP流一部分的数据包时,它们有一个20字节的IP报头(加号选项)和一个20字节的TCP报头(加号选项)。这为数据和选项留下了最少的(60+60+8)-(20+20)字节。因此,这是我们可以安全地假定实现的TCP的最大值。

票数 5
EN

Unix & Linux用户

发布于 2011-10-11 13:55:05

我不知道那个号码是从哪里来的,但我可以告诉你,它超出了规格。IP网络支持的最小MTU为576字节,这是512个数据字节加上多达64字节的IP + TCP报头和TCP选项。选择该值是为了在典型情况下提供适当的低开销。

我对一些内核代码的解读表明,您显示的值并不是任意的。有一种较早的做法就是只使用原始常量64来代替TCP_MIN_MSS。因此,我假设有一些奇怪的IP over Foo网络是内核开发人员偶然发现的,这让他们决定他们可以把你看到的东西的价值提高到你看到的水平。

然而,不标准的网络类型是什么,我不能说。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/22410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档