首先说一下IP切片:
链路层最大MTU(最大传输单元)一般为1500,不包含链路层14字节的头,所以jIP网络层传输给链路层的IP包最大不能超过1500,但是如果超过1500怎么办?
其实这种情况不会发生,当IP层收到数据准备发送到链路层时,一定会检测IP包的大小是否超过了当前主机的MTU,如果超过了就会分片,我们知道,MTU时可以设置的,如果下一个路由的MTU比上一个的小怎么办?很简单,路由会在IP层再进行分片?但这个前提是IP设置了允许分片,如果IP不允许分片,那么这个包就会被丢弃,所以有人手贱,改大了路由的MTU,发现所有网络都无法链接了(改大了MTU,导致下一跳的路由收到比自己MTU大的链路包,无法处理,丢弃)。
除了IP分片外,TCP也会分片,所以TCP的包一般在IP层不会分了,只有UDP和ICMP的包才会在IP层分片。
但最新的操作系统支持NPU分片,这样就不用在TCP上分片了,可以减少TCP头的传输带宽浪费。
为什么TCP/IP包长会大于MTU?