2011-05-04 73 views
3

我已經編寫了一些簡單的代碼,它使用ioctl SIOCGIFCONF查詢系統上的所有網絡接口,並使用inet_ntop返回找到的地址的文本表示。奇怪的是,當發現鏈接本地IPv6地址時,代碼的OSX版本似乎將範圍嵌入到地址中。OSX上具有'嵌入'範圍的IPv6鏈接本地地址

這裏是從線/ sbin目錄/使用ifconfig在OSX自動配置接口(後:

的IPv6地址:FE80:5 :: 217

en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500 
     ether 00:17:f2:0b:52:73 
     inet6 fe80::217:f2ff:fe0b:5273%en1 prefixlen 64 scopeid 0x5 

和IP地址的IOCTL SIOCGIFCONF返回的:f2ff:fe0b:5273

它看起來像(5)的FE80後立即插入範圍的值

Linux上的相同的代碼返回的IPv6地址沒有任何額外的數據。

發生了兩個問題: 1)寫這樣的ipv6地址是否合法? 2)OSX行爲是否記錄在任何地方?

參考請!

+1

在大多數平臺上,'inet_ntop'和'inet_pton'不支持IPv6區域,只能使用'getnameinfo'和'getaddrinfo'。 – 2011-05-05 17:17:32

+0

謝謝,史蒂夫,不知道。我的問題仍然是:如果IPv6地址有區域信息?在RFC4291第2.2章中未提及。地址的文本表示 – Spaceghost 2011-05-05 18:59:11

+0

僅鏈路本地範圍地址,即fe80 ::前綴。 – 2011-05-05 19:57:44

回答

4

我不確定你的第二個問題,但至於你的第一個問題,是的,通常看到這樣寫的IPv6地址範圍很大(如本地鏈接地址),但它是絕對的跨平臺不一致。原因是因爲鏈接本地地址沒有它就會變得模糊不清。

我對this other question的回答可能會有所幫助。


編輯:我剛剛意識到這個問題的微妙之處。 BSD IPv6堆棧在內部將接口索引存儲在鏈路本地IPv6地址的第二個16位字中。這應該從來沒有走出去的電線。這實際上是RFC違規,​​。 (順便說一句,爲什麼他們可以在這裏存儲額外的信息)我相信這是一個錯誤,範圍應該以其他方式傳達給系統的其他部分。所以你應該檢查一下並用手去除它。


編輯2:我去挖出place in the kernel source where they set this value

466 static int 
    467 in6_ifattach_linklocal(
    468   struct ifnet *ifp, 
    469   struct ifnet *altifp, /* secondary EUI64 source */ 
    470   struct in6_aliasreq *ifra_passed) 
    471 { 
     ... 
    494     ifra.ifra_addr.sin6_family = AF_INET6; 
    495     ifra.ifra_addr.sin6_len = sizeof(struct sockaddr_in6); 
    496     ifra.ifra_addr.sin6_addr.s6_addr16[0] = htons(0xfe80); 
    497 #if SCOPEDROUTING 
    498     ifra.ifra_addr.sin6_addr.s6_addr16[1] = 0 
    499 #else 
    500     ifra.ifra_addr.sin6_addr.s6_addr16[1] = htons(ifp->if_index); /* XXX */ 
    501 #endif 

注意/* XXX */上線500 ;-)我的猜測是,這是某種暫時的解決辦法的/黑客使路由正確工作而不重寫部分路由代碼。對於鏈路本地地址,您需要根據源和目標接口進行路由決策。通過將if_index放在地址中的那個位置,他們可能僅僅在128位地址上進行最長的前綴匹配,而不是依賴某種元數據。

+0

謝謝,邁克。看起來範圍是路由所必需的,但不是地址的一部分,但沒有地址,地址不是很有用。 – Spaceghost 2011-05-05 13:40:41

+0

@Spaceghost,確實如此。有一件事也許可以幫助您指出,在您的問題中,您說這是在「自動配置接口後」的輸出。這不完全正確。當你談論IPv6中的「自動配置」地址時,通常意味着一個[通過路由器通告自動配置的全局單播地址](http://tools.ietf.org/html/rfc4862)。規範要求鏈接本地地址,但並不真正稱爲「自動配置」。 – mpontillo 2011-05-05 21:52:35