在 TCP 连接期间,如果客户端发送的数据段大小大于握手期间商定的 MSS 值,会发生什么情况?连接是否终止?它会导致服务器错误吗?
例如 - 让客户端在握手期间同意其 MSS 值为 1200,然后发送大小为 1600 的数据包。
任何进一步的阅读链接都值得赞赏。
最佳答案
MSS 值的存在是为了避免数据包碎片。它的计算方式为 MTU - IP header (20 字节)- TCP header (20 字节),其中 MTU 是接口(interface)的硬件限制。假设以太网上的常规 MTU 为 1500,则 MSS 值为 1460。
现在,如果有问题的服务器不是您正在摆弄的东西,并且它宣布 MSS = 1200,您应该认为这是一个物理约束。也就是说,如果您的客户端应用程序发送(通过标准 API)大小为 1600 字节的缓冲区,内核将形成两个数据包。
如果有问题的服务器是您的,并且它具有接收大 MTU(例如 1640)的物理能力,但由于某些模糊的原因,您强制它的 TCP 宣布 MSS = 1200,然后您的客户端使用 MSS = 1600 忽略公告,这完全没问题:您不会看到任何错误。您可能会发现一些有趣的相关实验,例如http://hacked10bits.blogspot.co.uk/2013/11/forcing-higher-mss-to-improve-tcp.html
关于networking - 客户端违反了握手期间商定的 MSS 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24104344/