文章目录
因特网网络层包括三个主要组件:
①
IP 协议
;
②
路由选择
部分,它决定了数据分组从源到目的所流经的路径,由路由选择协议计算出用于网络中转发分组的
转发表
;
③
ICMP 协议
,即互联网控制报文协议,用于网络层的差错和信息报告。ICMP 协议可以看作是 IP 协议的伴随协议,通常实现 IP 协议的同时也需要实现 ICMP 协议。
IPv4 数据报
IPv4 数据报格式
IPv4数据报中的关键字段如下:
-
版本号
字段占 4 位:IP 协议的版本号。如 4 指 IPv4协议,6 指 IPv6 协议。 -
首部长度
字段占 4 位:IP 分组首部长度,
以 4 字节位单位
。大多数 IP 数据报不包含选项字段,所以一般的 IP 数据报具有 20 字节的首部,即该字段为 5。 -
服务类型(TOS)
字段占 8 位:指示期望获得哪种类型的服务,以便对时延、吞吐量或可靠性等有要求的数据报能互相区别开来。只有在网络提供
区分服务
(DiffServ)时才使用该字段,一般情况下不使用,通常该字段的值为零。 -
总长度
字段占 16 位:IP 分组的总字节数(首部+数据),
以字节为单位
。因为该字段长 16 位,所以 IP 数据报的理论最大长度位 65535 字节。然而受最大传输单元(Maximum Transmission Unit,
MTU
)的限制,达不到这么大的分组长度。 -
标识、标志位、片偏移
与 IP 数据报分片有关。 -
生存时间(TTL)
字段占 8 位:IP 分组在网络中可以通过的路由器数(或跳步数)。每当数据报由一台路由器处理时,该字段的值减 1。若 TTL 字段减为 0,则该数据报必须丢弃(并向源主机发送 ICMP 报文)。 -
协议
字段占 8 位:指示 IP 数据报的数据部分应交给哪个特定的传输层协议,仅在 IP 数据报到达其最终目的地才会有用,用于实现多路复用 / 分用。例如,值为 6 表明数据部分要交给 TCP,值为 17 表明数据要交给 UDP,
值为 1 表明数据要交给 ICMP
。 -
首部校验和
字段占 16 位,实现对 IP 分组首部的差错检测。与
UDP 校验和
计算是一样的。
逐跳计算,逐跳检验
。 -
源 IP 地址、目的 IP 地址
字段各占 32 位:分别标识发送分组的源主机 / 路由器(网络接口)和接收分组的目的主机 / 路由器(网络接口)的 IP 地址。 -
选项
字段长度可变,范围在 0~40
字节
之间:携带安全、源选路径、时间戳和路有记录等内容,实际上很少被使用。 -
填充
字段长度可变,范围在 0~3
字节
之间:目的是补齐整个首部,符合 32 位对其,即保证首部长度是 4 字节的倍数。
IP 数据报分片
并不是所有的链路层协议都能承载相同长度的网络层分组,网络链路存在
最大传输单元
(Maximum Transmission Unit,
MTU
),指该链路数据帧
可封装数据的上限
,因此链路层协议的 MTU 严格地限制着 IP 数据报的长度。
不同链路的 MTU 可能是不相同的
。例如,以太网帧能够承载不超过 1500 字节的数据,某些广域网链路地帧可承载不超过 576 字节的数据。
当大的 IP 分组向较小 MTU 链路转发时,
可以
被“
分片
”,IP 分片
到达目的主机后进行“重组”
(路由器只负责分片,不负责组装)。IP 首部的相关字段(总长度、标识、标志位和片偏移)用于标识分片以及确定分片的相对顺序:
-
标识
字段占 16 位:标识一个 IP 分组。
IP 协议利用一个计数器,发送主机每产生 IP 分组计数器加 1,作为该 IP 分组的标识。当某路由器需要对一个数据报分片时,形成的
每个分片具有初始数据报的源地址、目的地址和标识号
。 -
标志
位字段占 3 位。
DF(Don’t Fragment)
为 1 表示禁止分片;
MF(More Fragment)
为 1 表示已经分片了,且该分片非最后一片;
MF 为 0 则表示该分片为最后一片
或未分片
(通过下一个片偏移字段区分)。
-
片偏移
字段占 13 位:一个 IP 分组分片封装原 IP 分组数据的相对偏移量,
以 8 字节为单位
。
假设原 IP 分组总长度为
L
L
L
,待转发链路的 MTU 为
M
M
M
,若
L
>
M
L>M
L
>
M
且
D
F
=
0
DF=0
D
F
=
0
,则可以 / 需要分片:
每个分片具有初始数据报的源地址、目的地址和标识号
。通常分片时,除最后一个分片,其他分片均分为 MTU 允许的最大分片,
一个最大分片可封装的数据应该是 8 的倍数
(由于片偏移字段以 8 字节为单位),因此一个最大分片可封装的数据字节数为:
d
=
⌊
M
−
20
8
⌋
∗
8
d = \lfloor \frac{M-20}{8}\rfloor * 8
d
=
⌊
8
M
−
2
0
⌋
∗
8
需要的总片数为:
n
=
⌈
L
−
20
d
⌉
n = \lceil \frac{L-20}{d} \rceil
n
=
⌈
d
L
−
2
0
⌉
每片的片偏移字段取值为:
F
i
=
d
8
∗
(
i
−
1
)
,
1
≤
i
≤
n
F_i= \frac{d}{8} * (i-1), 1 \leq i \leq n
F
i
=
8
d
∗
(
i
−
1
)
,
1
≤
i
≤
n
每片的总长度字段取值为:
L
i
=
{
d
+
20
1
≤
i
<
n
L
−
(
n
−
1
)
d
i
=
n
L_i=\left\{ \begin{array}{lc} d+20 & 1 \leq i <n \\ L-(n-1)d & i=n \end{array} \right.
L
i
=
{
d
+
2
0
L
−
(
n
−
1
)
d
1
≤
i
<
n
i
=
n
每片的 MF 标志位为:
MF
i
=
{
1
1
≤
i
<
n
0
i
=
n
\textbf{MF}_i=\left\{ \begin{array}{lc} 1 & 1 \leq i <n \\ 0 & i=n \end{array} \right.
MF
i
=
{
1
0
1
≤
i
<
n
i
=
n
举例:
下面的例子中,原 IP 分组总长度为 4000 字节,链路层 MTU 为 1500 字节,DF=0 表示可以分片。那么一个最大分片可封装的数据恰好为 1500-20 = 1480 字节(为 8 的倍数),因此原数据报可以分为 3 片。