Как определить равенство между двумя адресами IPv6?

У меня есть приложение, которое позволяет администраторам указывать действительные IP-адреса, с которых можно делать запросы к веб-службе. Я просто беру настроенные IP-адреса и сравниваю их с входящим запросом. Сравнение двух адресов IPv4 тривиально, и я подумал, что сравнение двух адресов IPv6 будет таким же.

Однако мое незнание сетей начало проявляться, когда я заметил, что адреса IPv6 немного сложнее. Одна проблема, которую я заметил, заключается в том, что если я смотрю на IP-адрес на машине (просматривая, какой IP-адрес показывает консоль VMWare) по сравнению с IP-адресом из веб-запроса (HttpContext.Current.Request.UserHostAddress в .NET), я заметил, что один из них закончился в %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()
}

person Kirk Liemohn    schedule 24.11.2009    source источник
comment
Примечание. В .NET вы можете получить или установить local_link с помощью IPAddress.ScopeId .   -  person Yves M.    schedule 04.12.2014


Ответы (4)


Википедия сообщает:

Поскольку все локальные для канала адреса в узле имеют общий префикс, обычные процедуры маршрутизации нельзя использовать для выбора исходящего интерфейса при отправке пакетов в локальный для канала пункт назначения. Специальный идентификатор, известный как индекс зоны, необходим для предоставления дополнительной информации о маршрутизации; в случае локальных адресов ссылки индексы зон соответствуют идентификаторам интерфейса.

Когда адрес записывается в текстовом виде, к адресу добавляется индекс зоны, разделенный знаком процента «%». Фактический синтаксис индексов зон зависит от операционной [...]

Таким образом, эти суффиксы являются индикаторами зоны, которые связывают адрес с физическим интерфейсом. Это также объясняет, почему, например, достаточные значения различаются между проводными и беспроводными интерфейсами.

Чтобы помочь ответить на вопрос, я не думаю, что суффиксы должны быть включены в какое-либо сравнение. Адреса IPv6 по определению имеют длину 128 бит, а суффиксы — это строго локальная информация, которая не имеет смысла за пределами вашей собственной машины и текущей операционной системы.

Сравнение 128 бит должно быть достаточно.

person unwind    schedule 24.11.2009
comment
Отлично! Я застрял на другой странице Википедии: IPv6 и не нашел ту, которую вы только что дал: IPv6-адреса. Глядя на это сейчас... - person Kirk Liemohn; 24.11.2009
comment
Обратите внимание, что фактический синтаксис индексов зон зависит от ОС. Вы не можете предполагать, что индекс зоны состоит из трех символов. Однако вы можете предположить, что если он присутствует, он следует за символом %. Итак, если вы сравниваете адреса, не заботясь о спецификации локального интерфейса, остановитесь на %. И наоборот, если вы различаетесь между локальными интерфейсами, включите строку после %. - person mpez0; 24.11.2009
comment
Цитата чуть выше предоставленной вами цитаты также может дать некоторое представление: все интерфейсы имеют связанный локальный адрес ссылки, который гарантированно будет уникальным только для прикрепленной ссылки. Итак, я читаю это и цитату, которую вы предоставили, чтобы означать, что мне, вероятно, лучше удалить индекс зоны, который разделен знаком процента. - person Kirk Liemohn; 24.11.2009
comment
Адреса локальной области связи, т. е. адреса с зарезервированным префиксом fe80::/10, имеют область действия локальной связи и не нуждаются в автоматической настройке с помощью известной функции из адресов EUI. Поэтому идентификатор области действия важен при их сравнении. - person james woodyatt; 10.12.2009

Разница только в %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;
};

Вам нужно будет сравнить поля семьи, адреса и идентификатора области для полного совпадения.

person Steve-o    schedule 06.02.2010
comment
+1, здесь необходимо учитывать идентификатор области. Подумайте о случае, когда кто-то говорит, что все локальные адреса должны быть разрешены, потому что они локальны по определению и допускают fe80::/10. Теперь они только что открыли дыру в безопасности для всего Интернета IPv4, если они оставили свой интерфейс ISATAP включенным (или какой-либо другой механизм автоматического туннелирования, использующий локальные адреса). - person mpontillo; 17.02.2011

Адреса с / и числом в конце используют нотацию бесклассовой междоменной маршрутизации (CIDR). Они могут обозначать фактический адрес или сеть. Если перед / стоит ноль или ::, то это сеть.

нотация CIDR

person blank    schedule 24.11.2009
comment
Интересный. Итак, я видел /64 в конце IP-адреса (очевидно, нотация CIDR), а также %11 и %12 в конце. Есть идеи, что такое обозначение% материала? - person Kirk Liemohn; 24.11.2009
comment
Придирка: CIDR — это термин, специфичный для IPv4, созданный, когда IPv4 перешел от классовой к бесклассовой адресации. С IPv6 смысла нет, так как IPv6 всегда был бесклассовым. - person bortzmeyer; 28.11.2009

IPv6 — это всего лишь 128-битная версия, а не 32-битная в IPv4; вы должны просто иметь возможность делать побайтовое сравнение.

person Suroot    schedule 24.11.2009
comment
Если это так, можете ли вы объяснить окончание %10 по сравнению с %11 в приведенных выше примерах моего IP-адреса? Я просто добавил фактические значения выше, чтобы сделать это более понятным. Обратите внимание, что это для одного адаптера Ethernet. У меня также есть беспроводной, и это совершенно другой адрес ipv6 (оканчивающийся на% 12, чего бы это ни стоило). - person Kirk Liemohn; 24.11.2009