由于以太网物理性质的限制,我们在IP层发送数据的时候, 如果发送向物理层的数据包大于物理层的限制, 就会发生错误. 该物理层限制就叫做MTU.
而在网络传输中, 每一条传输线路都有可能有自己不同的传输限制, 虽然路由器可以在IP层进行数据包分片传输, 但是有IP层进行的分片传输, 一旦在对端重组的时候, 有一个出现了错误, 就会发生丢包, 不论是对于TCP还是UDP,都是非常不好的.
所以, 为了不让IP层进行分片, 我们在传输数据的时候, 就需要获得发往该目的地的路线上的最小的传输线路的限制大小. 这就是路径MTU.
TCP和UDP获得MTU的方式是相同的, TCP使用路径MTU来确定自己的MSS字段的大小, 而UDP获得MTU的目的就是只让当前的UDP报文在自己的发送端进行分片, 除此之外不允许再分片.
路径MTU的原理
- 首先, 发送端对外发送数据包, 发送端IP层将IP报头禁止分片位设置为1, 如果之后某一条路的路由器, 必须分片才能将该IP报文传输出去, 那就直接丢弃掉该报文, 然后返回一个ICMP的响应报文, 告诉发送端当前自己的路径MTU是多大
- 获得返回ICMP报文的主机, 就将该值设置为当前MTU, 然后再次进行发送, 如此往复, 直到没有ICMP数据包返回, 就说明找到了当前发送给接收端主机的路径MTU.