天天看點

【原創】如何了解 IPv6 位址格式

之前看到的 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 連接配接資訊。