介绍

网络层协议通过源主机地址和目的主机地址(IP地址)把数据传输到不同的主机,如有必要,它还提供分片和重组功能

所以,网络层协议有两个基本功能:寻址和分片

传输层模块(TCP模块或UDP模块)会调用Internet模块将传输层数据段(包括传输层协议首部和用户数据)作为Internet数据报的数据部分,传输层模块会将Internet标头中的目标地址(IP地址)和其他参数传给Internet模块使用

为什么是上层协议把属于网络层的目的IP地址字段传给网络模块呢?

因为是应用层要把数据传输给其他的主机,所以应用层必定知道对方的IP地址,但是这个IP地址是在下层的协议网络层填充的,所以就通过传输层把它当成参数传给网络层模块咯

这里提及到TTL(Time to Live)生存时间字段,这个字段代表着什么呢?

生存时间是IP数据报生命周期上限的指示。它由数据报的发送者设置,并在在路由的网关处减少。如果在IP数据报到达其目的地之前生存时间达到零,则IP数据报被销毁。可以将生存时间视为自毁时间限制,以防止网络包在网络中长期存在,消耗网络带宽资源

关联的其他协议

详解RFC 791文档_tcp/ip

可以看出,网络层协议位于链路层和传输层之间,它还有一个子协议ICMP

我们知道网关属于三层设备,也就是网络层设备,所以网关到网关的GGP协议也是IP模块处理

详解RFC 791文档_网络层_02

网络层头部格式

详解RFC 791文档_网络协议_03

字段

长度

描述

Version

4 bits

表示网络层头部格式版本号,IPv4就是4

IHL

4 bits

网络层头部长度,以4字节为单位,最小值是5

Type of Service

1 byte

服务质量参数化,通过特定网络时据此提供服务优先级

Total Length

2 bytes

数据报的长度,包括网络层头部和有效载荷

Identification

2 bytes

发送者分配的一个标识符,用于帮助组装分片包

Flags

3 bits

控制标志

Fragment Offset

13 bits

分片包偏移量,表示该分片包payload的第一个字节在整个数据报中的位置

Time to Live

1 byte

表示允许数据报在网络中保留的最长时间

Protocol

1 byte

下一级要处理数据的协议号

Header Checksum

2 bytes

网络层头部校验和

Source Address

4 bytes

源IP地址

Destination Address

4 bytes

目的IP地址

Options

可变

携带的可选的信息

  • IHL

这个字段表示网络层头部长度,它以4字节为单位,也就是说IHL5,网络层头部长度就是5x420

网络层头部最大长度为60,最小长度为20

  • Total Length

Total Length为2个字节,最大值65535,但是如果一条网络数据报这么大的长度,肯定不可能

只有在确定目的地能接收更大的数据报的前提下,才会建议主机发送大于576个字节的数据报,比如TCP协商一致的情况。对于UDP协议来说,一般选择576个字节通信(这里指的是网络层头部+UDP头部+有效载荷)。但是不代表UDP协议只能传输这么点数据

  • Flags

详解RFC 791文档_网络协议_04

bit0,保留位
bit1,是否允许分片标志位
bit2,是否最后一个分片标志位

  • Time to Live

TTL值表示该数据报在网络中生存的最大时间,单位为秒。当报文每经过一个网关时,该字段减1,即使网关在不到1秒内处理完数据报,TTL仅被视为可能存在的时间。当TTL值为0时,网关会丢弃它。但是,如果接收端收到的报文TTL为0,还是可以接收并处理的。TTL的目的是使无法传递的数据报被丢弃,并限制最大数据报生命周期

  • Header Checksum

由于网络层头部的某些字段会改变(比如TTL、Flags),所以需要处理网络层头部的地方都会重新计算校验和

校验和采用简单算法,也就是反码求和法

  • Options

option的格式有两种:

  • 单个字节,表示选项类型
  • 一个字节表示选项类型,一个字节表示选项长度,实际的选项数据

接收方怎么知道实际的选项数据多长呢?就是根据前面的选项长度来的

这个选项长度,包含了前面的选项类型,自己的选项长度,还有后面的选项数据,切记切记

选项类型这个字节,有三个字段:

详解RFC 791文档_网络协议_05

copied flag表示该选项被复制到分片时的所有分片包,0 = not copied,1 = copied

从这里看出,option字段,有的会复制到所有分片包,有的不会。不会的情况,是只复制在分片包的首片里吗?应该是的吧

option class分为:

详解RFC 791文档_网络协议_06

所有的options字段有以下这些:

详解RFC 791文档_网络层_07

分片和重组

这里要重点讲一下分片和重组

网络层分片针对的是网络层的有效载荷,也就是IP payload。一段数据在传输层封装完头部后(传输层头部+用户数据),在网络层作为网络层的payload,如果需要分片,针对这个payload进行分片,分片后的数据段,每个都需要添加网络层头部,成为一个完整的分片包

而像ICMP这种,作为网络层内的一个子协议,如果需要分片,也是把ICMP头部+payload作为网络层的payload,进行分片,然后每个分片再添加网络层头部,成为一个完整的分片包

options字段在分片时会复制一些,没有复制的option仅保留在第一个分片包中

受分片影响的字段有哪些呢?

  • options字段
  • more fragments字段
  • fragment offset字段
  • IHL字段
  • total length字段
  • checksum字段

如果don’t fragment标志位被设置的话,不允许数据报在网络层被分片,包括在网关时由于MTU需要分片的情况。这种情况下报文会被丢弃

接收端对于收到的分片包又是如何重组的呢?

首先,接收端有一个缓冲区标识符,它作为source address、destination address、protocol和identification字段的关联标识符

如果收到的是一条完整的未分片的报文(即fragment offset和more fragments字段为0),则与此缓冲区标识符关联的所有重组资源被释放,数据报被转发到下一步处理

如果收到多个分片包,则用分配的重组资源进行重组。重组资源由数据缓冲区、头缓冲区、分片块位表、总数据长度字段和定时器组成。来自分片的数据根据其分片偏移量和长度放置在数据缓冲区中,并在收到的分片块对应的分片块位表中设置位。如果这是第一个分片包(即fragment offset为零),则此标头被放置在标头缓冲区中。如果这是最后一个分片包(即more fragments为零),则计算总数据长度。如果这个分片完成了数据报(通过检查分片块表中设置的位来测试),那么数据报被发送到数据报处理的下一步;如果定时器计时结束还未完成重组,则释放此缓冲区标识符的所有重组资源

所以说,重组有一个定时器,需要在这个时间内收到所有分片包并完成重组