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


      前一篇博文《【原创】zookeeper使用过程中遇到的问题》中提及了 IPv6 地址,本文针对 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 连接信息。

转载于:https://my.oschina.net/moooofly/blog/636958

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值