19

管理者が有効な IP アドレスを指定して、そこから Web サービス リクエストを作成できるようにするアプリケーションがあります。構成済みの IP アドレスを取得して、着信要求と比較するだけです。2 つの IPv4 アドレスを比較するのは簡単ですが、2 つの IPv6 アドレスを比較するのも同様だと思いました。

しかし、IPv6 アドレスがもう少し複雑であることに気付いたとき、私のネットワークへの無知が露呈し始めました。私が気づいた 1 つの問題は、マシンの IP アドレス (VMWare コンソールが示す IP アドレスを表示していたもの) と、Web 要求からの IP アドレス ( HttpContext.Current.Request.UserHostAddress.NET 内) を比較すると、そのうちの 1 つが次のように終わっていることに気付きました。 %10 と別の %11:

  • ipconfig の表示: fe80:8179:5576:c6d0:8b16%11
  • UserHostAddress の表示: fe80::8179:5576:c6d0:8b16%10

唯一の違いは %10 と %11 です。

また、IPv6 アドレスが「/」で終わり、その後に 2 桁の数字が続くことも確認しました。比較を行うときに、これらの最後の 3 桁 (存在する場合) を無視する必要がありますか? もしそうなら、私が探す必要がある有効な別のエンディングは何ですか?

- - - - - - 編集 - - - - - - -

提供された回答に基づく私の解決策は次のとおりです...

「スクラブされた」IP アドレスを保存し、それを「スクラブされた」IP アドレスと比較するだけです。ここで .NET を使用して、IP アドレスをスクラブします。パフォーマンスの観点からは最高ではありませんが、機能します。の比較をしたいのGetAddressBytes()ですが、 を使用しているDictionaryため、独自の を作成するという余分な手順を実行しないことにしましByteComparerた。

IPAddress incomingIp = null;
bool ipAddressParsePassed = IPAddress.TryParse(userHostAddress, out incomingIp);
if (ipAddressParsePassed)
{
    IPAddress scrubbedIp = new IPAddress(incomingIp.GetAddressBytes());
    string scrubbedIpStr = scrubbedIp.ToString()
}
4

4 に答える 4

18

ウィキペディアの状態:

ホスト内のすべてのリンクローカル アドレスには共通のプレフィックスがあるため、リンクローカルの宛先にパケットを送信するときに、通常のルーティング手順を使用して発信インターフェイスを選択することはできません。追加のルーティング情報を提供するには、ゾーン インデックスと呼ばれる特別な識別子が必要です。リンクローカル アドレスの場合、ゾーン インデックスはインターフェイス識別子に対応します。

アドレスがテキストで記述される場合、ゾーン インデックスがパーセント記号「%」で区切られてアドレスに追加されます。ゾーン インデックスの実際の構文は、オペレーティング システムによって異なります [...]

したがって、これらのサフィックスは、アドレスを物理インターフェイスに関連付けるゾーン インジケーターです。これは、たとえば、有線インターフェイスと無線インターフェイスでサフィックスが異なる理由も説明しています。

質問に答えるために、接尾辞を比較に含める必要はないと思います。IPv6 アドレスは定義上 128 ビットであり、サフィックスは厳密にローカルな情報であり、自分のマシンや現在のオペレーティング システムの外部では意味がありません。

128 ビットを比較するだけで十分です。

于 2009-11-24T13:24:40.083 に答える
4

唯一の違いは %10 と %11 です。

これらは IPv6ゾーン識別子です。リンク ローカル アドレス、つまり fe80 プレフィックスは、ローカル リンク上で一意であることが保証されているだけです。これは、アドレス fe80:8179:5576:c6d0:8b16%11 および fe80::8179:5576:c6d0:8b16%10 が異なるマシンを参照している可能性があることを意味します。一方にはインターフェイス 10 を介してアクセスし、もう一方にはインターフェイス 11 を介してアクセスする必要があります。

sockaddr_in6の定義を見てください。

struct sockaddr_in6 {
  short sin6_family;
  u_short sin6_port;
  u_long sin6_flowinfo;
  struct in6_addr sin6_addr;
  u_long sin6_scope_id;
};

完全に一致するには、ファミリ、アドレス、およびスコープ ID フィールドを比較する必要があります。

于 2010-02-06T04:15:13.633 に答える
1

末尾に / と数字があるアドレスは、Classless Inter-Domain Routing (CIDR) 表記を使用します。それらは、実際のアドレスまたはネットワークを表すことができます。/ の前にゼロまたは :: がある場合、それはネットワークです。

CIDR表記

于 2009-11-24T04:55:19.250 に答える
-1

IPv6は、IPv4の32ビットに対して128ビットです。バイトごとの比較ができるはずです。

于 2009-11-24T03:28:44.963 に答える