一、MTU
二、分片与重组
传输层可能会发送比 MTU 更多字节的数据,这时就需要对 IP 数据报进行分片处理
- IP 数据报的分片由发送主机和路由器负责,而重组由接收主机负责,也就是说,路由器只负责分片,不负责重组
- 1472 = 1500 - 20(IP 首部) - 8(UDP 首部)
- 1480 = 1500 - 20(IP 首部)
- 1372 = 4324(UDP 数据-总) + 8(UDP 首部) - 1472(分片 1 UDP 数据) - 8(分片 1 UDP 首部) - 1480(分片 2 UDP 数据)
三、路径 MTU 发现
分片处理会增大路由器的负荷,因此,只要允许,是不希望路由器对 IP 数据报进行分片处理的
“路径 MTU 发现” 是一种新技术,避免 IP 数据报在中途的路由器上被分片处理,其中,“路径 MTU” 是指从发送主机到接收主机之间不需要分片的最大 MTU,即路径中存在的所有数据链路中最小的 MTU,而 “路径 MTU 发现” 是指从发送主机按照 “路径 MTU” 将 IP 数据报分片后进行发送,现在,很多操作系统都已经实现了 “路径 MTU 发现”
如图,首先在发送主机发送 IP 数据报时将其首部的分片禁止标志位设为 1,根据这个标志位,途中的路由器即使遇到需要分片才能处理的情况,也不会去分片,而是将包丢弃,随后,通过一个 ICMP 不可达消息将数据链路上的 MTU 告知发送主机,发送主机获得 ICMP 的 MTU 后,将其设置为当前 MTU,再根据这个 MTU 对 IP 数据报进行分片处理,如此反复,直到 IP 数据报被发送到接收主机为止没有再收到任何 ICMP,就认为最后一次 ICMP 的 MTU 即是一个合适的 MTU,那么,当 MTU 比较多时,最少可以缓存约 10 min,在这 10 分钟内使用刚刚求得的 MTU,但过了这 10 分钟,则需要重新路径 MTU 发现
如图,在 TCP 的情况下,根据 “路径 MTU” 计算出最大段长度(MSS),然后再进行 TCP 段的发送,也就是说,在 TCP 中采用 “路径 MTU 发现”,IP 层不会进行分片处理,而是 TCP 层直接处理好后再传给 IP 层
MSS
TCP 三次握手建立连接时,通信双方进行 MSS 协商(协商过程如下),而且 MSS 也受限于 MTU
注意
协商前双方的 MSS 值可不是通过 “路径 MTU 发现” 计算出来的,详见TCP 三次握手协商 MSS 前,如何确定 MSS 值
引申问题
既然 IP 层会分片,为什么 TCP 层还需要 MSS 呢?
四、IP 首部
- 4 位版本号:IPv4 的版本号为 4 ,IPv6 的版本号为 6
- 4 位首部长度:单位是 4 字节,IP 首部最大长度为 15 * 4 字节 = 60 字节,在没有可选字段的情况下,IP 首部的长度为 5 * 4 字节 = 20 字节
- 8 位服务类型:其中,3位优先权字段(0、1、2)已弃用,4 位 TOS 字段(3:最低延迟、4:最大吞吐量、5:最高可靠性、6:最低成本)相互冲突,只能选择其中一个,对于 ssh/telnet,最低延迟比较重要,对于 ftp,最大吞吐量比较重要,1 位保留字段(7),必须置为 0
- 16 位 IP 数据报总长度:IP 首部 + 数据 = IP 数据报总长度,最大 65536 字节
- 16 位标识:用于分片重组,同一分片的标识值相同,不同分片的标识值不同,此外,即使标识值相同,如果目标地址、源地址或协议不同的话,也会被认为是不同的分片
- 3 位标志:
- 13 位片偏移:用于标识各分片相对于分片前原始 IP 数据报开始处的偏移位置,单位是 8 字节(65536 字节/ 8192),第一个分片对应的片偏移值为 0
- 8 位生存时间:指 IP 数据报可以中转多少个路由器,每经过一个路由器,TTL -= 1,直到减成 0 还未到达,直接丢弃,由此可以避免 IP 数据报在网络内无限传递
- 8 位协议:表示上层协议类型
- 16 位首部校验和:使用 CRC 校验 IP 数据报是否损坏,注意,仅校验 IP 首部,并不校验数据部分
- 32 位源地址
- 32 位目标地址
- 可选项:变长
- 填充:在有可选项的情况下,IP 首部长度可能不是 32 比特的整数倍,为此,通过向字段填充 0,将其调整为 32 比特的整数倍