IPv6アドレスにパーセント記号「%」があるのはなぜですか?


125

.NET Frameworkクラスを使用して、マシンのIPアドレスを取得しています。

Dns.GetHostAddresses(Dns.GetHostName())

IPv4とIPv6の両方のアドレスを持つVirtualBoxアダプターがあります。.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

明らかに、%の後の数字は16進表記ではありません。Wmiを使用してネットワークアダプターで使用可能なすべてのプロパティを確認したところ、数値は各ネットワークアダプターのInterfaceIndexプロパティとまったく同じであることがわかりました。あたりとしてMSDN、それが一意に各ネットワークアダプタを識別し、このプロパティはVistaで導入されました。

まだ混乱しているのは、IPAddressクラスを使用すると、有効でない限り、その形式でIPアドレスを作成できるようになる理由です。答えはスティーブンによって提供されました。番号はスコープIDです。IPAddressには、アドレスとスコープIDを受け入れるコンストラクターがあります。

ああ、これら3つのネットワークアダプターはすべてリンクローカルでした。ipconfigで確認済み

クール。面白かった!!


2
あなたが尋ねる前に、私はそれが何であるか分かりませんでした。今日もIPv6についてすてきなことを学びました(私たちはオタクです)。
スティーブンジェニングス

@スティーブン、それであなたは以前ipv6で働いたことがありますか?私はすぐにそれを釘付けに驚いた。ここに質問を投稿する前にかなり長い間グーグルで検索しました。よくやった!
アミスジョージ

「ipv6 address percent」を検索すると、必要な名前が取得され、そこから検索して、混乱を招く技術文書を理解しようとするのに最も時間がかかりました。IPv6が何を達成しようとしているのかはわかっていますが、調査と理解に取り組んでいない新しい概念がたくさんあります。これは1つであり、他の人に説明しようとするよりもあなたに良い理解を与えるものはありません。
スティーブンジェニングス

代替表記法はfe80:100x001016であること)です。リンクローカルIPv6アドレスを操作するときにブラウザーでそれを使用しますが、これが標準に準拠していることを100%確信していません。(ブラウザでURLのパーセントを使用するのは面倒です。実際、私はそれをまったく動作させることができませんでした。)
Arjan

回答:


134

'%'の後の数字はスコープIDです。

IPv6は、アドレスに対して少なくとも3つの到達可能性スコープを定義します。

  1. グローバルにアドレス可能。これは、ISPから提供されたIPv6アドレスです。公共のインターネットで使用できます。

  2. リンクローカル。これは169.254.XXの範囲に似ています。これは、ローカル通信を容易にするためにコンピューターが自分自身に割り当てるアドレスです。これらのアドレスはグローバルに一意ではないため、パブリックインターネット上でルーティングされません。

  3. ノードローカル。これは、127.0.0.1と同様に、ローカルインターフェイスを識別するアドレスです。基本的に、これはアドレス:: 1です。

マイクロソフトは、私が見つけた最もわかりやすい記事であるIPv6アドレッシングを説明するこの記事を公開しました。この記事では、アドレス内にスコープIDが存在するということは、それがリンクローカルアドレスであることを示しています。アドレスがで始まるため、リンクローカルであることもわかりますfe80

このトピックに関する明確でわかりやすい情報はまれであるように思えるので、RFC 4007とその他の情報についての私の最善の理解に基づいて、この残りをまとめています。

コンピューターは、それぞれが異なるスコープを持つ複数のリンクローカルアドレスを持つことができます。スコープIDは、アドレスのスコープを示します。たとえば、2つのNICがあり、それぞれが異なるネットワーク上のリンクローカルアドレスを持つコンピューターのシナリオを想像してください。fe80で始まる別のアドレスに何かを送信しようとすると、コンピューターはどのNICを送信するかをどのように知るのでしょうか?スコープIDは、これに対する解決策のようです。


ありがとう!私の質問を編集して、答えを待っている間に偶然見たものを追加しました。そして、私がそれらを投稿するために来たとき、私はあなたの答えが観察を確認するのを見て驚いた:)
アミスジョージ

素敵な答え。私がそれを完全に理解しているかどうか見てみましょう。したがって、2つのNICを備えたデバイスは2つの異なるルーターに接続し、まったく同じDHCPアドレスを割り当てられる場合がありますfe80::42。また、ルーターのアドレスは同じfe80::1です。現在、Theは、fe80::1%Xルータ間で区別するために使用することができるが、fe80::42%X右、クライアントにマイナーな使用のでしょうか?
user123444555621

2
@ Pumbaa80クライアントはfe80::1%1、NIC#1に接続されたルーターにメッセージを送信fe80::1%2し、NIC#2に接続されたルーターにメッセージを送信します。余談ですが、リンクローカルアドレスは、DHCP経由ではなく、ホストコンピューターによって自動的に構成されます。したがって、おそらく2つのNICに同じIPを割り当てることはありません。また、リンクローカルアドレスはルーティングできないため、通常はルーターにメッセージを送信せず、2つのホスト間でメッセージを送信します。
スティーブンジェニングス

実験によって、その末尾は思わ%nn例えば、少なくともいくつかのコマンドのために省略することができpingtracert
マットウィルキー

非常に良い答えです。スコープIDがゼロであることは、特別なことであり、そのIPのスコープを持つインターフェイスのリストからスコープIDを選択する実装固有のアルゴリズムを示しているようです。
アランカドバードベル

21

プレフィックスがfe80 :: / 64のIPv6アドレスは、そのプレフィックスをネットワークデバイスのハードウェアアドレス(例では71a3:2b00:ddd3:753f)と組み合わせることで構築されるリンクローカルアドレスです。(IPv4のアナログは169.254.0.0/16です。)プレフィックスはマシン上のすべてのリンクローカルアドレスで同じであるため、ルーティングは、参照しているインターフェイスを知る必要がある場合があります。そして、それがゾーンインデックスと呼ばれるパーセントの後の数値が指定するものです。詳細はオペレーティングシステムによって異なります。Windowsでは、%16インターフェイス番号は16です。たとえばLinuxでは、のようなものが表示される場合があります%eth0

一部のツールまたはAPIは、このゾーンインデックスをその目的にとって重要ではないか暗黙的と見なします。たとえば、Linuxでは、ifconfigアドレスがどのインターフェースに属しているかが明らかであるため、ツールには表示されません。しかし、一般的にそれは考慮されるべきです。


18

%の後の文字(例では数字である)は、インターフェイス識別子です。これらの文字は、「ネットワークカード」と呼ばれることが多い「ネットワークインターフェイス」を識別するために使用されます。たとえば、パケットが有線イーサネットカードを使用するのか、ワイヤレス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に接続されているfe80 :: 1のローカルIPv6アドレスがあり、コンピューターBにpingを行い、fe80 :: 2のローカルIPv6アドレスが接続されている場合そのインターフェイス番号16、これは私が使用するものです:

ping fe80::2%14

そのため、pingコマンドは、リモートコンピューターに属するリモートIPv6アドレス(fd80 :: 2)にICMPv6パケットを送信し、識別子14のインターフェイスを使用してそれを実行します。インターフェイス識別子14は、リモートシステムではなく、使用しているシステムの番号です。

では、なぜこれが必要なのか見てみましょう。

GoogleのIPv6アドレス(この回答を書いた時点では2607:f8b0:400a:802 :: 200e)にpingを実行したい場合、ルーティングテーブルは、2607:f8b0:400aで始まるアドレスを処理するネットワークカードをチェックします。 802。ルーティングテーブルは、2607:f8b0:400a:802で始まるアドレスを使用してネットワークカードがネットワークに直接接続されていないことを示しているため、コンピューターは「ゲートウェイ」アドレスを使用することになります。私が働いている組織の一部である別のネットワークに接続している場合、トラフィックをプライベートネットワークにルーティングする特別な「ゲートウェイ」アドレスを持っている可能性があります。この場合、より具体的なゲートウェイはないため、IPv6の「デフォルトゲートウェイ」を使用します。これが、リンクローカルアドレスを除き、ほとんどの場合IPv6が機能する方法です。これは、ほとんどの場合IPv4が機能する方法でもあります。

RFC 4291セクション2.8によると、IPv6を使用するすべてのコンピューターは、すべてのネットワークインターフェイスにリンクローカルアドレスを割り当てる必要があります。 RFC 4291セクション2.5.6は、リンクローカルアドレスの開始ビットを示しています。これにより、リンクローカルアドレスは「fe80:0000:0000:0000:」で始まります(ただし、これらのゼロの多くは二重コロンになります)。それらのアドレスが「fe80:」で始まるという事実は、RFC 4291セクション2.4でも説明されています

リモートシステム(たとえば、「2607:f8b0:400a:802」)をpingしようとする場合、一般的なプロセスは通常、アドレスが含まれるネットワークまたはサブネットを見つけ出すことです。アドレスの先頭。次に、これらのビットを使用して、トラフィックのルーティング方法を決定します。

ただし、そのプロセスはIPv6リンクローカルアドレスでは機能しません。これは、すべての単一の(動作中の、アクティブな)ネットワークインターフェイスが、サブネットプレフィックス/サイズ「/」を使用して、サブネット上で「fe80:」 64 "。ラップトップを使用している場合は、イーサネットカードとWi-Fiアダプターの両方にそのようなIPv6アドレスが割り当てられていることがわかります。

これで、pingをfe80 :: 2に送信するときに、コンピューターからそのパケットを適切なネットワークカードに送信する必要があります。有線ネットワークに接続されているプリンターがある場合、Wi-Fiカードからトラフィックを送信する必要はありません。その場合、トラフィックがプリンターに到達しないネットワークパス/ルートを使用します。また、Wi-Fiカードを使用してワイヤレスデバイスと通信しようとしている場合、トラフィックがイーサネットカードから出ることは望ましくありません。

解決策は、トラフィックに使用するネットワークデバイスを指定することです。したがって、それがネットワーク識別子の目的です。


2
さて、ピーター・アイゼントラウトの答えを再読すると、彼は技術的に正しいようです。うまくいけば、私の詳細がさらに明確になることを願っています。Stephen Jenningsの答えには同意しません。その答えにより、「スコープID」が「リンクローカル」をスコープとして識別するように見えるためです。ただし、2つの異なるネットワークインターフェイスを両方とも「リンクローカル」にすることはできますが、同じ「スコープ」を使用することはありません(番号付きリストに示されている例による)。代わりに、これらの数字はネットワークの「インターフェース」を識別すると言います。
-TOOGAM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.