计算机网络原理
第四章 第5节
第五节:
网际协议:因特网中的转发和编址
它主要讲 IP 协议在网络层中的作用。
网络层大概有三个核心组成:
1. IP 协议
IP 是这一节的主角,负责:
数据报格式
编址规则
分组处理规则
分片与重组
数据报转发
也就是说,IP 规定了:数据报长什么样,地址怎么写,路由器怎么处理它。
2. 路由选择协议
比如:
RIP
OSPF
BGP
它们负责:计算路由,生成转发表。
也就是前面讲过的控制平面。
3. ICMP 协议
ICMP 是互联网控制报文协议。
它负责:
差错报告
网络层控制信息
路由器、主机之间的信息反馈
比如 ping 就和 ICMP 有关。
二、IP 在 TCP/IP 协议栈中的位置
从协议栈看:
应用层:
HTTP
FTP
DNS
运输层:
TCP
UDP
网络层:
IP
ICMP
IGMP
ARP 相关内容也和网络层/链路层交界有关
链路层:
Ethernet 等
物理层:
比特传输
封装关系
比如 HTTP 数据发送时,大概是:
所以 IP 数据报里面的数据部分,通常装的是:
TCP 段
UDP 段
ICMP 报文
其他网络层上层协议数据
三、IP 数据报的整体结构

一个 IPv4 数据报由两部分组成:
其中:
首部:网络层控制信息
数据部分:通常是 TCP/UDP 段
大多数 IPv4 数据报没有选项,所以一般首部长度是 20 字节。
也就是:
如果有选项字段,首部会变长。
四、IPv4 数据报首部字段总览
IPv4 首部最少 20 字节,里面有这些字段:
版本号 Version
首部长度 Header Length
服务类型 TOS
数据报总长度 Total Length
标识 Identification
标志 Flags
片偏移 Fragment Offset
TTL
协议 Protocol
首部校验和 Header Checksum
源 IP 地址
目的 IP 地址
选项 Options
填充 Padding

五、版本号 Version
版本号字段占 4 bit。
它说明:这个 IP 数据报使用哪个版本的 IP 协议。
常见值:
4:IPv4
6:IPv6
路由器看到版本号之后,才知道应该按 IPv4 还是 IPv6 的格式解释后面的字段。
六、首部长度 Header Length
IPv4 首部长度字段占 4 bit。
它表示:IP 首部有多长。
但是注意,它不是以字节为单位,而是以:
为单位。
也就是说字段值为 5,表示:
所以普通 IPv4 首部没有选项时:
对应 20 字节。
首部长度为什么需要?
因为 IPv4 首部可能有选项字段。
有选项时,首部长度就不是固定 20B。
所以必须告诉接收方:数据部分从哪里开始。
取值范围
首部长度字段是 4 bit,最大值是 15。
所以 IPv4 首部最大长度是:
最小值是:
七、服务类型 TOS
服务类型字段原来叫 TOS,占 8 bit。
它的作用是:
区分不同类型数据报的服务需求。
比如:
实时语音希望低时延
文件传输希望高吞吐
某些业务希望高可靠性
某些业务希望低丢包率
现在这个字段常和 DSCP、ECN 相关,用于服务质量和拥塞通知。
TOS 用来区分服务类型,帮助网络对不同数据流做不同处理。
八、数据报总长度 Total Length
总长度字段占 16 bit。
它表示:
单位是字节。
因为它是 16 bit,所以 IPv4 数据报理论最大长度是:
也就是 65535 字节。
注意
总长度不是只算数据部分,而是包括首部。
比如:
首部 20B
数据部分 1400B
那么总长度是:
九、标识、标志、片偏移:分片相关字段
这三个字段是 IP 分片的核心:
标识 Identification
标志 Flags
片偏移 Fragment Offset
它们都和 IP 分片有关。
先理解为什么需要分片。
十、为什么需要 IP 分片?
链路层帧能装的数据有上限,这个上限叫:
MTU,Maximum Transmission Unit,最大传输单元。
比如以太网常见 MTU 是:
意思是:
一个以太网帧最多装 1500B 的 IP 数据报。
如果一个 IP 数据报太大,大于下一条链路的 MTU,就不能直接放进链路层帧里。
这时候 IPv4 可以把它分成多个较小的 IP 数据报片。
这就需要IP 分片。
十一、IP 分片的基本规则
假设原始 IP 数据报太大,要分成多个片。
每个分片都是一个新的 IP 数据报。
所以每个分片都有:
自己的 IP 首部
自己的数据部分
但是这些分片属于同一个原始数据报,所以它们的:
标识 Identification 相同。
接收端根据标识、源地址、目的地址等信息把它们重组。

十二、标识 Identification
标识字段占 16 bit。
作用:
标记哪些分片属于同一个原始 IP 数据报。
同一个原始数据报拆出来的所有分片:
比如例子里标识都是:
说明这些片都是同一个原始数据报拆出来的。
十三、标志 Flags
标志字段占 3 bit。
里面最重要的是两个:
1. DF:Don’t Fragment
DF 表示禁止分片。
DF = 1:不能分片
DF = 0:允许分片
如果 DF = 1,但是数据报又超过下一跳 MTU,路由器不能分片,只能丢弃,并通常发送 ICMP 差错报文。
2. MF:More Fragment
MF 表示后面是否还有分片。
MF = 1:后面还有分片
MF = 0:这是最后一个分片
所以判断最后一个分片:
中间分片:
十四、片偏移 Fragment Offset
片偏移字段占 13 bit。
它表示:这个分片的数据部分,在原始数据报数据部分中的位置。
注意两点:
1. 偏移是相对原始数据部分,不包括 IP 首部
比如原始数据报:
片偏移只看那 3800B 数据,不看前面的 20B 首部。
2. 片偏移单位是 8 字节
片偏移不是直接以字节为单位,而是:
为单位。
所以:
十五、为什么分片数据长度通常要是 8 的倍数?
因为片偏移单位是 8B。
所以除了最后一个分片外,前面的每个分片数据长度通常都要是 8 的整数倍。
否则下一个分片的偏移就不是整数。
记住:
除最后一片外,每片数据长度应为 8B 的整数倍。
十六、分片例题
原始 IP 数据报:
总长度:3820B
首部长度:20B
数据部分:3800B
标识:12345
现在下一条链路要求分片后每片总长度不超过:
每个分片都要有 20B IP 首部。
所以每片最多能装的数据是:
1400 正好是 8 的倍数:
原始数据部分是 3800B,所以分成:
分片 1
数据长度:
总长度:
标识:
MF:
因为后面还有分片。
片偏移:
因为它从原始数据部分第 0 字节开始。
分片 2
数据长度:
总长度:
标识:
MF:
因为后面还有分片。
片偏移:
分片 3
数据长度:
总长度:
标识:
MF:
因为这是最后一个分片。
片偏移:
表格总结
分片 | 总长度 | 数据长度 | 标识 | MF | DF | 片偏移 原始数据报 | 3820 | 3800 | 12345 | 0 | 0 | 0 分片 1 | 1420 | 1400 | 12345 | 1 | 0 | 0 分片 2 | 1420 | 1400 | 12345 | 1 | 0 | 175 分片 3 | 1020 | 1000 | 12345 | 0 | 0 | 350
十七、分片题
第一步:算原始数据长度
第二步:算每片最大数据长度
但是要注意:
除最后一片外,每片数据长度必须取不超过该值的最大 8 的倍数。
第三步:切数据
把原始数据部分按最大数据长度切开。
第四步:算每片总长度
一般新 IP 首部仍然是 20B。
第五步:填 MF
不是最后一片:MF = 1
最后一片:MF = 0
第六步:算片偏移
十八、TTL:寿命字段
TTL 全称:Time To Live占 8 bit。
作用:防止数据报在网络中无限循环。
每经过一个路由器,TTL 减 1。
如果 TTL 减到 0,路由器必须丢弃该数据报。
为什么需要 TTL?
如果路由表出错,可能出现环路。
比如:
如果没有 TTL,分组可能一直绕圈,占用网络资源。
TTL 就相当于给数据报设置一个“生命倒计时”。
十九、协议 Protocol 字段
协议字段占 8 bit。
它表示:IP 数据报的数据部分应该交给哪个上层协议。
常见值:
协议 | 字段值 ICMP | 1 IGMP | 2 TCP | 6 UDP | 17 IPv6 | 41 ESP | 50 OSPF | 89
比如:
Protocol = 6:交给 TCP
Protocol = 17:交给 UDP
协议号和端口号的区别
协议号是网络层告诉主机:数据部分交给哪个运输层协议。
端口号是运输层告诉主机:数据交给哪个应用进程。
所以:
二十、首部校验和 Header Checksum
首部校验和占 16 bit。
作用:检测 IP 首部是否发生比特错误。
注意,它只校验 IP 首部,不校验数据部分。
怎么计算?
把 IP 首部按 16 bit 分组,然后做反码求和,最后取反码,放入首部校验和字段。
接收方或路由器收到后,也重新计算。
如果结果不匹配,说明首部出错,一般丢弃该数据报。
二十一、为什么每个路由器都要重新计算 IP 首部校验和?
因为每经过一个路由器,TTL 都会减 1。
TTL 是 IP 首部的一部分。
所以首部内容变了。
既然首部变了,首部校验和也必须变。
因此:
每台路由器处理 IPv4 数据报时,都要更新 TTL,并重新计算首部校验和。
二十二、为什么 TCP/UDP 和 IP 都有校验和?
1. IP 首部校验和只检查 IP 首部
IP 的首部校验和只保护:IP 首部
不保护数据部分。
也就是说,IP 不负责检查 TCP/UDP 数据有没有错。
2. TCP/UDP 校验和检查运输层报文
TCP/UDP 校验和保护:
TCP/UDP 首部 + 数据
所以它检查的是运输层内容。
3. 层次不同
IP 层不知道里面装的一定是 TCP 或 UDP。
它也可能装:
ICMP
OSPF
IGMP
其他协议
所以 IP 只负责网络层自己的首部。
运输层协议自己负责自己的数据完整性。
IP 校验和管 IP 首部,TCP/UDP 校验和管运输层报文,不是完全重复。
二十三、源地址和目的地址
IPv4 首部中有两个 32 bit 地址:
源 IP 地址
目的 IP 地址
路由器转发主要看:目的 IP 地址。
源 IP 地址一般用于让对方知道“谁发来的”,以及回包时使用。
二十四、选项 Options 和填充 Padding
IPv4 首部可以有选项字段。
选项字段长度可变。
因为 IP 首部长度必须是 4B 的整数倍,所以如果选项长度不够对齐,需要用填充字段补齐。
但是实际中选项很少用
因为:
会让首部变长
会让路由器处理更慢
不利于高速转发
所以大多数 IPv4 数据报没有选项,首部就是 20B。
二十五、IPv6 和分片的区别
IPv6 不允许路由器对分组分片。
这点很重要。
IPv4 中,路由器可以分片。
IPv6 中,中间路由器不做分片。
如果包太大,一般通过路径 MTU 发现,让源主机自己调整发送大小。
所以可以记:
协议 | 路由器是否分片 IPv4 | 可以分片 IPv6 | 路由器不分片
运输层把 TCP/UDP 段交给网络层。
网络层加上 IPv4 首部,形成 IP 数据报。
IP 首部里面包含:
版本号:说明 IPv4/IPv6
首部长度:说明数据从哪里开始
服务类型:区分服务需求
总长度:说明整个 IP 数据报多长
标识、标志、片偏移:用于分片与重组
TTL:防止无限循环
协议号:告诉接收方交给 TCP/UDP/ICMP
首部校验和:检查 IP 首部错误
源地址、目的地址:用于寻址和转发
选项和填充:可选字段
路由器收到 IP 数据报后:
检查首部
TTL 减 1
重新计算首部校验和
根据目的 IP 查转发表
如果下一跳链路 MTU 不够,且允许分片,就进行 IPv4 分片
转发到下一跳
最后目的主机收到后,根据 Protocol 字段交给 TCP、UDP 或 ICMP。
题型
1. IPv4 首部最小长度
因为首部长度字段为 5,单位是 4B。
2. IPv4 数据报最大长度
因为总长度字段是 16 bit。
3. TTL 的作用
防止 IP 数据报由于路由环路在网络中无限循环。
每过一个路由器减 1,减到 0 丢弃。
4. Protocol 字段的作用
指明 IP 数据报的数据部分应交给哪个上层协议。
TCP 是 6,UDP 是 17,ICMP 是 1。
5. 分片三个字段
标识:同一原始数据报的分片标识相同
MF:后面是否还有分片
片偏移:该片数据在原始数据中的位置,单位 8B
6. 分片时总长度怎么算?
7. 片偏移怎么算?
8. 为什么除最后一片外数据长度要是 8 的倍数?
因为片偏移字段单位是 8B。
9. 为什么路由器要重新算校验和?
因为 TTL 每经过一个路由器都会变化,而 TTL 在 IP 首部中。
10. 为什么 IP 和 TCP/UDP 都有校验?
IP 只校验 IP 首部。
TCP/UDP 校验运输层报文。
