#3 IPv6 地址

2021-12-30
$ ip -c -6 addr show dev wlp6s0
3: wlp6s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet6 2409:8a4d:c81:c140::5/128 scope global dynamic noprefixroute
       valid_lft 226977sec preferred_lft 140577sec
    inet6 2409:8a4d:c81:c140:ca67:f46:7f29:1dad/64 scope global temporary dynamic
       valid_lft 376sec preferred_lft 376sec
    inet6 2409:8a4d:c81:c140:fcf0:3456:fac4:3b63/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 376sec preferred_lft 376sec
    inet6 fe80::56f8:128b:b513:e571/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
# ipconfig /all
# ipconfig

无线局域网适配器 WLAN:

   连接特定的 DNS 后缀 . . . . . . . :
   IPv6 地址 . . . . . . . . . . . . : 2409:8a4d:c81:c140::6
   IPv6 地址 . . . . . . . . . . . . : 2409:8a4d:c81:c140:68cd:b350:9fe8:9feb
   临时 IPv6 地址. . . . . . . . . . : 2409:8a4d:c81:c140:757f:88b3:b455:5882
   本地链接 IPv6 地址. . . . . . . . : fe80::68cd:b350:9fe8:9feb%5
   IPv4 地址 . . . . . . . . . . . . : 192.168.1.7
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : fe80::1%5
                                       192.168.1.1

   DHCP 服务器 . . . . . . . . . . . : 192.168.1.1
   DNS 服务器  . . . . . . . . . . . : 2409:804c:2000:1::1
                                       2409:804c:2000:2::1
                                       192.168.1.1

一、地址格式

IPv4 4 字节, 一般用四个十进制的数字表示,xxx.xxx.xxx.xxx 形式,每一段的范围是 0~255。
IPv6 16 字节,一般用 32 个十六进制数表示,每四个一组,共八组,xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx 形式,每一段的范围是 0000~FFFF。

缩写

  1. 高位的 0 可以省略,比如 0001 就可以写成 1
  2. 全 0 段可以省略,用分号表示,比如 fe80::, :: (全 0), 又比如上面的 2409:8a4d:c81:c140::5
    但是, 只能缩写一次,比如 A:B:0:0:C:D:0:0 不能写成 A:B::C:D::, 只能缩写成 A:B::C:D:0:0A:B:0:0:C:D::

百分号

如果一台机器有多张网卡,都有一个 fe80 的链路地址,操作系统无法区分一个包该走哪张网卡出。

在 IPv4 中,不同网卡一般配置了不同子网,比如 172.16.31.0/24, 172.168.32.0/24

但是 IPv6 的分配可以自己生成(无状态地址自动配置),大家都在 fe80 段。

百分号后面附加的是 zone index,这个数据是操作系统解释的。Windows 会采用接口号(整型数),而 Linux 习惯端口名称,比如 eth0, enp7s0。
PS: 推荐阅读: 网卡名称的变迁(ethX -> enpXsY)

  • windows: netsh interface ipv6 show address
  • linux: ifconfig

注意:用在 URL 中时,这个百分号应该转义成 %25

二、前缀

IPv4 有分区的概念,一开始叫做分类网络,ABCDE 五类。后来又有无类网络 (Classless Inter-Domain Routing, CIDR),取任意长度作前缀,比如 172.16.0.0/12 以 1010 1100 0001 做前缀。

IPv6 也有分区的概念,和 CIDR 一样,可以取任意长度作前缀。
比如 fe80::/10 就是以 1111 1110 10 做前缀。

移动网络给我分配的是 /64 段,听说有地方能拿到更短前缀(V2EX, 2020/07, 电信 IPv6 大家还能拿到/56 么)。

如果拿到更短前缀,就可以自己在家划分子网了。根据现在的实践(SLAAC),一个网络最少需要留 64 位,如果正好分的是 64 位前缀,那么就不能采用 SLAAC 方案了,只能走 DHCP。

无状态自动配置

  1. RS, Router Solicitation
  2. RA, Router Advertisement 路由器告诉机器 IPv6 前缀
  3. NS, Neighbor Solicitation 机器广播自己将要采用某一个 IPv6

#2 为什么我还没有用上 IPv6?

2021-08-27
  1. IPv6 是个好东西
  2. 我们都知道 IPv6 是个好东西
  3. 我们都想用上 IPv6

那么问题来了,为什么现在还没有大规模普及 IPv6 呢?我想了半天,得到了一个答案:因为我没做好准备。

确切的说,应该是:无数个我一样的人没有做好准备。
IPv4 很简单的一串数字,虽然世界上大部分人可能都不知道它是个啥,但肯定也存在相当比例能够理解这个概念的人,这对于一项技术的普及很有必要。
但是 IPv6,我作为一个开发者都说不清楚,更别提其他普通用户了。