1. IPv4 报文格式


IPv4 包头由固定20字节的包头与可变长的选项组成:

2-ipv6基础知识之-数据包_字段

1.1 版本(Version)

版本(Version)域, 长度4比特。标识目前采用的IP协议的版本号。一般的值为0100(IPv4),0110(IPv6)

1.2 IP包头长度(Header Length)

IHL用4位来表示。

由于头部的长度是不固定的,所以头部的IHL域指明了该头部有多长(以32位字的长度为单位)。

IHL的最小长度为5,这个时候表明没有可选项(Option),此4位域的最大值也就是15,也就是说头部的最大长度为15*(32/8) = 60字节,因此可选项(Option) = 60 - 20 = 40字节,可选项的内容最大为40字节。对于某些选项,比如记录一个分组沿途路径的选项,40字节往往太小了,这就使得这样的选项其实没有什么用处。

1.3 服务类型(Type of Service)

服务类型(Type of Service)域, 长度8比特。

8位按位被如下定义 PPP DTRC0

PPP:定义包的优先级,取值越大数据越重要


  • 000 普通 (Routine)
  • 001 优先的 (Priority)
  • 010 立即的发送 (Immediate)
  • 011 闪电式的 (Flash)
  • 100 比闪电还闪电式的 (Flash Override)
  • 101 CRI/TIC/ECP(找不到这个词的翻译)
  • 110 网间控制 (Internetwork Control)
  • 111 网络控制 (Network Control)

DTRCO


  • D 时延: 0:普通 1:延迟尽量小
  • T 吞吐量: 0:普通 1:流量尽量大
  • R 可靠性: 0:普通 1:可靠性尽量大
  • M 传输成本: 0:普通 1:成本尽量小
  • 0 最后一位被保留,恒定为0

1.4 总长度(Total Length)

总长度(Total Length)域, 以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。

1.5 标识(Identification)

标识(Identification)域, 该字段和Flags和Fragment Offest字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。是让目标主机确定一个新到来的分段是属于哪一个数据报的。同一个数据报的的所有分段都有相同的Identification值。

接下来是未使用的位。然后是两个1位域。

DF代表不分段(Don’t Fragment),这是针对路由器的一个命令,它让路由器不要分割该数据报,因为目标主机可能无法将分片重新组合回原来的数据报。例如,当一台计算机启动的时候,它的ROM可能向网络请求一个包含内存映像的一个数据报。在数据报中标记了DF位之后,它就知道该数据将作为一个整体到达接收方,不过这意味着该数据报必须避开最优路径的小分组网络,而不得不走次优的的路径。所有的机器都要求能接受576字节或者更少的分段(4.5k)。

MF代表更多的分段(More Fragment)。除了最后一个分段以外,其它所有的分段都必须设置这一位,它的用途是,接收方可以知道什么时候一个数据报的所有分段已经到达了。

1.6 分段偏移(Fragment Offset)

分段偏移(Fragment Offset)(13位域)域指明了该分段在当前数据报中的什么位置上。除了一个数据报的最后一个分段以外,其他所有的分段必须是8字节的倍数,这里的8字节是基本的分段单位(64bit大小)。由于该域有13位,所以每个数据报最多可以有2^13 = 8192个分段,因此,最大的数据报长度为8192*8 = 65536字节,比Taotal length域还要大1.

1.7 生命期TTL(Time to live)

TTL(Time to live)域(8位域), 当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。

1.8 协议(Protocol)

当网络层组装完成一个完整的数据报之后,它需要知道该如何对它进行处理。协议(Protocol)域指明了该将它交给哪一个传输进程。TCP是一种可能,UDP或者其他协议也是一种可能。协议的编号是整合Internet全球统一的。

1.9 头部校验和(Header checksum)

头部校验和(Header checksum)域只校验头部。这样的校验和对于检测“因路由器中的坏内存而产生的错误”非常有用。因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。其算法是这样的:当数据到达时,所有的16位(半字)累加起来,然后再取结果的补码。该算法的意图是,当数据到达之后,Header checksum的计算结果应该为0.该算法比常规算法更加稳定。请注意,在每一跳上,Header checksum域必须重新计算,因为至少有一个域总是要改变的(即Time to live),但是通过一些技巧可以加速计算。

1.10 源地址(Source address)和目标地址(Destination address)

都用32为表示。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变

1.11 选项(Option)

选项(Option)域的设计意图是:主要用于测试; 允许后续版本的协议包含一些原来的设计中没有出现的信息;允许实验人员试验新的想法;避免为那些不常使用的信息分配头部域。选项是变长的,每一个选项的第一个字节是一个标识码,它标明了该选项。有的选项后面跟着1个字节的选项长度域,然后是一个或多个数据字节。Options域被补齐到4字节的倍数。

2.IPv6


IPv6 数据报包括一个主首部和0 或多个扩展首部。IPv6 包头结构如下图所示。

2-ipv6基础知识之-数据包_字段_02

IPv6包头长度固定为40字节,去掉了IPv4中一切可选项,只包括8个必要的字段,因此尽管IPv6地址长度为IPv4的四倍,IPv6包头长度仅为IPv4包头长度的两倍。

2.1 Version(版本号)

4位,IP协议版本号,值 = 6。

2.2 Traffice Class(通信级别/类别)

8位,指示IPv6数据流通信类别或优先级。功能类似于IPv4的服务类型(TOS/QOS)字段。 (通往目标节点的过程中,这个字段的值可能会被修改)

2.3 Flow Label(流标记)

20位,IPv6新增字段,标记需要IPv6路由器特殊处理的数据流,这个字段是为了给实时数据报交付和QoS提供更多的支持。该字段用于某些对连接的服务质量有特殊要求的通信,诸如音频或视频等实时数据传输。在IPv6中,同一信源和信宿之间可以有多种不同的数据流,彼此之间以非“0”流标记区分。如果不要求路由器做特殊处理,则该字段值置为“0”。 flow label最初是28bit,逐渐修改至rfc2460的20bit。flow label通过伪随机算法生成,介于1至fffff之间。如果一组数据流具有相同的源地址、目的地址、hop-by-hop和routing,那么这组数据流可能共享flow label。由此可见,IPv6结点可以仅通过flow label,不检查其它属性值,即可知道如何处理和转发这组数据流。

2.4 Payload Length(负载长度)

16位负载长度。负载长度包括扩展头和上层PDU,16位最多可表示65535字节负载长度。超过这一字节数的负载,该字段值置为“0”,使用扩展头逐个跳段(Hop-by-Hop)选项中的巨量负载(Jumbo Payload)选项。 总而言之,该字段的值=报文总长度-40

2.5 Next Header(下一包头)

8位,指明识别紧跟在IPv6头后的包头类型,如扩展头(有的话)或某个传输层协议头(诸如TCP,UDP或者ICMPv6)。

由下图可以看出,因为可以有多个扩展头,一个扩展头中还有Next Header字段,用于指明下一个扩展头或者传输层的类型。(扩展可以有多个,但是上层数据只能有一个)

常见的Next Header值:

2-ipv6基础知识之-数据包_校验和_03

2.6 Hop Limit(跳段数限制)

8位,类似于IPv4的TTL(生命期)字段。与IPv4用时间来限定包的生命期不同,IPv6用包在路由器之间的转发次数来限定包的生命期。包每经过一次转发,该字段减1,减到0时就把这个包丢弃。

S

2.7 ource Address(源地址)

128位(16字节),发送方主机地址。

2.8 Destination Address(目的地址)

128位,在大多数情况下,目的地址即信宿地址。但如果存在路由扩展头的话,目的地址可能是发送方路由表中下一个路由器接口。

3.IPv4和IPv6对比图


2-ipv6基础知识之-数据包_校验和_04

IPv4头部字段

IPv6头部字段

版本

相同字段,但是版本号不同

Inter头部长度

已从IPv6中删除。IPv6不包括头部长度字段,因为IPv6头部总是40字节的固定长度。每个扩展头部或者是固定长度或者标识了自己的长度

服务类型

有IPv6的流量类别字段取代

总长度

由IPv6的负载长度字段取代,这个字段仅标识有效负载的长度

标识符&标签&分片偏移

已从IPv6中删除,分片信息并不包括在IPv6头部中,而是包括在分片扩展头部中

生存时间

由IPv6的跳数限制字段取代

协议

由IPv6的下一个头部字段取代

头部校验和

已从IPv6中删除,链路层的校验和会对整个IPv6数据包执行比特位层面的错误校验

源地址

保留,但IPv6地址长度为128位

目的地址

保留,但IPv6地址长度为128位

选项

已从IPv6中删除,IPv6扩展头部取代了IPv4中的可选项


  • IPV6简化了报文头部格式,字段只有8个,加快报文转发,提高了吞吐量
  • 灵活的IP报文头部格式。使用一系列固定格式的扩展头部取代了IPV4中可变长度的选项字段。
  • IPV6中选项部分的出现方式也有所变化,使路由器可以简单路过选项而不做任何处理,加快了报文处理速度;
  • IPv6的地址是IPv4地址的四倍,但是IPv6的头部却只有最小IPv4头部长度的两倍。

参考文档《深入解析IPv6》