【原创】如何理解 IPv6 地址格式

之前看到的 TCP 连接信息如下 
[root@upu_2 ~][root@upu_2 ~]# lsof -i :2181 -P|grep LISTEN
java     7853 root   16u  IPv6    21294      0t0  TCP *:2181 (LISTEN)
[root@upu_2 ~][root@upu_2 ~]# lsof -i :26888 -P
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java     7853 root   27u  IPv6 15051913      0t0  TCP 10.23.46.36:2181->10.23.46.36:26888 (ESTABLISHED)
css     29804 root  113u  IPv4 15051910      0t0  TCP 10.23.46.36:26888->10.23.46.36:2181 (ESTABLISHED)
[root@upu_2 ~][root@upu_2 ~][root@upu_2 ~]# netstat -natp|grep 26888
tcp        0      0 10.23.46.36:26888           10.23.46.36:2181            ESTABLISHED 29804/css           
tcp        0      0 ::ffff:10.23.46.36:2181     ::ffff:10.23.46.36:26888    ESTABLISHED 7853/java           
[root@upu_2 ~]
可以看到, 
  • zookeeper 以 IPv6 类型创建了监听 socket
  • 业务(zk客户端)基于 IPv4 类型建立了到 zookeeper 的 TCP 连接
  • 从 zookeeper 侧看该 TCP 连接,其类型为 IPv6 
而其中 zookeeper 看到的 IPv6 地址表达形式为  ::ffff:10.23.46.36:2181 ,这种形式要如何理解? 

(以下内容来自 *) 

-=-=-=- 我是第一次和公司同事打麻将的分隔线  -=-=-=- 

【IPv6】

      从 IPv4 到 IPv6 最显著的变化就是网络地址的长度。RFC 2373 和 RFC 2374 定义的 IPv6 地址有 128 位长;IPv6 地址的表达形式,一般采用 32 个十六进制数 
      IPv6 中可能的地址有 2^128≈3.4×10^38 个,具体数量为 340,282,366,920,938,463,463,374,607,431,768,211,456 个。也可以想象为 16^32 个,因为 32 位地址每位可以取 16 个不同的值(参考组合数学)。 
      在很多场合,IPv6 地址由两个逻辑部分组成:一个 64 位的网络前缀和一个 64 位的主机地址,主机地址通常根据物理地址自动生成,叫做 EUI-64(或者 64-位扩展唯一标识) 

【IPv6 地址表示】

      IPv6 地址为 128 位元长,但通常写作 8 组每组四个十六进制数的形式。例如: 
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
是一个合法的 IPv6 地址。 
      如果四个数字都是 0 ,可以被省略。例如: 
2001:0db8:85a3:0000:1319:8a2e:0370:7344
等价于 
2001:0db8:85a3::1319:8a2e:0370:7344
遵从这些规则,如果因为省略而出现了两个以上的冒号的话,可以压缩为一个,但这种零压缩在地址中只能出现一次。因此: 
2001:0DB8:0000:0000:0000:0000:1428:57ab
2001:0DB8:0000:0000:0000::1428:57ab
2001:0DB8:0:0:0:1428:57ab
2001:0DB8:0::0:1428:57ab
2001:0DB8::1428:57ab
都是合法的地址,并且他们是等价的。但 
2001::25de::cade
是非法的。(因为这样会使得搞不清楚每个压缩中有几个全零的分组) 
同时前导的零可以省略,因此 
2001:0DB8:02de::0e13
等价于 
2001:DB8:2de::e13
如果这个地址实际上是 IPv4 的地址,后 32 位元可以用 10 进制数表示;因此: 

ffff:192.168.89.9   等价于 ::ffff:c0a8:5909 ,但 不等价于 ::192.168.89.9 和 ::c0a8:5909 。

ffff:1.2.3.4 格式叫做 IPv4 映射地址,是不建议使用的。而 ::1.2.3.4 格式叫做 IPv4 一致地址 

IPv4 地址可以很容易的转化为 IPv6 格式。举例来说,如果 IPv4 的一个地址为 135.75.43.52(十六进制为 0x874B2B34),它可以被转化为 0000:0000:0000:0000:0000:0000:874B:2B34 或者 ::874B:2B34 。同时,还可以使用混合符号(IPv4-compatible address),则地址可以为 ::135.75.43.52。 

-=-=-=- 我是第一次和公司同事打麻将的分隔线 -=-=-=-

结论:当 zk 客户端以 IPv4 方式与监听 IPv6 地址的 zookeeper 建立 TCP 连接时,zookeeper 以 IPv4 映射地址形式表达所看到的 TCP 连接信息。

上一篇:【原创】HBase 基础知识


下一篇:Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例