IPV6|青训营笔记

243 阅读8分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 22 天
前言 本文分享来自字节跳动飞书商业应用研发部(Lark Business Applications)ESOP技术团队内部技术分享,分享主题为《IPv6与IPv4对比学习》,希望通过本次分享内容的沉淀和总结能够帮助团队同学加深对IPv6的了解。 本文没有直接罗列IPv6的各种特性,而是通过对比的方式来介绍该协议。在学习知识的过程中,了解相关的历史背景有助于我们更好的掌握该知识点,某种程度上来说,IPv4就是IPv6产生的历史背景,因此,笔者认为通过熟悉的IPv4来学习不那么熟悉的IPv6是一种不错的学习方式。 可以将本文看作相关知识点的概述和索引,文章首先介绍了IPv4和IPv6的地址表示和数据报区别,然后详细介绍了编址方法的演进,最后介绍了各类地址的分配方式以及与IPv4和IPv6相关的协议。 地址表示 IPv4地址

使用32位正整数表示,需要4字节存储,可以提供约2^32≈4.3x10^9个地址; 表示方法:为了方便记忆采用了点分十进制的标记方式,如114.114.114.114就是一个IPv4地址。

IPv6地址

采用128位正整数表示,需要16字节存储,可以提供约2^128≈3.4x10^38个地址; 表示方法:如果采用与IPv4相同的标记方式,则地址会很长,因此点分十进制不再适用。于是人们采用了冒号十六进制法来表示IPv6地址,它将每个16位的值用十六进制表示,各值之间用冒号分隔,如2001:0DB8:0000:0023:0008:0800:200C:417A就是一个IPv6地址; 简化方式1:在这一表示方法中,允许将每个16进制值的前导0省略,即上面的地址可以表示为2001:DB8:0:23:8:800:200C:417A; 简化方式2:某些情况下,一个IPv6地址可能包含很长的一段0,可以把一段连续的0压缩为::,如FF01:0:0:0:0:0:0:1101可以表示为FF01::1101。但为了保持地址解析的一致性,零压缩在一个地址中只能使用一次,如FF01:0:0:0:8:0:0:1101可以表示为FF01::8:0:0:1101或FF01:0:0:0:8::1101,不能表示为FF01::8::1101。

数据报格式 IPv4和IPv6数据报结构如下图所示,其中左侧为IPv4首部和数据报,右侧为IPv6首部和数据报。

图1 IPv4与IPv6数据报结构图 IPv4 IPv4首部字段如表1所示:

字段名长度说明版本4 bitIP协议的版本号,在IPv4中始终为4。首部长度4 bit首部长度,单位为4字节。假如首部的长度为20字节,则首部长度字段应为0101=5,即5*4=20字节,因此这也导致了首部长度必须为4字节的整数倍,当首部长度不是4字节的整数倍时,需要用最后的填充字段来填充。区分服务8 bit用于保证QoS,最初被定义为服务类型字段,实际上并未使用,1998年被IETF重定义为区分服务。只有在使用区分服务时,这个字段才起作用,一般的情况下该字段不被使用,这里给出一个使用该字段的例子:VoIP。总长度16 bit表示首部和数据部分长度之和,单位为字节。因此IPv4数据报最长为65535字节。标识16 bit用于标识属于相同数据报的分片,当数据报大小超过MTU需要分片时,所有数据报片就会被赋予一个相同的标识。标志3 bit只有其中2位被使用,分别为MF和DF。其中: MF为1表示仍有其他分片,MF为0则表示当前分片为最后一个分片; DF为1表示不能分片,DF为0则表示可以分片。片偏移13 bit较长的分组在分片后,某个分片在原分组的相对位置,单位为8字节。生存时间8 bit用于表示数据报在网络中的跳数限制。每经过一个路由器,路由器就会将TTL减1,当生存时间为0时,该数据报会被丢弃.协议8 bit指出此数据报携带的数据使用的是何种协议。首部校验和16 bit用于校验首部。源地址32 bit发送端地址。目的地址32 bit接收端地址。可选字段可变很少被使用,用于支持排错,测量和安全等措施。长度可变,从1到40个字节不等。 表1 IPv4首部字段 IPv6 2017年7月发布的IPv6协议文档:RFC 8200: Internet Protocol, Version 6 (IPv6) Specification,目前已成为互联网正式标准,IPv6的首部字段如下表所示:

字段名长度说明版本4 bitIP协议的版本号,在IPv6中始终为6。通信量类8 bit类似于IPv4的区分服务字段,详细了解可参考RFC 2474和RFC 3168。流标签20 bit使用源地址, 目的地址和流标签构成的三元组唯一确定一个流, 因而属于同一个流的数据报都拥有相同的流标签,运营商可以为特定流保证指明的服务质量。详细了解可参考RFC 6437有效载荷长度16 bit有效载荷的大小,单位为字节。下一个首部8 bit当没有扩展首部时,该字段与IPv4首部中的协议字段相同; 当出现扩展首部时,该字段则用于标识第一个扩展首部的类型; 其应用如图2所示。跳数限制8 bit与IPv4首部中的生存时间相同,由发送端赋值,每经过一个路由器便减1,当值为0时,如果是中间路由器则将该数据报直接丢弃,如果是接收端则正常接收。源地址128 bit发送端地址。目的地址128 bit接收端地址。 表2 IPv6首部字段 有效载荷内容如下表所示:

字段名说明扩展首部在IPv6中,可选的网络层信息被编码在单独的扩展首部中,这些扩展首部可以放置在数据报中首部和上层协议首部之间。扩展首部可以有0个或多个,根据不同的需要可以装载不同的首部,比如要实现IPv4中的分片功能,只需要增加一个分片扩展首部即可,图2为RFC 8200给出的扩展首部应用示例。数据IPv6数据报中的数据部分。 表3 有效载荷内容

图2 扩展首部示意图 区别 相比IPv4,IPv6首部:

去掉了“首部长度”,这是因为IPv6的首部变成了固定的40字节,无需再保存首部长度; 去掉了“标识”、“标志”、“片偏移字段”,分片的职责被移交给了“下一个首部”和“扩展首部”,同时IPv6不再允许在中间路由器进行分片与重组,仅允许在源与目标主机执行此操作; 去掉了“首部校验和”,这是由于数据链路层和传输层均有校验机制。取消该字段能够加快路由器对数据报的处理速度; 去掉了“可选”字段,这一职责同样被移交给“下一个首部”和“扩展首部”完成,增加了路由器的处理速度; 将“总长度”调整为了“有效载荷长度”,该字段在调整后仅表示有效载荷的长度; 将“生存时间”调整为了“跳数限制”,命名与作用更加一致; 将“协议”调整为了下一个首部; 将“源地址”与“目的地址”的长度由32位增加到了128位; 对“区分服务”的调整以及增加了“流标号”字段,笔者对这两个字段了解有限,这里不做介绍。

IPv6的有效载荷:

增加了“扩展首部”,首部和扩展首部构成了一个“链表”,其扩展性更好,同时去掉了“选项”字段,并将该职责改为由扩展首部完成,这一变化大大增加了中间路由器的处理速度。

作者:字节跳动技术团队 链接:juejin.cn/post/715659… 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。