IPv6 в новом TCP/IP стеке Windows

    Вступление


    В этой, по большей части, чисто технической, статье я расскажу о реализации IPv6 в новом TCP/IP стеке Microsoft. Новый стек включен в ОС Windows начиная с Vista и Server 2003. Короткое введение рассказывает о том, что такое IPv6, а следующие три раздела — об отличиях нового стека от старого (особенно подробно — об отличиях, связанных с IPv6). Надеюсь, вас не напугает слишком строгое изложение.


    1. Введение: коротко о IPv6


    IPv4

    Протокол IP Version 4 (IPv4) не претерпевал сколь-либо серьезных изменений со времен опубликованного в 1981 году RFC 791. Благодаря удачному исходному дизайну, IPv4 выдержал сопутствовавшее росту обслуживаемому им сетей испытание на масштабируемость. IPv4 устойчив, прост в имплементации и взаимодействии.

    Однако, к началу 90-х годов основанный на TCP/IP интернет начал расти колоссальными темпами. Уменьшение количества свободных IP-адресов происходило угрожающе быстро даже с учетом введения бесклассовой адресации. Стало очевидно, что требуется разработать способ избежать их дефицита в будущем. В 1992 году IETF опубликовала в виде RFC (RFC 1550) призыв к разработке и публикации прототипов протокола, названного «IP The Next Generation» (IPng).


    NAT

    Изобретение в середине 90-х Network Address Translation (NAT) помогло значительно замедлить уменьшение количества доступных адресов. NAT позволяет транслировать запросы из внутренней сети во внешнюю (например, интернет), используя единственный внешний IP-адрес (NAT подменяет адреса непосредственно в заголовках датаграмм). Однако, NAT имеет ряд собственных недостатков. Трансляция адресов нарушает оригинальную модель соединения хостов в интернете, тем самым усложняя их взаимодействие и негативно влияет на производительность.

    Недостатки NAT ограничивают сферу ее применения, так что NAT не решила (хотя значительно замедлила и позволила выиграть немало времени) проблему уменьшения количества свободных адресов. Кроме того, IPv4 имеет ряд недостатков, устранение которых не входит в функции NAT. К ним относятся, например, слишком большой объем таблиц маршрутизации на основных роутерах интернета, а также отсутствие обязательного стандарта на применение IPsec.


    IPv6

    В 1996 году IETF выпустила серию RFC, описывающих результат работы над IPng — Internet Protocol Version 6 (IPv6). Протокол объединил в себе концепции многих уже существовавших на тот момент улучшений IPv4 в рамках одного стандарта. IPv6 является довольно консервативным расширением IPv4, и многие протоколы транспортного и программного уровней требую минимальных изменений для работы поверх IPv6 (или не требуют их совсем).

    IPv6 включает следующие основные нововведения:
    • Новый формат заголовка, призванный уменьшить его размер до минимально возможного. Все необязательные поля, находившиеся ранее в заголовке, перемещены в «расширенные заголовки», помещенные после основного. Благодаря этому, заголовки пакетов теперь могут более эффективно обрабатываться на промежуточных маршрутизаторах.
    • Новый формат адресов. 16 байт, выделенные для поля адреса, позволяют составить 3,8e38 комбинаций. Это позволит полностью отказаться от технологий преобразования адресов (таких, как NAT). Кроме того, адресное пространство позволяет формирование нескольких уровней вложенности сетей и формирует эффективную иерархическую инфраструктуру маршрутизации.
    • Обязательная поддержка IPsec.
    • Stateless address configuration, позволяющая узлам в сети без DHCP-сервера автоматически настраивать адреса IPv6, используя префикс маршрутизатора или полностью самостоятельно.
    • Улучшенная система приоритетной доставки, работающая при помощи новых полей в заголовке пакета IPv6, описывающих, как трафик должен быть идентифицирован и обработан. Поскольку информация о приоритетах находится в заголовке, даже пакеты, закодированные IPsec поддерживают данную опцию.
    • ICMPv6 — новый протокол для взаимодействия узлов одной сети, заменяющий ARP и ICMPv4 Router Discovery.


    2. Реализации IPv6 в операционных системах Microsoft


    Реализации IPv6 Microsoft


    Первой реализацией стека IPv6 Microsoft является выпущенная в 1998 году подразделением Microsoft Research экспериментальная прототипная имплементация, известная как «MSRIPv6 1.0». Ее разработка и совершенствование были продолжены и в дальнейшем, вплоть до версии 1.4.

    В начале 2000 года MS Research объединили усилия с группой Windows Networking, и в марте на веб-сайте MSDN стало доступно для загрузки Technology Preview стека IPv6 для Windows 2000 SP1. Вышедшая в октябре 2001 Windows XP имела встроенную поддержку IPv6 в виде Developer Preview стека (который, однако, не устанавливался по умолчанию, но мог быть легко добавлен впоследствии). В Windows XP SP1 и Windows Server 2003 был включен первый полностью поддерживаемый и пригодный для коммерческого внедрения стек IPv6 Microsoft.

    Вышедшая в 2007 году Windows Vista включала в себя новую реализацию IPv6 (и вообще всей сетевой подсистемы), «Next Generation TCP/IP stack». Новый стек унаследовал архитектуру MSRIPv6, однако код был полностью переписан.

    В итоге, на данный момент существует 4 официальных пригодных для промышленного использования имплементации IPv6 Microsoft:
    • The Next Generation TCP/IP stack для Windows Vista, Windows Server 2003 и Windows 7;
    • Протокол IPv6 для семейства Windows Server 2003;
    • Протокол IPv6 для Windows XP Service Pack 1 и более поздних версий;
    • Протокол IPv6 для Windows CE .NET 4.1 и более поздних версий.

    Next Generation TCP/IP stack

    Стек протоколов TCP/IP, включенный в Windows XP и Windows Server 2003 был создан в начале 1990-х и за время своего существования претерпел множество изменений и доработок. Next Generation TCP/IP stack является полной заменой старой сетевой подсистемы не только для IPv6, но и для IPv4.

    Архитектура нового стека представлена на рисунке:

    Next Generation TCP/IP stack

    Как видно из рисунка, новый стек предоставляет 3 API для доступа программ, сервисов и компонентов системы к сетевой функциональности:
    • WSK (Winsock Kernel) — используется клиентами WSK (например, сетевыми драйверами).
    • Windows Sockets — используется программами и сервисами, основанными на Windows Sockets. Windows Sockets API, в свою очередь, использует Ancillary Function Driver (AFD) для работы с сокетами TCP/IP.
    • TDI — используется NetBIOS over TCP/IP и другими legacy клиентами TDI. Роль прослойки между TDI и стеком выполняет драйвер TDX.

    Стек взаимодействует с WFP (Windows Filtering Platform) Callout API, универсальным интерфейсом для контроля и модификации пакетов. С его помощью Next Generation TCP/IP stack предоставляет возможность обработки пакетов на сетевом, канальном и транспортном уровнях. Более подробный рассказ о WFP предстоит в главе 4.

    Прием и отправка фреймов осуществляется при помощи NDIS (Network Driver Interface Specification) — разработанного Microsoft совместно с 3Com API для сетевых адаптеров.

    Обобщенно, в архитектуре драйвера стека (tcpip.sys) можно выделить следующие уровни:
    • Transport Layer — содержит имплементации TCP и UDP, а также механизм для отправки «сырых» IP пакетов, в которых отсутствует TCP или UDP заголовок.
    • Network Layer — содержит имплементации IPv4 и IPv6, совмещенные в dual IP layer.
    • Framing Layer — содержит модули для фреймирования IP пакетов. Уровень включает модули для различных физических сетевых технологий (таких как IEEE 802.3 (Ethernet), IEEE 802.11, PPP и IEEE 1394) и логических интерфейсов (loopback, IPv4 туннели и IPv6 туннели).


    3. Технологические различия в реализации нового и старого стеков


    Dual IP layer architecture

    Имплементации IPv6 в Windows XP и Windows Server 2003 имели архитектуру двойного стека. Старый стек содержал отдельные компоненты для IPv4 и IPv6, каждый из которых имел собственную реализацию TCP и UDP, а также канального уровня.

    Next Generation TCP/IP stack — это единый компонент, имеющий двухслойную архитектуру IP. IPv4 и IPv6 в нем используют общие транспортный и канальный уровни. Благодаря единой имплементации TCP, TCP over IPv6 имеет все преимущества в производительности, присущие новому стеку. Подробнее об улучшениях в производительности будет сказано в главе 7.


    Winsock Kernel

    Winsock Kernel (WSK) — это новый API уровня ядра, разработанный в качестве замены используемому в Windows XP и Windows Server 2003 Transport Driver Interface (TDI). WSK обладает большей производительностью и более прост в программировании. Новый стек в целях обратной совместимости поддерживает и TDI, используя TDX в качестве прослойки.

    Winsock Kernel использует те же концепции, что и интерфейс пользовательского уровня Winsock2. WSK поддерживает привычные операции с сокетами, такие как создание сокетов, резервирование, установление соединения, прием и передачу данных. Однако, следует заметить, что WSK — это абсолютно новый интерфейс, обладающий рядом уникальных характеристик, таких, как асинхронный ввод-вывод с использованием I/O request packets (IRP) и event callbacks для увеличения производительности.


    Windows Filtering Platform

    Интерфейсы в старом стеке, связанные с безопасностью, firewall hook, filter hook и база данных пакетного фильтра были заменены новым фреймворком, названным Windows Filtering Platform (WFP). WFP предоставляет возможности для фильтрации на всех уровнях стека TCP/IP. По сравнению с использовавшимися ранее технологиями, WFP более безопасен, непосредственно интегрирован в стек и более прост в программировании.

    Технически, WFP представляет из себя набор системных сервисов и API уровней пользователя и ядра. WFP позволяет разрабатывать на своей основе межсетевые экраны и другое программное обеспечние для управления соединениями и обработки пакетов. Windows Firewall в Windows Vista, Windows 7 и Windows Server 2008 используют WFP.


    Receive-Side Scaling

    Архитектура NDIS 5.1 и более ранних версий ограничивала обработку запросов одного сетевого адаптера единственным процессором. Таким образом, даже многопроцессорный компьютер задействовал только один процессор для обработки сетевого трафика. Receive-side scaling устраняет этот недостаток, позволяя балансировать сетевую нагрузку между несколькими процессорами.

    RSS делает возможным параллельное выполнение нескольких отложенных вызовов процедур (DPC) для одного сетевого адаптера. Кроме того, в случае, если данная опция поддерживается сетевым адаптером, RSS позволяет параллельные прерывания.


    Расширяемая инфраструктура

    Благодаря расширяемой инфраструктуре, модульные компоненты нового стека могут быть добавлены или извлечены из него динамически.


    4. Различия в поддержке стандартов и технологий


    IPsec

    В Windows XP и Windows Server 2003 поддержка Internet Protocol security для трафика IPv6 была ограниченной. Старый стек TCP/IP не поддерживал Internet Key Exchange (IKE) и шифрование данных. Кроме того, все правила и ключи IPsec настраивались посредством редактирования текстовых файлов и активировались при помощи утилиты командной строки IPsec6.exe.

    Новый стек поддерживает IPsec для IPv6 так же, как и для IPv4. Эта поддержка включает IKE и шифрование данных с использованием AES 128/192/256, а также конфигурирование при помощи графических утилит.


    MLDv2

    Протокол Multicast Listener Discovery (MLD) используется IPv6 коммутаторами для обнаружения в своей сети multicast listeners (узлов, принимающих многоадресные пакеты) и определения того, какие именно multicast адреса эти узлы интересуют. Коммутатор сам может быть multicast listener-ом одного или нескольких multicast адресов. В этом случае он должен проинформировать другие коммутаторы в своей сети о том, что он принимает многоадресные пакеты. MLD является аналогом протокола IGMP для IPv6.

    В новом стеке появилась поддержка MLDv2. Отличием MLDv2 от первой версии является поддержка «source filtering». Узел имеет возможность сообщить о том, что он принимает только многоадресные пакеты, отправленные с одного из адресов из определенного набора, или все многоадресные пакеты кроме отправленных с адреса из определенного набора. Следует отметить, что несмотря на новшества, MLDv2 может взаимодействовать с MLDv1.


    LLMNR

    Цель Link-Local Multicast Name Resolution (LLMNR) состоит в том, чтобы обеспечить возможность разрешения сетевых имен в ситуациях, когда осуществление этого при помощи DNS невозможно (например, когда в сети просто нет сервера DNS). В IPv4 для подобных целей традиционно использовался протокол NetBIOS over TCP/IP (NetBT). Однако NetBT работает только с IPv4 и не поддерживает IPv6. Кроме того, администратор сети может отключить NetBT в сети, использующей DNS сервер.

    LLMNR поддерживает все существующие и будущие форматы, типы и классы DNS. При этом LLMNR использует собственный порт и отдельный от DNS кеш. LLMNR не является заменой DNS, так как предназначен для работы только в локальных сетях.


    IPv6 over PPP

    Point-to-Point Protocol (PPP) предоставляет стандартный метод инкапсуляции пакетов сетевого уровня для передачи по каналам «точка-точка». Кроме того, PPP включает протокол управления каналом LCP (Link Control Protocol), используемый для конфигурирования и тестирования соединения, а также семейство протоколов управления сетью NCP (Network Control Protocol) для различных протоколов сетевого уровня.

    В новом стеке TCP/IP появилась встроенная поддержка передачи IPv6 трафика с использованием PPP. Стек включает NCP для IPv6, известный как IPv6 Control Protocol (IPV6CP) и поддерживает пересылку IPv6 пакетов по PPP-соединению. Например, существует возможность подключения к ISP, использующему IPv6, с помощью dial-up или PPP over Ethernet.


    DHCPv6

    Появившаяся в IPv6 «stateless address autoconfiguration» устраняет главную причину использования DHCP в сетях IPv4, однако не может заменить его полностью. DHCPv6 может использоваться для назначения узлам заранее выбранных адресов в случае, если администратор сети хочет получить больший контроль над распределением адресов. Кроме того, сервер DHCPv6 может распространять информацию, которую хосты не могут получить другим способом — например, адреса серверов DNS [NDP!].

    Клиентский сервис DHCP в новом стеке поддерживает DHCPv6 и оба режима его конфигурации (stateless и stateful). Сервера DHCP в Windows Server 2008 также имеет поддержку DHCPv6.


    Случайные идентификаторы интерфейсов

    Для того, чтобы предотвратить сканирования адресов IPv6 для поиска известных идентификаторов производителей сетевых адаптеров, новый стек по умолчанию генерирует случайные идентификаторы интерфейсов для автоматически настроенных адресов IPv6.


    Использование буквальных адресов IPv6 как URL в WinInet

    Win32 Internet Extensions (WinInet) — это API высокого уровня для доступа к общим протоколам интернет. В отличие от WinSock, он позволяет разработчику не заботиться о деталях реализации соответствующих протоколов.

    В операционных системах с новым стеком WinInet поддерживает использование буквальных адресов IPv6 в URL. Например, в браузере, основанном на WinInet (таким является, например, Internet Explorer) можно ввести «http://[2001:db8:100:2a5f::1]» в поле адреса. Конечные пользователи вряд ли будут часто пользоваться этим нововведением, однако оно будет полезно для разработчиков и тестировщиков сетевых приложений и администраторов сетей.



    Вместо заключения: если столь неформатная для хабра статья вызовет интерес, я готов опубликовать продолжение, которое расскажет об улучшениях в производительности стека.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 57
    • 0
      Да, серьезный, новый протокол. Потребует много мозговых усилий для понятия работы, особо от неопытных системных администраторов. Хотя в полной мере время ipv6 наступит ещё совсем не скоро. Лет 5 еще поживем спокойно.
      • 0
        Начал недавно проходить ipv6.he.net/certification. Эдакий квест для сисадминов. Хоть я и девелопер, лишние знания не помешают.
        • 0
          Вы в ссылку вместо " / " в конце ссылки поставили точку.

          С права есть более забавная ссылка на статистику ipv6.he.net/statistics/
      • +12
        А почему статья неформатная?
        Самый-самый что ни на есть формат!
        • +14
          Ну конечно, хабр уже давно не про технологии, а про хелловорлды и новые крутые телефоны. Алсо, автор там тег забыл.

          К.О.
          • +2
            Тег irony, хотел сказать.
            • 0
              Чистая правда. Кстати, интересно заметить, что в каментах к подобным «умным» статьям число холиваров стремится к нулю :)
              • 0
                Число самих каметов в таких статьях тоже стремится к нулю, увы.

                Также, надевая костюм К.О., скажу что для холивара на такие темы нужно знать матчасть, так что левой пяткой участвовать в специальной олимпиаде не получится.
            • +1
              Хабр еще торт!
            • НЛО прилетело и опубликовало эту надпись здесь
              • +1
                Не обязательно.
                Можно получить от /64 до /48 от провайдера.
                /64 — это минимальный размер подсети на езернете, /48 уже даже через туннели раздают.
                • НЛО прилетело и опубликовало эту надпись здесь
                  • +2
                    думаю, что свой персональный /64
                    в светлом будущем интернетом будут пользоваться всякие девайсы — от холодильников до точилок карандашей. вот им адреса и нужны :)
                    • +1
                      белый IP на моем холодильнике??? да никогда в жизни! чтобы кто-то его взломал и скачал все мое пиво???
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • +1
                      /64 — это стандартный размер сабнета для Ethenet-сегментов.
                      его вполне можно зароутить к клиенту, который сидит за CPE

                      /48 обычно выдают организациям, у которых может быть больше одного ethernet-сегмента.

                      размер не такой уж гигантский, вот ссылка на калькулятор www.liquidalchemy.com/liquidalchemy/, там можно посчитать, и немного прикинуть :)

                      • НЛО прилетело и опубликовало эту надпись здесь
                        • +1
                          В IPv6 задумано, что последние 64 бита будут получаться из MAC адреса (EUI-48 → EUI-64). Так что /48 — это 65536 локальных сетей. В каждой такой сети может быть и 5 компов, и 5000, и в разы больше.

                          Впрочем, никто не мешает выдавать адреса «по порядку», тогда действительно, адресов будет очень много :)
                    • +1
                      Для юриков скорее /48, а для физиков /56
                      • +1
                        Скорее просто больше оплата будет. Как сейчас за выделенный айпи, так и потом — за большую подсеть.
                        • +1
                          Вполне, но я с трудом представляю куда денет физик., сеть 56 :) Если память не изменят это рекомендации именно RIPE по раздаче
                    • 0
                      В RIPE/ARIN/etc нужно регать PI, или PA >= /48

                      правда цены на регистрацию IPv6-блоков у LIR-ов не радуют, ок. 500 евро за /48
                    • +4
                      Публикуйте дальше!

                      Кстати уже предоставляю пользователям IPv6 over Ethernet.
                      • +1
                        а что же случилось с IPv5 и почему сразу прыгнули к 6-ой версии?)
                        • +2
                          его планировали, как расширение к 4й версии
                          а вообще, IPv6 хотели выдать 7й номер, по ошибке
                            • 0
                              Мне казалось, что цифра 6 там означает 6 октетов, заместо 4х в IPv4
                              • +1
                                В IPv6 128 бит, IPv4 — 32. Там не шесть октетов, а все шестнадцать :)
                            • НЛО прилетело и опубликовало эту надпись здесь
                              • НЛО прилетело и опубликовало эту надпись здесь
                                • +5
                                  Ради справедливости стоит заметить, что «первоначально свой стек из BSD схитили» все, кому не лень — лицензия же позволяет. Реализация Berkley всегда являлась стандартом де-факто.
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                  • +1
                                    man ipv6
                                  • +1
                                    > Более подробный рассказ о WFP предстоит в главе 4.

                                    Это перепост из книги?
                                  • +1
                                    Хочу попробовать ipv6 для телефонии. У нас несколько сетей по миру плюс с десяток домашних юзеров. Пляска с nat и stun запарила по самое не могу.
                                    • –3
                                      NAT хорошо защищает от внешних вторжений между прочим
                                      • +1
                                        Никто и не запрещает использовать его. Просто те, кому он не нужен/мешает, вздохнут с облегчением :)
                                        • +2
                                          Обоснуйте.
                                          Только не надо говорить о том что нельзя получить прямой доступ к целевой машине. Для этого есть Firewall.
                                          • –1
                                            я это и хотел сказать
                                            а про файрволл не надо рассказывать — его настраивать надо
                                            а NAT работает из коробки
                                            • +2
                                              NAT не позволит инициировать подключение злоумышленнику, а если оно инициировано со стороны клиента, то NAT как мёртвому припарка. А настраивать файрволл не так уж и сложно, особенно все эти consumer-oriented в роутерах и софтверные.
                                              • +1
                                                NAT для начала надо поднять и настроить, если этого не сделать то пользователи Вас будут проклинать.

                                                К тому же сами подумайте, вот есть у Вас сеть локальная (районная локалка) и Вы не за NAT-ом для пользователей данной сети и каждый школьник возомнивший себя «кулхацкером» будет к Вам ломиться. Большую же угрозу составляет сам контент который вы получаете на конечной машине (это я о " вредоносном коде" — вирусы, трояны, и.т.д. ). Так что позиционировать NAT как хорошее средство защиты на мой взгляд сомнительно, к тому же если говорить о «внешних вторжениях» то, как я уже говорил, Firewall в помощь и не секрет что на рынке ПО сейчас море данной продукции, как платной там и бесплатной, и настроить Firewall для домашнего компьютера сейчас может и «домохозяйка».

                                                IPv6 решает проблему с адресацией, подумайте о плюсах для домашних сетей и пользователях которые сидят за NAT и которые хотят раздавать торрены (это как пример).
                                          • 0
                                            Спасибо, очень интересно!

                                            Как раз осваиваю сетевые технологии, так что пост мне помог =)
                                            • +1
                                              В статье многое спорно. Начиная с утверждения об удачности IPv4 и далее по тексту о достоинствах IPv6.
                                              Рекомендую почитать Ивана Пепельняка, начать можно с его свежей заметки IPv6 Myths.
                                              • +1
                                                Один из лучших комментариев — и зачем-то минусуют.
                                                IPv4 можно назвать удачным хотя бы потому, что он справился со своей задачей. Все остальное, конечно, субъективно.
                                                Что касается заметки, то она весьма интересна, но и сама не без спорных моментов. Кроме того, я не вижу никаких противоречий между ней и статьей.
                                                • 0
                                                  Моё мнение, что у IPv6 есть только одно большое преимущество — большее количество адресов. А с главными проблемами IPv4, контролем перегруженности и безопасностью — почти ничего нового. Что согласитесь для 14 лет разработки, совсем не впечатляет.
                                                  • 0
                                                    Я не совсем понимаю сути Ваших замечаний. Вы говорите так, как будто где-то в статье новшества IPv6 названы «революционными улучшениями» или «огромными преимуществами».
                                                    • 0
                                                      Да просто хотел пофлеймить на тему крутости IPv6 :) Статья ОК
                                                      • 0
                                                        А, ну это — всегда пожалуйста :)
                                                        Многие технологии, связанные с сетями, вроде бы морально устарели. С другой стороны, безболезненно модернизировать или заменить их вряд ли получится.
                                                        • 0
                                                          IETF ограничивала необходимость добиться хоть какой-нибудь «совместимости» с IPv4. И вообще, там очень не любят радикальных изменений.
                                                          • 0
                                                            это, жаль, один фиг стек меняется
                                                            когда ещё такой повод все переделать появится?
                                                • +2
                                                  Статья полезная, но больно уж режет слух/зрение слово «имплементация». Почему не пользуетесь нормальным русским словом «реализация»? :)
                                                  • 0
                                                    Согласен, очень режет глаз! Ведь это же не термин никакой, так что и нет никакого смысла использовать заимствование. Даже в плане длины и сложности произношения — сплошной проигрыш.

                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.