周日,大早上六点多和疯子去菜市场买了菜,顺便打了一壶糯米烧酒,回来把我的正则安哥哄睡了之后,继续思考IPv6的细节。

一台主机启动后,每一块网卡都会自动生成一个fe80打头的 链路本地地址
,这个地址在Linux上你删都删不掉,不信你试试,在Windows是可以删掉的,但是只要你重置网卡,它就会自动生成…

这个所谓的链路本地地址到底有何怪异?

我的主机安装两块网卡,分别连接两个网络, 在系统初启的时候,两块网卡分别自动获得了两个IPv6地址:
enp0s8:fe80::fbb2:a1e:e59:15eb/64
enp0s9:fe80::ac5b:e7c6:9d00:797d/64

其中enp0s9的对端连接着另外一台机器的网卡,其网卡IP是:
eth0:fe80::ebad:9145:fe66:55cc/64

这里,enp0s9和eth0是直连的,二者可以直接ping通吗?

不能!

如果像IPv4那样理解为仅仅 二者是直连的 以及 二者是同一网段的 就可以ping通的话,那就错了。

事实上,你会发现, 全世界所有的网卡的链路本地地址都是同一个fe80::/16一个网段的! ,但是它们却不一定能彼此ping通。这是和IPv4之间的大不同。

IPv4之所以直连的同一网段的两个地址之间可以互通,完全是因为当你配置IP地址的时候,系统自动生成的 链路路由
使其可以互通,但是IPv6的所有链路本地地址都在一个网段,仅仅靠IP路由,便不足以使其互通。

IPv6地址是有严格scope限制的, 两个地址首先要被限制在自己的scope内,其次才考虑路由的连通性。


比如两个链路本地地址,必须是二层直连的,才能相互ping通。为了避免歧义,在上面的例子中,在操作上,如果你想从enp0s9这块网卡的链路本地地址ping通对端的eth0链路本地地址,那么你必须使用下面的命令:
ping6 fe80::ebad:9145:fe66:55cc%enp0s9
注意,后面的 %enp0s9 是必须的,它规定了 一条链路的维度!
否则,没有这个维度限制的话,ping6命令接下来的底层就会按照全球地址最长前缀匹配规则去寻址,全世界所有网卡,包括该主机自己的多块网卡,均拥有相同网段fe80::/16的地址,按照IPv4的规则,这实属同一网段,这会令其费解!左边也有链路路由,右边也有同样的链路路由,到底往哪走!?

有了链路scope维度的限制,链路路由又成了唯一的了,这样自然就通了。


IPv6声称自己实现了严格的地址scope,然而IPv6除了链路本地地址以及本地主机地址有着严格的scope限制之外,别的scope再也没有类似的限制了。我们知道IPv6的socpe包括host,link,site,global,但是site被废弃了,因此就再也没有了严格的限制。


不过,思想还是重要的,这是IPv6的创举,IPv4就没有类似的机制。但是IPv4模拟了scope,比如169.254这个网段的地址,就模拟了link-local链路本地地址。

总结一下:

* IPv6的连通性首先要在自己的scope内考虑。
* IPv6地址在自己的scope内基于IP路由来确保连通性。
浙江温州皮鞋湿,下雨进水不会胖。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信