← 返回 计算机网络原理

计算机网络原理

第四章 第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 数据发送时,大概是:

HTTP数据TCPIP数据报以太网帧HTTP\text{数据}\to TCP\text{段}\to IP\text{数据报}\to \text{以太网帧}

所以 IP 数据报里面的数据部分,通常装的是:

TCP 段

UDP 段

ICMP 报文

其他网络层上层协议数据

三、IP 数据报的整体结构

第四章 第5节 配图 1

一个 IPv4 数据报由两部分组成:

IP数据报=首部+数据部分IP\text{数据报}=\text{首部}+\text{数据部分}

其中:

首部:网络层控制信息

数据部分:通常是 TCP/UDP 段

大多数 IPv4 数据报没有选项,所以一般首部长度是 20 字节。

也就是:

普通IPv4首部=20B\text{普通}IPv4\text{首部}=20B

如果有选项字段,首部会变长。

四、IPv4 数据报首部字段总览

IPv4 首部最少 20 字节,里面有这些字段:

版本号 Version

首部长度 Header Length

服务类型 TOS

数据报总长度 Total Length

标识 Identification

标志 Flags

片偏移 Fragment Offset

TTL

协议 Protocol

首部校验和 Header Checksum

源 IP 地址

目的 IP 地址

选项 Options

填充 Padding

第四章 第5节 配图 2

五、版本号 Version

版本号字段占 4 bit。

它说明:这个 IP 数据报使用哪个版本的 IP 协议。

常见值:

4:IPv4

6:IPv6

路由器看到版本号之后,才知道应该按 IPv4 还是 IPv6 的格式解释后面的字段。

六、首部长度 Header Length

IPv4 首部长度字段占 4 bit。

它表示:IP 首部有多长。

但是注意,它不是以字节为单位,而是以:

4B4B

为单位。

也就是说字段值为 5,表示:

5×4B=20B5\times 4B=20B

所以普通 IPv4 首部没有选项时:

首部长度=5\text{首部长度}=5

对应 20 字节。

首部长度为什么需要?

因为 IPv4 首部可能有选项字段。

有选项时,首部长度就不是固定 20B。

所以必须告诉接收方:数据部分从哪里开始。

取值范围

首部长度字段是 4 bit,最大值是 15。

所以 IPv4 首部最大长度是:

15×4B=60B15\times 4B=60B

最小值是:

5×4B=20B5\times 4B=20B

七、服务类型 TOS

服务类型字段原来叫 TOS,占 8 bit。

它的作用是:

区分不同类型数据报的服务需求。

比如:

实时语音希望低时延

文件传输希望高吞吐

某些业务希望高可靠性

某些业务希望低丢包率

现在这个字段常和 DSCP、ECN 相关,用于服务质量和拥塞通知。

TOS 用来区分服务类型,帮助网络对不同数据流做不同处理。

八、数据报总长度 Total Length

总长度字段占 16 bit。

它表示:

IP数据报总长度=IP首部长度+数据部分长度IP\text{数据报总长度}=IP\text{首部长度}+\text{数据部分长度}

单位是字节。

因为它是 16 bit,所以 IPv4 数据报理论最大长度是:

2161=65535B{2}^{16}-1=65535B

也就是 65535 字节。

注意

总长度不是只算数据部分,而是包括首部。

比如:

首部 20B

数据部分 1400B

那么总长度是:

1420B1420B

九、标识、标志、片偏移:分片相关字段

这三个字段是 IP 分片的核心:

标识 Identification

标志 Flags

片偏移 Fragment Offset

它们都和 IP 分片有关。

先理解为什么需要分片。

十、为什么需要 IP 分片?

链路层帧能装的数据有上限,这个上限叫:

MTU,Maximum Transmission Unit,最大传输单元。

比如以太网常见 MTU 是:

1500B1500B

意思是:

一个以太网帧最多装 1500B 的 IP 数据报。

如果一个 IP 数据报太大,大于下一条链路的 MTU,就不能直接放进链路层帧里。

这时候 IPv4 可以把它分成多个较小的 IP 数据报片。

这就需要IP 分片。

十一、IP 分片的基本规则

假设原始 IP 数据报太大,要分成多个片。

每个分片都是一个新的 IP 数据报。

所以每个分片都有:

自己的 IP 首部

自己的数据部分

但是这些分片属于同一个原始数据报,所以它们的:

标识 Identification 相同。

接收端根据标识、源地址、目的地址等信息把它们重组。

第四章 第5节 配图 3

十二、标识 Identification

标识字段占 16 bit。

作用:

标记哪些分片属于同一个原始 IP 数据报。

同一个原始数据报拆出来的所有分片:

Identification相同Identification\text{相同}

比如例子里标识都是:

1234512345

说明这些片都是同一个原始数据报拆出来的。

十三、标志 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:这是最后一个分片

所以判断最后一个分片:

MF=0MF=0

中间分片:

MF=1MF=1

十四、片偏移 Fragment Offset

片偏移字段占 13 bit。

它表示:这个分片的数据部分,在原始数据报数据部分中的位置。

注意两点:

1. 偏移是相对原始数据部分,不包括 IP 首部

比如原始数据报:

首部20B+数据3800B\text{首部}20B+\text{数据}3800B

片偏移只看那 3800B 数据,不看前面的 20B 首部。

2. 片偏移单位是 8 字节

片偏移不是直接以字节为单位,而是:

8B8B

为单位。

所以:

片偏移字段值=该分片数据起始字节位置/8\text{片偏移字段值}=\text{该分片数据起始字节位置}/8

十五、为什么分片数据长度通常要是 8 的倍数?

因为片偏移单位是 8B。

所以除了最后一个分片外,前面的每个分片数据长度通常都要是 8 的整数倍。

否则下一个分片的偏移就不是整数。

记住:

除最后一片外,每片数据长度应为 8B 的整数倍。

十六、分片例题

原始 IP 数据报:

总长度:3820B

首部长度:20B

数据部分:3800B

标识:12345

现在下一条链路要求分片后每片总长度不超过:

1420B1420B

每个分片都要有 20B IP 首部。

所以每片最多能装的数据是:

142020=1400B1420-20=1400B

1400 正好是 8 的倍数:

1400/8=1751400/8=175

原始数据部分是 3800B,所以分成:

1400B+1400B+1000B1400B+1400B+1000B

分片 1

数据长度:

1400B1400B

总长度:

20+1400=1420B20+1400=1420B

标识:

1234512345

MF:

11

因为后面还有分片。

片偏移:

00

因为它从原始数据部分第 0 字节开始。

分片 2

数据长度:

1400B1400B

总长度:

1420B1420B

标识:

1234512345

MF:

11

因为后面还有分片。

片偏移:

1400/8=1751400/8=175

分片 3

数据长度:

1000B1000B

总长度:

20+1000=1020B20+1000=1020B

标识:

1234512345

MF:

00

因为这是最后一个分片。

片偏移:

(1400+1400)/8=2800/8=350(1400+1400)/8=2800/8=350

表格总结

分片 | 总长度 | 数据长度 | 标识 | 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

十七、分片题

第一步:算原始数据长度

原始数据长度=原始总长度原始首部长度\text{原始数据长度}=\text{原始总长度}-\text{原始首部长度}

第二步:算每片最大数据长度

每片最大数据长度=MTUIP首部长度\text{每片最大数据长度}=MTU-IP\text{首部长度}

但是要注意:

除最后一片外,每片数据长度必须取不超过该值的最大 8 的倍数。

第三步:切数据

把原始数据部分按最大数据长度切开。

第四步:算每片总长度

分片总长度=IP首部长度+该片数据长度\text{分片总长度}=\text{新}IP\text{首部长度}+\text{该片数据长度}

一般新 IP 首部仍然是 20B。

第五步:填 MF

不是最后一片:MF = 1

最后一片:MF = 0

第六步:算片偏移

片偏移=当前分片数据起始位置/8\text{片偏移}=\text{当前分片数据起始位置}/8

十八、TTL:寿命字段

TTL 全称:Time To Live占 8 bit。

作用:防止数据报在网络中无限循环。

每经过一个路由器,TTL 减 1。

如果 TTL 减到 0,路由器必须丢弃该数据报。

为什么需要 TTL?

如果路由表出错,可能出现环路。

比如:

R1R2R3R1R1\to R2\to R3\to R1

如果没有 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

协议号和端口号的区别

协议号是网络层告诉主机:数据部分交给哪个运输层协议。

端口号是运输层告诉主机:数据交给哪个应用进程。

所以:

IP协议号:网络层运输层TCP/UDP端口号:运输层应用层IP\text{协议号:网络层}\to \text{运输层}TCP/UDP\text{端口号:运输层}\to \text{应用层}

二十、首部校验和 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 首部最小长度

20B20B

因为首部长度字段为 5,单位是 4B。

2. IPv4 数据报最大长度

65535B65535B

因为总长度字段是 16 bit。

3. TTL 的作用

防止 IP 数据报由于路由环路在网络中无限循环。

每过一个路由器减 1,减到 0 丢弃。

4. Protocol 字段的作用

指明 IP 数据报的数据部分应交给哪个上层协议。

TCP 是 6,UDP 是 17,ICMP 是 1。

5. 分片三个字段

标识:同一原始数据报的分片标识相同

MF:后面是否还有分片

片偏移:该片数据在原始数据中的位置,单位 8B

6. 分片时总长度怎么算?

分片总长度=IP首部长度+分片数据长度\text{分片总长度}=IP\text{首部长度}+\text{分片数据长度}

7. 片偏移怎么算?

片偏移=分片数据起始字节/8\text{片偏移}=\text{分片数据起始字节}/8

8. 为什么除最后一片外数据长度要是 8 的倍数?

因为片偏移字段单位是 8B。

9. 为什么路由器要重新算校验和?

因为 TTL 每经过一个路由器都会变化,而 TTL 在 IP 首部中。

10. 为什么 IP 和 TCP/UDP 都有校验?

IP 只校验 IP 首部。

TCP/UDP 校验运输层报文。