IP报文头部简析

IPv4

版本(Version)

4bit的版本字段表示IP的版本号。如果为0100表示IPv4,如果为0110表示IPv6。

Internet头部长度(Internet Header Length)

4bit的首部长度字段表示IP首部的总长度,其中包括选项字段(如果有)。该字段的表示的长度单位为32bit(4 bytes),因此首部长度最大为15(1111)×32bit=60bytes。在没有选项时,该字段的值为5,表示普通的IP包头长度20bytes

服务类型(Type of Service)

该字段长度为8比特位。被分为俩个部分,前6位被称为区分服务字段(DS);后2位是显示拥塞通知字(ECN),用于QS。

总长度(Total Length)

16个bit的总长度字段表示整个IP数据报的长度,以字节为单位。通过这个字段和IHL字段,我们知道数据报的数据部分从哪里开始,以及它的长度。所以IP数据报的最大长度为16个1=65535bytes。

标识(Identification)

16bit的标识字段唯一的标识主机发送的每一份数据报,由主机生成具有唯一性。通常每发送一份报文该值加1。该值在数据包分片时,会复制到每一个片中。所以在重组分片包的时候会观察该值,把该值相同的分片收集到一起重组。

标志(Flag)

3bit的标识字段每一位都有特定的含义,该字段主要用来分片和重组。

第1个bit为保留位(Reserved Bit),一般为0。

第2个bit为不分片位(Don’t Fragment),当为1时标识未分片,0则标识被分片。

第3个bit为更多片位(More Fragment),该位表示后面是否还有更多的分片,置位1时表示后面还有,所以除了最后一片报文,其他分片报文该位全部置1。

片偏移(Fragment Offset)

13bit的片偏移字段表示分片时,每一个分片的数据字段偏移原始数据报开始处的位置。比如原始数据报的数据字段总长为1461bytes,使用TCP传输协议,那么对该数据报进行分片,第一片的offset字段为0,第二片的offset字段就应该为1460。

生存时间(Time To Live)

8bit的生存时间字段表示该IP数据包可以经过的路由器的最大数量。每经过一台路由器该字段的值减1。如果该字段的值减到了0还没有送达目的地,那么该IP数据包将被丢弃。

协议(Protocol)

8bit的协议字段表示在IP上层承载的是什么协议。比如:0x01表示ICMP协议、0x06表示TCP协议、0x11表示UDP协议等。

首部校验和(Header Checksum)

16bit的首部校验和字段用来使接收端检验收到的报文是否正确。该字段只对IP首部计算校验和不包含后面的数据字段。数据区的错误留待上层协议处理。

选项(Option)

一般不使用该字段,该字段的值以32bit为单位,不足时以0补充。

IPv6

版本(Version)

版本字段用来表示IP数据报使用的是IPv6协议封装,占4位,对应值为6(0110)。

通信分类(Traffic Class)

通信分类字段用来标识对应IPv6的通信流类别,或者说是优先级别,占8位,类似于IPv4中的ToS(服务类型)字段。

流标签(Flow Label)

流标签字段是IPv6数据报中新增的一个字段,占20位,用于区分实时流量类型。流标签字段有源节点分配,通过流标签、源地址、目的地址三元组方式就可以唯一标识一条通信流,而不用像IPv4那样需要使用五元组方式(源地址、目的地址、源端口、目的端口和传输层协议号),提高报文处理效率。

有效载荷长度(PayLoad Length)

有效载荷长度字段是以字节为单位的标识IPv6数据报中有效载荷部分(包括所有扩展报头部分)的总长度,也就是除了IPv6的基本报头以外的其他部分的总长度,占20位。

下一个头部(Next Header)

下一个头部字段用来标识当前报头(或者扩展报头)的下一个头部类型,占8位。每种扩展报头都有其对应的值。下一个头部字段内定义的扩展报头类型与IPv4中的协议字段值类似,但在IPv6数据报中紧接着IPv6报头的可能是IPv6扩展报头。

跳数限制(Hop Limit)

跳数限制于IPv4报文中的TTL字段类似,指定了报文可以有效转发的次数,占8位。报文每经过一个路由器结点,跳数值就减1,当此字段值减到0时,则直接丢弃该报文。

源地址(Source IP Address)

源IP地址字段标识了发送该IPv6报文源节点的IPv6地址,占128位。

目的IP地址(Destination IP Address)

目的IP地址字段标识了IPv6报文的接受节点的IPv6地址,占128位。

扩展头部

由于在IPv4的报头中包含了几乎所有的可选项,因此每个中间路由器都必须检查这些选项是否存在。在IPv6中,这些相关选项被统一移到了扩展报头中,这样中间路由器不必处理每一个可能出现的选项(仅有“逐跳选项”报头是必须要处理的),提高了处理器处理数据报文的速度,也提高了其转发的性能。

IPv6扩展报头附加在IPv6报头目的IP地址字段后面,可以有0个,或者多个扩展报头。主要的IPv6扩展报头有一下几类:

逐跳选项头(Hop-by-hop Options Header)

本扩展报头类型值为0,此扩展报头须被转发路径所有节点处理。目前在路由告警(RSVP和MLDv1)与Jumbo帧处理中使用了逐跳选项头,因为路由告警需要通知到转发路径中所有结点,而Jumbo帧是长度超过65535字节的报文,传输这种报文需要转发路径中所有结点都能正常处理。

目的选项头(Destination Options Header)

本扩展报头类型值为60,只可能出现在两个位置:路由头前,这是此选项头被目的节点和路由头中指定的结点处理;上层头前(任何的ESP头后),此时只能被目的结点处理。

路由头(Routing Header)

本扩展报头类型值为43,用于源路由选项和移动IPv6。

分段头

本扩展报头类型值为44,用于标识数据报的分段,在IPv4中就有对应的字段。当源节点发送的报文超过传输链路MTU(源节点和目的节点之间传输路径的MTU)时,需要对报文进行分段时使用。

认证头

本扩展报头类型值为51,用于IPSec,提供报文验证,完整性检查。

封装安全有效载荷头

本扩展头类型值为50,用于IPSec,提供报文验证、完整性检查差和加密。

上层头

这是用来标识数据报中上层协议类型,如TCP、UDP、ICMP等。

注意:目的选项头最多出现两次,一次在路由头前,一次在上层协议头前,其他选项头最多只能出现一次。IPv6节点必须能够处理选项头(逐跳选项头除外,它固定只能紧随基本报头之后)在任意位置出现,以保证互通性。


2715 Words

2019-08-08 08:00 +0800