之前看到的 tcp 連接配接資訊如下
可以看到,
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 組每組四個十六進制數的形式。例如:
是一個合法的 ipv6 位址。
如果四個數字都是 0 ,可以被省略。例如:
等價于
遵從這些規則,如果因為省略而出現了兩個以上的冒号的話,可以壓縮為一個,但這種零壓縮在位址中隻能出現一次。是以:
都是合法的位址,并且他們是等價的。但
是非法的。(因為這樣會使得搞不清楚每個壓縮中有幾個全零的分組)
同時前導的零可以省略,是以
如果這個位址實際上是 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 連接配接資訊。