《Linux高性能服务器编程》——2.7 IPv6头部结构

2.7 IPv6头部结构

IPv6协议是网络层技术发展的必然趋势。它不仅解决了IPv4地址不够用的问题,还做了很大的改进。比如,增加了多播和流的功能,为网络上多媒体内容的质量提供精细的控制;引入自动配置功能,使得局域网管理更方便;增加了专门的网络安全功能等。本节简要地讨论IPv6头部结构,它的更多细节请参考其标准文档RFC 2460。

2.7.1 IPv6固定头部结构

IPv6头部由40字节的固定头部和可变长的扩展头部组成。图2-6所示是IPv6的固定头部结构。

《Linux高性能服务器编程》——2.7 IPv6头部结构

4位版本号(version)指定IP协议的版本。对IPv6来说,其值是6。

8位通信类型(traffic class)指示数据流通信类型或优先级,和IPv4中的TOS类似。

20位流标签(flow label)是IPv6新增加的字段,用于某些对连接的服务质量有特殊要求的通信,比如音频或视频等实时数据传输。

16位净荷长度(payload length)指的是IPv6扩展头部和应用程序数据长度之和,不包括固定头部长度。

8位下一个包头(next header)指出紧跟IPv6固定头部后的包头类型,如扩展头(如果有的话)或某个上层协议头(比如TCP,UDP或ICMP)。它类似于IPv4头部中的协议字段,且相同的取值有相同的含义。

8位跳数限制(hop limit)和IPv4中的TTL含义相同。

IPv6用128位(16字节)来表示IP地址,使得IP地址的总量达到了2128个。所以有人说,“IPv6使得地球上的每粒沙子都有一个IP地址”。

32位表示的IPv4地址一般用点分十进制来表示,而IPv6地址则用十六进制字符串表示,比如“FE80:0000:0000:0000:1234:5678:0000:0012”。可见,IPv6地址用“:”分割成8组,每组包含2字节。但这种表示方法过于麻烦,通常可以使用所谓的零压缩法来将其简写,也就是省略连续的、全零的组。比如,上面的例子使用零压缩法可表示为“FE80::1234:5678:0000:0012”。不过零压缩法对一个IPv6地址只能使用一次,比如上面的例子中,字节组“5678”后面的全零组就不能再省略,否则我们就无法计算每个“::”之间省略了多少个全零组。

2.7.2 IPv6扩展头部

可变长的扩展头部使得IPv6能支持更多的选项,并且很便于将来的扩展需要。它的长度可以是0,表示数据报没使用任何扩展头部。一个数据报可以包含多个扩展头部,每个扩展头部的类型由前一个头部(固定头部或扩展头部)中的下一个报头字段指定。目前可以使用的扩展头部如表2-3所示。

《Linux高性能服务器编程》——2.7 IPv6头部结构