題 為什麼IPv6地址中有百分號'%'?


我正在使用 .NET Framework 用於獲取我的機器的IP地址的類。

Dns.GetHostAddresses(Dns.GetHostName())

我有一個VirtualBox適配器,它具有IPv4和IPv6地址。使用.NET代碼我得到的IPv6地址為 fe80::71a3:2b00:ddd3:753f%16 

注意%16在結尾? 

但是,如果我使用相同的查詢 WMI,我的地址為'fe80 :: 71a3:2b00:ddd3:753f'

那麼,%16有什麼特別的意義嗎?

編輯: 

我剛才對此有了更多的觀察。他們與斯蒂芬詹寧斯在答案中所說的很相配。

我安裝了Vmware以查看它發布的IPv6地址。地址是: FE80 :: 3dd0:7f8e:57b7:34d5 19%

FE80 :: B059:65f4:e877:C40 20%

顯然,%之後的數字不是一些十六進製表示。我使用Wmi檢查了網絡適配器的所有可用屬性,發現這些數字與每個網絡適配器的InterfaceIndex屬性完全相同。按照 MSDN,它唯一標識每個網絡適配器,並在Vista中引入此屬性。

令我困惑的是,為什麼IPAddress類允許您以該格式創建IP地址,除非它是有效的。答案由斯蒂芬提供。數字是范圍ID。 IPAddress有一個構造函數,它接受地址和範圍ID。

哦,所有這三個網絡適配器都是本地鏈接。通過ipconfig確認

涼。這很有趣!!


113
2018-01-23 21:42


起源


在你問之前我不知道它是什麼。我今天也學到了一些關於IPv6的東西(我們是什麼樣的書呆子)。 - Stephen Jennings
@Stephen,你以前和ipv6合作過嗎?我很快就被你惹惱了。在這裡發布問題之前,我用谷歌搜索了一段時間。幹得好! - Amith George
搜索“ipv6地址百分比”讓我得到了我需要的名字,並從那裡搜索並試圖弄清楚令人困惑的技術文檔佔用了大部分時間。我得到了IPv6正在努力實現的目標,但是我有很多新的概念,我沒有去研究和理解。這是一個,沒有什麼比試圖向別人解釋更能讓你理解。 - Stephen Jennings
另一種表示法可能是 fe80:10 (該 0x0010 是16)。我用它 在我的瀏覽器中 使用鏈接本地IPv6地址時,但我不是100%確定這是根據標準。 (在瀏覽器中使用URL中的百分比是混亂的;實際上我根本無法工作。) - Arjan


答案:


'%'後面的數字是范圍ID。

IPv6為地址定義了至少三個可達性範圍:

  1. 全球可尋址。這是您的ISP提供給您的IPv6地址。它可以在公共互聯網上使用。

  2. 鏈路本地。這類似於169.254.X.X範圍。它是計算機分配的地址,以便於本地通信。這些地址不會在公共互聯網上傳播,因為它們不是全球唯一的。

  3. 節點本地。這是一個標識本地接口的地址,類似於127.0.0.1。基本上,這是地址:: 1。

Microsoft已發布本文介紹IPv6尋址這是我發現的最容易混淆的文章。文章指出,您的地址中存在範圍ID意味著它是一個 鏈接本地地址。你也可以告訴它是本地鏈接的,因為地址以 fe80

關於這個主題的清晰,簡單理解的信息似乎很少見,所以我將基於我最好的理解將其餘部分放在一起 RFC 4007 和那裡的其他信息。

計算機可以具有多個鏈接本地地址,每個地址具有不同的範圍。範圍ID指示地址的範圍。例如,假設具有兩個NIC的計算機的方案,每個NIC在不同網絡上具有鏈路本地地址。如果您嘗試將某些內容髮送到以fe80開頭的另一個地址,計算機將如何知道要發送哪個NIC?範圍ID似乎是此解決方案。


120
2018-01-23 22:26



謝謝!編輯我的問題,添加我在等待答案時碰巧觀察到的額外內容。當我發布它們時,我很驚訝地看到你的答案證實了觀察結果:) - Amith George
很好的答案。讓我看看我是否完全理解這一點。因此,具有兩個NIC的設備可以連接到兩個不同的路由器,並為其分配相同的DHCP地址 fe80::42。此外,路由器具有相同的地址 fe80::1。現在 fe80::1%X 可用於區分路由器,但是 fe80::42%X 對客戶來說是次要用途,對嗎? - user123444555621
@ Pumbaa80客戶端會發送消息給 fe80::1%1 到達連接到NIC#1的路由器,它將發送消息 fe80::1%2 到達連接到NIC#2的路由器。另外,鏈接本地地址由主機自動配置,而不是通過DHCP配置,因此它可能不會為其兩個NIC分配相同的IP。還要記住鏈接本地地址不可路由,因此通常您不會向路由器發送消息,您將在兩台主機之間發送消息。 - Stephen Jennings
通過實驗,它似乎落後了 %nn 可以省略至少一些命令,例如, ping, tracert。 - matt wilkie
很好的答案。只是提到範圍ID為零是特殊的,並且似乎表明一種特定於實現的算法,用於從具有該IP範圍的接口列表中選擇範圍ID。 - Arran Cudbard-Bell


帶有前綴fe80 :: / 64的IPv6地址是鏈路本地地址,通過將該前綴與網絡設備的硬件地址組合而構成,在示例中為71a3:2b00:ddd3:753f。 (IPv4中的模擬信號為169.254.0.0/16。)由於機器上所有鏈路本地地址的前綴相同,因此路由有時可能需要知道您所指的接口。這就是稱為區域索引的百分比之後的數字。具體取決於操作系統:在Windows上, %16 接口號為16;例如,在Linux上你可能會看到類似的東西 %eth0

某些工具或API會認為此區域索引不重要或隱含用於其目的。例如,在Linux上 ifconfig 工具沒有顯示它,因為很明顯地址屬於哪個接口。但總的來說應該考慮到它。


19
2018-01-23 23:30





%之後的字符(在您的示例中恰好是數字)是接口標識符。這些字符用於標識“網絡接口”,人們通常將其稱為“網卡”。例如,它可以幫助確定數據包是使用有線以太網卡還是無線Wi-Fi適配器。

我猜你正在使用Microsoft Windows。它使用數字作為接口標識符。

相比之下,類Unix系統可能會在%符號後面使用字母。例如。: fe80::71a3:2b00:ddd3:753f%eth0

在這種情況下,接口標識符, eth0,匹配網卡的名稱。

在Microsoft Windows中,您可以使用檢查路由表的命令行之一獲取(數字)接口標識符的列表。我更喜歡 ”netstat -nr“因為這也適用於其他操作系統,但Microsoft Windows也支持”route print“。報告的結果輸出可能會超過一個屏幕,所以要準備好向後滾動,除非你管道更多。

例如,在我的系統上:

=========================================================================== Interface List 14...5c f9 dd 6d 98 b8 ......Realtek PCIe GBE Family Controller 12...e0 06 e6 7e fc 4e ......Bluetooth Device (Personal Area Network) 1...........................Software Loopback Interface 1 13...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter 15...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #2 ===========================================================================

在這種情況下,像fe80 :: 71a3:2b00:ddd3:753f%14這樣的地址將指向我的Realtek PCIe GBE系列控制器。 “GBE”指的是千兆以太網。

現在,這是一個棘手的部分:如果要ping遠程地址,您可能需要使用遠程系統的IPv6地址,但本地系統的接口標識符。因此,例如,如果我使用的是計算機A,並且我有一個連接到接口號14的本地IPv6地址為fe80 :: 1,我想ping計算機B並且它附加了一個本地IPv6地址為fe80 :: 2它的接口號為16,那麼這就是我要使用的:

ping fe80::2%14

所以 ping 命令會將ICMPv6數據包發送到屬於遠程計算機的遠程IPv6地址(fd80 :: 2),並使用帶標識符14的接口來執行此操作。接口標識符14是我正在使用的系統的編號,而不是遠程系統。

現在,讓我們來看看為什麼這可能是必要的。

如果我想ping谷歌的IPv6地址(在我寫這個答案的時候是2607:f8b0:400a:802 :: 200e),那麼路由表將檢查哪個網卡處理以2607開頭的地址:f8b0:400a: 802。路由表將指示我的所有網卡都沒有使用以2607:f8b0:400a:802開頭的地址直接連接到網絡,因此我的計算機最終將使用“網關”地址。如果我連接到我正在為之工作的組織的另一個網絡,我可能會有一個特殊的“網關”地址,用於將流量路由到專用網絡。在這種情況下,我沒有更具體的網關,因此我將使用IPv6“默認網關”。這就是IPv6大多數時間的工作方式,除了鏈接本地​​地址。這也是IPv4大多數時間的工作方式。 (我通過假設IPv6子網大小為/ 64來簡化此示例,因為描述整個過程會使此描述更長。)

根據 RFC 4291第2.8節每台使用IPv6的計算機都應為每個網絡接口分配鏈路本地地址。 RFC 4291第2.5.6節 顯示鏈接本地地址必須以比特開頭的位,這會導致鏈接本地地址以“fe80:0000:0000:0000:”開頭(儘管這些零中的許多都會折疊為雙冒號)。這些地址以“fe80:”開頭的事實也被描述為 RFC 4291第2.4節

如果您嘗試ping遠程系統(例如,“2607:f8b0:400a:802”),通常的過程通常是找出該地址所屬的網絡或子網,這通過查看位來完成在地址的開頭。然後,這些位用於確定如何路由流量。

但是,該過程不適用於IPv6鏈路本地地址,因為每個單獨的(操作,活動)網絡接口都使用子網前綴/大小“/”在子網上具有以“fe80:”開頭的鏈路本地地址。 64“。如果您使用的是筆記本電腦,則可能會發現您的以太網卡和Wi-Fi適配器都應具有此類IPv6地址。

現在,當您將ping發送到fe80 :: 2時,您希望計算機將該數據包發送到正確的網卡。如果您的打印機連接到有線網絡,則不希望使用不會導致流量進入打印機的網絡路徑/路徑將流量從Wi-Fi卡中發送出去。如果您嘗試使用Wi-Fi卡與無線設備通信,則不希望您的流量通過以太網卡。

解決方案是讓您指定要使用的流量的網絡設備。所以,這就是網絡標識符的目的。


14
2018-04-24 04:22



好的,重新閱讀 Peter Eisentraut的回答,看起來他的技術上是正確的。希望我的細節更加清晰。我不同意 斯蒂芬詹寧斯的回答,因為該答案使其看起來像“範圍ID”標識“鏈接本地”作為範圍。但是,兩個不同的網絡接口都可以是“鏈接本地”,但它們不會使用相同的“範圍”(根據其編號列表中顯示的示例)。相反,我說這些數字標識網絡“接口”。 - TOOGAM