Вступление
В этой, по большей части, чисто технической, статье я расскажу о реализации 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.
Архитектура нового стека представлена на рисунке:
Как видно из рисунка, новый стек предоставляет 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]» в поле адреса. Конечные пользователи вряд ли будут часто пользоваться этим нововведением, однако оно будет полезно для разработчиков и тестировщиков сетевых приложений и администраторов сетей.
Вместо заключения: если столь неформатная для хабра статья вызовет интерес, я готов опубликовать продолжение, которое расскажет об улучшениях в производительности стека.