1. 程式人生 > >正確的 IPv6 link-local address 計算方法

正確的 IPv6 link-local address 計算方法

http://oa.jmu.edu.cn/netoa/libq/IPv6disc.nsf/aac7d56ca8fd884b852563be00610639/de20407eca227d4348256e7e001f0e26?OpenDocument

每個執行 IPv6 的介面都會有一個位址稱為 link-local 位址,也就是您常常看到以 FE80 開頭的那個 IPv6 位址。這個位址其實是由兩個部分所組成的:

a. FE80::/64 (Prefix) b. IPv6 interface identifier

接下來讓我們先來看看怎麼將 48 位元 ( 6 bytes ) 的 Ethernet MAC 位址轉成 64 位元的 IPv6 interface identifier。

[Step 1]
將十六進位值 0xFF-FE 插入乙太網路 MAC 位址的中間,也就是第三位元組與第四位元組中間。

[Step 2]
將原來乙太網路 MAC 位址用來識別 Universal 或 Local 的那個位元做補數(complement)的動作,也就是將從左邊數過來第一個 byte 的倒數第二個 bit 的值 complement,原來的值如果是一的則變成零,原來是零的則變成一。

有看沒有懂嗎 ?? 舉個例子來說好了。
假設有一個 Ethernet 的 MAC Address 是 00-58-07-48-F5-D6。

[Step 1]
將 "FF-FE" 插入第三和第四個 byte 中間,也就是插入 "07" 和 "48" 的中間,結果會變成 "00-58-07-FF-FE-48-F5-D6" 。

[Step 2]
將第一個 Byte 的倒數第二個 bit complement,也就是將 "00" 這個 byte 由左到右的倒數第二個 bit 從原來的 "0"轉成 "1",再轉回原來的十六進位制,則原來的 "00" 此時會變為 "02"。所以

7 6 5 4 3 2 1(x) 0


將 x 的地方做 complemnet

所以原來的 MAC 位址 00-58-07-48-F5-D6 經過我們的處理後會變成 02-58-07-FF-FE-48-F5-D6 的 IPv6 interface identifier。
最後,我們只需要把 FE80::/64 的 prefix 加在我們所算出來的 IPv6 interface identifier 前面即可。 所以該乙太網路介面卡的 IPv6 link-local 位址 FE80::258:07FF:FE48:F5D6。