客户端与服务器建立TCP连接时,会在第三次握手时上报自己的MSS值,按照我的理解,MSS值应该是其接口的MTU值减去40,如果客户端接口的MTU值为1500,那么它给服务器的MSS值就是1460,在客户端是没问题的。让我感到疑惑的是,服务器给客户端的MSS好像是动态感知服务器与客户端之间的最小MTU,然后减去40,比如我把客户端与服务器之间的路由器接口的MTU改成1400,那么服务器给客户端的MSS就是1360;我知道建立TCP连接后可以通过PMTUD检测到变化,但是这是在TCP第3次握手时发生的,服务器得到了正确的MSS值,这是怎么回事呢?
答案1
您提到了服务器和客户端之间的路由器接口。如果该路由器实际上是 NAT(NAPT)网关,而不是简单的 IP 转发路由器,那么它很可能正在执行“MSS 限制”。也就是说,由于它已经在干扰 TCP 和 IP 报头以执行 NAPT,因此它也可能会通过更正 MSS 字段来帮助 MSS 协商顺利进行。