networking - 客户端违反了握手期间商定的 MSS 值

标签 networking tcp

在 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/

相关文章:

linux - 如果一个端口用于连接一个服务,那么用于连接另一个服务是否可以?

c++ - 服务器和客户端在同一台机器上,无环回

c - socket()中 "protocol"为SOCK_DGRAM或SOCK_STREAM时是否需要指定 "type"?

linux - 传出 TCP 端口匹配监听端口

c - TCP 套接字接收指示 "unexpected"成功发送后断开连接

networking - 如何在两台防火墙后面的多台计算机之间建立 TCP 连接?

ios - 随机获取 Error Domain=NSURLErrorDomain Code=-1005 “The network connection was lost.”

c# - TCP是否适合由定期位置更新组成的网络游戏编程?

networking - 奇怪的 Vagrant 错误消息 : 'Unable to create a host network interface'

java - 如何在 Java 代码中设置 TCP_CORK 选项