2009-10-12 665 views
20

這可能嗎?你怎麼能轉換一個ipv4到一個ipv6地址?如何將地址從IPv4轉換爲IPv6

從這裏的幾個例子:

0.0.0.0 -> :: 
127.0.0.1 -> ::1 

我在尋找Java中的一個解決方案。

謝謝,

回答

29

沒有IPv4到IPv6的映射是有意義的。規範中的0.0.0.0和127.0.0.1是特例,因此它們具有相同的含義。但是給定一個IPv4地址,它不會告訴你它的具體IPv6地址是什麼。您可以使用DNS查找來查看給定IP地址是否解析爲主機,而主機又會解析爲IPv4地址以外的IPv6地址,但DNS服務器必須配置爲支持特定計算機的IP地址。

+5

在雙堆棧系統中,實際上存在從IPv4到IPv6的映射::: ffff:XXXX:XXXX空間;這通常顯示爲「:: ffff:192.168.1.1」 - 因此在IPv6地址空間中有一個有意義的IPv4地址表示形式。 – 2013-02-17 07:34:26

+1

@DoktorJ,我不認爲這是問題。我認爲這個請求是爲了一個正確的IP6地址,而不是在IP6堆棧上引用一個IP4地址的方法。 – Yishai 2013-02-19 21:26:02

+1

@DoktorJ但是除非你有一種路由功能,否則這個映射並不能真正幫助你。 – glglgl 2013-04-29 12:20:01

4

在IPv6中,IPv4地址中有一個保留的地址空間,您只需在IPv4地址前加上96個0位即可。例如。 192.168.10.13 -> ::C0A8:0A0D。據我所知,這已被棄用,並沒有直接轉換可用了。

+7

我認爲仍有IPv4映射的IPv6地址未被棄用。你在這個方案中的例子是:: ffff:c0a8:0a0d。其中帶有0的那個稱爲IPv4兼容的IPv6地址。 – 2009-12-09 11:22:29

15

混合雙棧IPv6/IPv4實現通常支持特殊類別的地址,IPv4映射地址。欲瞭解更多查看以下鏈接:

http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses

對於IPv4轉換爲IPv6的映射,您可以使用以下命令:

String ip = "127.0.0.1"; 
String[] octets = ip.split("\\."); 
byte[] octetBytes = new byte[4]; 
for (int i = 0; i < 4; ++i) { 
      octetBytes[i] = (byte) Integer.parseInt(octets[i]); 
} 

byte ipv4asIpV6addr[] = new byte[16]; 
ipv4asIpV6addr[10] = (byte)0xff; 
ipv4asIpV6addr[11] = (byte)0xff; 
ipv4asIpV6addr[12] = octetBytes[0]; 
ipv4asIpV6addr[13] = octetBytes[1]; 
ipv4asIpV6addr[14] = octetBytes[2]; 
ipv4asIpV6addr[15] = octetBytes[3]; 

還要檢查this

3

是IPv4兼容。

IPv4地址:例如192.168.99.1

第一步>

除以第一個八位字節(192)由16(十六進制以來是基-16) IE:一十六分之一百九十二= 12倍正好與0遺留 - 在十六進制12被表示爲C - 0(零)以十六進制是,你猜,0 因此192 HEX是C0

第二步>

與第二個八位位組(168)重複步驟1, IE:十六分之一百六十八8 = 10倍遺留因爲10×6 = 160, - 10 HEX是A - 8 HEX是8 因此168 HEX是A8

步驟3>

重複規則!第三個八位字節(99) IE:99/16 = 6次,3遺留 - 6 HEX是6 - 3 HEX是3 因此,在HEX 99

步驟4>

最後八位字節 IE:1/16 = 0次與1遺留 - 0在HEX,則是它是0 - 1 HEX是1 因此1 HEX被

所以IPv4的地址在IPv6地址部分中表示的192.168.99.1將是C0A8:6301。然而,你必須使用小寫字母,並添加所有丟失的字節的IPv6,所以正確的代碼是:

:: c0a8:6301

,或者您可以使用語法現在總是接受:

:: 192.168.99.1

所以最後一個IPv6地址可以是舊的地址與老地址前::字符。