В этой небольшой статье (ещё раз) объясняется, зачем в IPv6 адреса генерируются таким странным, на первый взгляд, образом.
По роду деятельности часто приходится слышать комментарий «ЗАЧЕМ?!» по поводу механизма генерации IPv6-адресов с использованием EUI-64. Новичкам в IPv6 кажется, что он назначается так: берём MAC-адрес, добавляем день изготовления устройства, почтовый индекс Уругвая и температуру за бортом, кидаем всё в миксер и получаем уникальный IPv6. Но на самом деле все процедуры имеют вполне простое и понятное объяснение.
Начнём с добавления FFFE.
MAC-адреса. Используются во многих протоколах (почти все IEEE 802-точка), в том числе в 802.3 (aka Ethernet) и 802.11 (aka WiFi). 48 бит, шестнадцатеричный формат, все дела.
IEEE считает, что название MAC-48 уже не отражает сути, поэтому правильно говорить «EUI-48».
Кроме 48-битных идентификаторов используются и 64-битные, т.н. EUI-64. Примеры протоколов: FireWire, ZigBee, 802.15.4, 6LoWPAN и, ожидаемо, IPv6.
Плюсы? Например, больше адресов (48 бит кончатся к 2100, бида-бида), а ещё можно включить EUI-48 как подмножество.
Собственно, первый шаг не имеет к IPv6 никакого отношения. IEEE заранее зарезервировал EUI-64 вида [24 бит] FF FE [24 бит] под адреса, полученные из EUI-48. Отсюда и механизм генерации: распилить MAC пополам и между половинками записать FFFE.
Таким образом, на шаге 1 мы просто делаем из EUI-48 (читай, MAC) более длинный EUI-64, который и используется в IPv6.
Шаг 2 – инверсия бита
И снова экскурсия в MAC-адреса.
Возьмём двоичное представление адреса. Нам важен первый байт, а точнее – младший и следующий за ним биты. Поскольку по сети они будут передаваться задом-наперед, их с одинаковым успехом можно называть "первый" и "второй", либо "седьмой" и "восьмой".
За картинку спасибо Wikipedia
Самый младший бит зовётся Individual/Group, он же Multicast. Если он равен 0, то адресат – узел. Если 1 – то кадр с таким адресом назначения по умолчанию флудится на все порты.
Пример:
Адреса 01:00:00:00:00:01 и 03:12:34:56:78:90 – multicast. На узлы их назначать нельзя.
Соседний бит – Unique/Local. Определяет, считается ли этот адрес уникальным или локальным (читай: его придумал местный админ). Если бит равен 0, то адрес по идее соответствует какой-либо организации (список, например). Если 1 – скорее всего, сами придумали.
Пример:
Адрес 02:00:00:AB:CD:EF мы придумали сами (U/L бит равен 1), а вот адрес 04:DA:D2:AB:CD:EF, наиболее вероятно, принадлежит какой-то железке от Cisco.
Следствие:
Почти все уникальные MAC-адреса будут иметь первый байт, кратный 4 (04, 08, 0С, 10, 14 и т.д.). У придуманных адресов, соответственно, чётный, но не кратный 4, то есть 02, 06, 0A и так далее.
Классно, но зачем инвертировать бит U/L?
А это как раз для удобства.
Возьмём два роутера.
Один постираем обычным порошком будет использовать уникальный MAC, который ему достался в наследство от дедушки-Xerox, а на другой мы назначим свой «блатной» MAC-адрес согласно воле левой пятки админа.
R1-unique#show interfaces Fa0/0
FastEthernet0/0 is administratively down, line protocol is down
Hardware is Gt96k FE, address is 0000.0000.0001 (bia 0018.1845.f0e2)
!U/L бит равен 0, значит адрес уникальный (из адресов Xerox)
R2-local#show interfaces Fa0/0
FastEthernet0/0 is administratively down, line protocol is down
Hardware is Gt96k FE, address is 0200.0000.0001 (bia 0018.1845.f0e2)
!U/L бит равен 1, значит адрес локально назначен
Включаем IPv6 на интерфейсе и чувствуем разницу:
R1-unique#sh ipv6 interface brief
FastEthernet0/0 [administratively down/down]
FE80::200:FF:FE00:1
R2-local#show ipv6 interface brief
FastEthernet0/0 [administratively down/down]
FE80::FF:FE00:1
Из-за лишнего хекстета админ первого роутера всё время матерился набирал руками больше символов и вынужден был выйти на пенсию по состоянию здоровья из-за истирания кончиков пальцев об клавиатуру, а второй админ жил долго и счастливо.
Как видим, благодаря инвертированию бита на втором роутере в адресе «сокращается» дополнительный хекстет. Уникальным адресам от инверсии обычно ни жарко, ни холодно, потому что они крайне редко бывают «красивыми». А вот локально назначаемые MAC-адреса позволят таким образом генерировать более удобные IPv6-адреса. Резюмируя, в IPv6 для получения идентификатора интерфейса MAC-адрес сначала преобразуется к EUI-64 (распил пополам, между половинками вставляется FFFE), а затем для нашего же удобства инвертируется U/L-бит. И теперь понятно, зачем.
Ложка дёгтя:
Механизм получения адреса по EUI-64 можно ещё назвать «NSAкина радость»: в любой сети независимо от префикса он будет давать один и тот же достаточно уникальный идентификатор, по которому легко будет проследить перемещение устройства. Поэтому, приватности ради и безопасности для, современные ОС на конечных устройствах генерируют адреса случайным образом.
IPv6 хоть и кажется на первый взгляд пришельцем из космоса, на самом деле является достаточно логичным и даже, о чудо, удобным. Надеюсь, изложенная информация была полезной. И если звёзды сойдутся нужным образом, а лень самопобедится, я постараюсь написать ещё статей на тему IPv6.
Александр Щербинин (с) 2014
Копирование материала и его публикация на других сайтах запрещены. Если вы хотите поделиться статьёй - поставьте ссылку на эту страницу или воспользуйтесь кнопками соц.сетей.