介绍
网络层协议通过源主机地址和目的主机地址(IP地址)把数据传输到不同的主机,如有必要,它还提供分片和重组功能
所以,网络层协议有两个基本功能:寻址和分片
传输层模块(TCP模块或UDP模块)会调用Internet模块将传输层数据段(包括传输层协议首部和用户数据)作为Internet数据报的数据部分,传输层模块会将Internet标头中的目标地址(IP地址)和其他参数传给Internet模块使用
为什么是上层协议把属于网络层的目的IP地址字段传给网络模块呢?
因为是应用层要把数据传输给其他的主机,所以应用层必定知道对方的IP地址,但是这个IP地址是在下层的协议网络层填充的,所以就通过传输层把它当成参数传给网络层模块咯
这里提及到TTL(Time to Live)生存时间字段,这个字段代表着什么呢?
生存时间是IP数据报生命周期上限的指示。它由数据报的发送者设置,并在在路由的网关处减少。如果在IP数据报到达其目的地之前生存时间达到零,则IP数据报被销毁。可以将生存时间视为自毁时间限制,以防止网络包在网络中长期存在,消耗网络带宽资源
关联的其他协议
可以看出,网络层协议位于链路层和传输层之间,它还有一个子协议ICMP
我们知道网关属于三层设备,也就是网络层设备,所以网关到网关的GGP协议也是IP模块处理
网络层头部格式
字段 | 长度 | 描述 |
---|---|---|
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
bit0,保留位
bit1,是否允许分片标志位
bit2,是否最后一个分片标志位
- Time to Live
TTL值表示该数据报在网络中生存的最大时间,单位为秒。当报文每经过一个网关时,该字段减1,即使网关在不到1秒内处理完数据报,TTL仅被视为可能存在的时间。当TTL值为0时,网关会丢弃它。但是,如果接收端收到的报文TTL为0,还是可以接收并处理的。TTL的目的是使无法传递的数据报被丢弃,并限制最大数据报生命周期
- Header Checksum
由于网络层头部的某些字段会改变(比如TTL、Flags),所以需要处理网络层头部的地方都会重新计算校验和
校验和采用简单算法,也就是反码求和法
- Options
option的格式有两种:
- 单个字节,表示选项类型
- 一个字节表示选项类型,一个字节表示选项长度,实际的选项数据
接收方怎么知道实际的选项数据多长呢?就是根据前面的选项长度来的
这个选项长度,包含了前面的选项类型,自己的选项长度,还有后面的选项数据,切记切记
选项类型这个字节,有三个字段:
copied flag表示该选项被复制到分片时的所有分片包,0 = not copied,1 = copied
从这里看出,option字段,有的会复制到所有分片包,有的不会。不会的情况,是只复制在分片包的首片里吗?应该是的吧
option class分为:
所有的options字段有以下这些:
分片和重组
这里要重点讲一下分片和重组
网络层分片针对的是网络层的有效载荷,也就是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为零),则计算总数据长度。如果这个分片完成了数据报(通过检查分片块表中设置的位来测试),那么数据报被发送到数据报处理的下一步;如果定时器计时结束还未完成重组,则释放此缓冲区标识符的所有重组资源
所以说,重组有一个定时器,需要在这个时间内收到所有分片包并完成重组