计算机网络:网络层 - IPv6
- IPv6 数据报
- IPv6 地址
- 冒号十六进制记法
- 地址分类
- IPv4 到 IPv6 过渡
- 双栈协议
- 隧道技术
IPv6
是互联网协议的最新版本,它被设计用来取代现有的 IPv4
协议。这是因为 IPv4
存在一些根本性的限制,而 IPv6
则可以解决这些问题。
最典型的问题就是地址空间不足, IPv4
只有大约 43 亿个可用的 IP 地址,而随着互联网的快速发展,这一数量已经远远不够。而IPv6
有340282366920938463463374607431768211456
个地址,你已经看到眼花了吧,这里也就是 2 128 2 ^ {128} 2128 个地址,也说明IPv6
的地址有128
位,这个数据几乎接近于无穷,估计未来上百年都不会用完这么多地址。
IPv6 数据报
IPv6
数据报格式如下:
IPv6
数据报分为两部分:基本首部
和有效载荷
。
基本首部
:长度为固定的40 byte
,携带数据报的基本信息有效载荷
:该部分包含了数据报真正的数据部分
和任意数量的扩展首部
接下来我从前往后依次讲解每个字段的功能。
版本:
占4 bit
,指明了IP
协议的版本,IPv6
中版本号就是6
。
通信量类:
占8 bit
,为了区分不同数据报的优先级。范围为 0 - 7
,0
代表最低优先级,7
代表最高优先级。
流标号:
占20 bit
,流标号字段用于标识来自同一数据流的不同数据报,并允许网络设备对它们进行优先处理。
所谓的流
,就是一个源点
到一个终点
的一系列数据报,它们有共同的流标号。
有效载荷长度:
占16 bit
,指明有效载荷
部分所占的字节数。最大值是65535
。
下一个首部:
占8 bit
,这个部分相当于IPv4
的可选字段
,用于对IPv6
的首部进行拓展。
其有两种情况:
- 如果该数据报没有扩展首部,那么该字段指明
有效载荷
中的高层协议类型。比如有效载荷为TCP
数据报时,该字段值为6
;为UDP
数据报时,该字段值为17
。 - 如果该数据报有扩展首部,该字段指向的是第一个扩展首部类型。
比如以下可以扩展的首部:
- 路由头部 :用于指定数据包的路由路径。
- 分片头部 :用于将数据包分割成多个片段,以便在网络中传输。
- 鉴别头部 :用于对数据包进行身份验证。
- 封装安全负载头部:用于对数据包进行加密。
跳数限制:
占8 bit
,用于限制数据报的传输次数,相当于IPv4
中的TTL
。每当路由器转发一次数据报,跳数限制
就减一,当为0
时,路由器就会丢弃该报文。
可以看到,相比于IPv4
数据报,IPv6
数据报的设计更加简单。
主要来说,IPv6
数据报对IPv4
数据报的首部做了以下更改:
- 取消
首部长度
字段 - 取消
服务类型
字段 - 取消
总长度
字段,改用有效载荷长度
字段 - 取消
TTL
字段,改用跳数限制
字段 - 取消
协议
字段,改用下一个首部
字段 - 取消
首部检验和
字段 - 取消
选项
字段,改用扩展首部
来实现扩展功能
可以看到,IPv6
几乎一直在做减法,从而使数据报更加简洁。
剩下的就是源地址
和目的地址
了,因为IPv6
数据报的地址长度为128
,所以这两个字段长度也是128 bit
,接下来我们就来看看IPv6
地址。
IPv6 地址
冒号十六进制记法
由于地址要占128
位,如果用之前的点分十进制
表示这个地址,就会很长。因此IPv6
用冒号十六进制
的方法来记录一个IPv6
地址。
其基本记法为:每16
位二进制分为一组,用4
个十六进制表示,各组之间用冒号分隔。
比如下面这个地址:
68E6:8C64:00FF:FFFF:0000:1180:960A:FFFF
最后一个地址就被分为了8
个组。
以上只是基本记录方法,冒号十六进制记法还允许对满足特定要求的地址进行缩写。
一个组内部,如果
0
前面没有数字,且后面有数字,那么这个0
可以省略。
比如刚刚的地址:
68E6:8C64:00FF:FFFF:0000:1180:960A:FFFF
第三组00FF
,由于00
都在数字F
前面,可以将其省略为FF
;第五组0000
,前三个0
可以被省略,最后表示为0
;
但是比如说960A
这个组,由于这个0
前面有数字,所以不能省略。
最后这个地址就写为:
68E6:8C64:FF:FFFF:0:1180:960A:FFFF
确实简短了一些。
零压缩
:一串连续的0
可以被压缩为一对冒号::
比如地址:
FF05:0:0:0:0:0:0:B3
中间连续的六组0000
,可以被压缩为一对冒号::
,最后地址就变成了:
FF05::B3
因为一个IPv6
数据报被分为了8
组,上面这个地址只有两组,中间用一对冒号,说明中间剩下的6
组都是0000
。
但是要注意:一个地址只能进行一次零压缩
。
因为如果进行了多次零压缩
,就不能确定一个地址了。
比如这个地址:
FF05::B3::9FFF
这个地址只有三个组,说明有五个组都是0000
,请问FF05::B3
有几组,B3::9FFF
中间又有几组呢?
可以看到,这是不确定的,所以当进行多次零压缩
,就无法确定一个地址了。
兼容IPv4地址:
由于IPv4
地址采用点分十进制
,如果想要在点分十进制
与冒号十六进制
之间转换,还是有点麻烦的。因此如果冒号十六进制
内部的地址是一个IPv4
地址,可以采用点分十进制
作为地址后缀。
比如一个IPv4
地址128.10.2.1
,在IPv6
中其实就只占用了最后两个分组,前六个分组都是0000
。于是我们可以这样表示:
0:0:0:0:0:0:128.10.2.1
前半部分是冒号十六进制
,最后两个分组是点分十进制
。我们可以再进行一次零压缩
,此时就变成了:
::128.10.2.1
通过这种方式,我们就可以很快把一个IPv4
地址转化为IPv6
地址了。
不过要注意:IPv4
地址一定可以转化为IPv6
地址,但是IPv6
地址不一定可以转化为IPv4
地址。
结合CIDR:
IPv6
地址也可以使用CIDR
来划分网络前缀
与主机号
,和IPv4
是相同的。
比如一个网络的60
位网络前缀为:
12AB:0000:0000:CD30:0000:0000:0000:0000
其可以表示为以下三种方式:
12AB:0000:0000:CD30:0000:0000:0000:0000/60
12AB::CD30:0000:0000:0000:0000/60
12AB:0000:0000:CD30::/60
第二种和第三种方式其实就是进行了一次零压缩
,不过压缩了不同的部分。
地址分类
接下来我们看看特殊的IPv6
地址:
地址类型 | 二进制形式 | CIDR结合冒号十六进制 |
---|---|---|
未指明地址 | 128位全0 | ::/128 |
环回地址 | 前127位全0 ,最后一位为1 | ::1/128 |
多播地址 | 前8位全1 ,后120位全0 | FF00::/8 |
本地站点单播地址 | 前10位为1111111011 ,后120位全0 | FEC0::/10 |
本地链路单播地址 | 前10位为1111111010 ,后120位全0 | FE80::/10 |
除了这些地址,剩下的都是全球单播地址
。
一个IPv6
数据报,有以下三种传输方式:
- 单播:即点对点通信
- 多播:一对多的通信,
IPv6
将广播
视为一种多播
- 任播:
IPv6
增加的一种类型,任播
的终点是一组主机,但是只有一个主机会受到数据报,也就是“传播给这一组内部的任意一个计算机”,所以叫任播
。一般来说是传递给距离最近的一个。
IPv4 到 IPv6 过渡
推行IPv6
不是一蹴而就的,只能慢慢逐步演进,让IPv6
慢慢地替代IPv4
。由于目前主流的数据报还是IPv4
,所以IPv6
数据报想要在网络中传输,就必须兼容IPv4
。主要有两种方法:双栈协议
和隧道技术
双栈协议
双栈协议的运行过程可以概括为:
- 地址绑定: 设备同时拥有 IPv4 和 IPv6 地址。
- 协议选择: 设备根据需要选择使用 IPv4 还是 IPv6 协议进行通信。
- 数据包封装: 根据选择的协议,数据包被封装成相应的协议格式。
上图中,路由器B
和路由器E
就是两个支持双栈协议的设备,当主机A
要给主机F
发送IPv6
数据报时,由于要经过IPv4
网络。路由器B
会把IPv6
数据报按照一定格式转化为IPv4
数据报,随后在IPv4
网络中传输。当路由器E
接收到该数据报后,再将其转化成IPv6
数据报。这样就可以完成IPv6
数据报在IPv4
网络中的传输。
双栈协议
通过同时使用 IPv4
和 IPv6
协议,确保设备能够与现有网络和设备进行通信,并为未来 IPv6 时代做好准备。它通过灵活选择协议,提高通信效率,并确保与现有网络的兼容性。
双栈协议
的优缺点:
- 优点:效率高
- 缺点:由于会发生
IPv4
与IPv6
数据报的格式转化,有可能会造成损失
隧道技术
隧道技术是一种在现有网络基础上建立虚拟网络连接的技术。它通过将一种网络协议的数据包封装在另一种网络协议的数据包中,实现跨越不同网络环境的通信。
相比于双栈协议
,隧道技术
不是直接把IPv6
转化为IPv4
,而是把IPv6
数据报作为数据,封装在IPv4
内部。这样就可以通过IPv4
传输了。
隧道技术
的优缺点如下:
- 优点:这个过程不会修改原始的数据报,是无损的
- 缺点:由于进行额外封装,整个数据报变大,效率降低