IPv4 против IPv6: В чем разница между IPv4 и IPv6

24.03.19 в 13:51Сетевые технологии → Полезные материалы по сетям

Большинство из нас слышало об IPv6, а также о том, что протокол IPv6 должен заменить IPv4.<cut> Но зачем делается эта замена? Давайте разберёмся в этом вопросе, а заодно и рассмотрим, какова разница между обеими версиями. </cut>

Зачем менять IPv4?

Главная причина — адресов IPv4 уже давно не хватает.

Дело в том, что IP-уровень стека протоколов TCP/IP считается наиболее важной частью всей архитектуры глобальной сети. IPv4 — четвёртая версия протокола IP, после запуска которой сразу стало ясно, что существуют ограничения в плане возможностей и масштабируемости. То есть распределение адресного пространства происходило намного быстрее, чем могла себе позволить архитектура IPv4.

Результат — появление классовой, а потом и бесклассовой адресации. В итоге уже в феврале 2011 года IANA выделила пять последних блоков адресов RIRам. В результате уже в том же году свободные IP-адреса стали заканчиваться и у региональных регистраторов.

Как раз для решения этой проблемы и была разработана альтернатива — версия IP-протокола, известная под названием IPv6.

Автор этой статьи знает о проблеме недостатка адресов IPv4 не понаслышке. Ещё в 2014 году, работая над дипломом в университете, я столкнулся с тем, что не смог получить в своё распоряжение статический IP. И даже будучи на тот момент индивидуальным предпринимателем, оформив соответствующую заявку и лично поговорив с руководством компании-провайдера, проблему в сжатые сроки мне решить не удалось. А ведь в рамках дипломного проекта я создавал сервер на собственном домашнем компьютере и статический IP был просто жизненно необходим. На мои постоянные вопросы о том, как же мне получить этот адрес, звучал простой ответ: «Когда кто-нибудь откажется — тогда дадим вам». Понятное дело, никто отказываться не спешил. Проект удалось в итоге реализовать, используя динамический IP, но это было совсем не то, что планировалось изначально.

Наиболее очевидные отличия между IPv6 и IPv4

Давайте их перечислим: • в IPv6-адресе 128 бит представляет собой целых восемь 16-битных 16-теричных блоков, которые разделены двоеточиями. Пример: <codeinline>2dfc:0:0:0:0217:cbff:fe8c:0</codeinline>. Если же говорить про адрес IPv4, то традиционной формой его записи является запись в виде 4-х десятичных чисел от 0 до 255, которые разделены точками, а через дробь обозначается длина маски подсети. Пример: <codeinline>192.168.0.0/16</codeinline>; • в IPv4-адресе для мультивещания зарезервирована подсеть <codeinline>224.0.0.0/4</codeinline>. Что касается IPv6, то тут для данных целей используется адресное встроенное пространство <codeinline>FF00::/8</codeinline>; • для передачи широковещательных адресов IPv4 применяет широковещательные пакеты, а IPv6 — многоадресные группы; • в качестве неопределённого адреса протокол IP четвёртой версии применяет <codeinline>0.0.0.0</codeinline>, а при создании обратной связи (loopback) — <codeinline>127.0.0.1</codeinline>. Что касается IPv6, то тут применяются <codeinline>::</codeinline> и <codeinline>::1</codeinline> соответственно; • для трафика в IPv4 задействуются глобальные уникальные публичные адреса, а также «частные» адреса, в IPv6 — локальные адреса <codeinline>FD00::/8</codeinline> и глобальные уникальные юникаст-адреса.

Чем же лучше IPv6?

Для наглядного понимания плюсов давайте перечислим основные преимущества IPv6 по сравнению с IPv4: — более эффективная маршрутизация, отсутствие фрагментации пакетов; — встроена технология Quality of Service (QoS), определяющая чувствительные к задержке пакеты; — устранение NAT позволило расширить пространство адресов с 32 до 128 бит; — есть поддержка IPsec (применение IPsec опционально); — автоконфигурация адресов упрощает администрирование сети; — улучшена структура заголовка, что уменьшает затраты на обработку.

Какой IP-протокол безопаснее: IPv6 или IPv4?

Собственно говоря, теоретически они одинаково безопасны. Смотрите, после того, как запустили IPv6, появилась возможность зашифровывать трафик посредством довольно распространённого (но не так, как SSL) стандарта IPSec. Этот стандарт шифрования не позволяет прочитать содержимое интернет-трафика во время его перехвата. Однако как шифрование, так и расшифровка требуют наличия оборудования, которое стоит недёшево. Кроме того, возможна реализация IPSec и на IPv4, что в принципе означает, что оба этих IP-протокола безопасны в одинаковой степени.

Теме не менее некоторые специалисты утверждают, что пока ещё переход на IPv6 полностью не завершён, пользователи IPv6 более уязвимы, чем пользователи четвёртой версии IP-протокола. Это связано с тем, что провайдеры предоставляют пользователям IPv4 доступ к IPv6-контенту, используя для этого IPv6-туннели. Как раз эти туннели и могут применять злоумышленники для проведения своих атак.

Идём дальше. Очередная потенциальная проблема касается автоконфигурации — это новая функция IPv6. Опция позволяет устройствам назначать себе IP-адрес на основе MAC-адреса самостоятельно. Это уже могут использовать посторонние лица для отслеживания некоторых пользователей. Однако для решения этого вопроса на устройствах, работающих под управлением известных операционных систем, уже предусмотрены расширения для конфиденциальности, а значит, для большинства людей данная проблема перестаёт быть актуальной.

А что быстрее — IPv6 или IPv4?

На самом деле скорость сети с IPv6 практически не отличается от скорости интернета с с IPv4. Да, теоретически IPv6 должна работать быстрее благодаря более простому формату. Однако в процессе перехода мы этого не ощутим, так как некоторые методы (например, те же IPv6-туннели) создают дополнительные задержки во время преобразования запросов в IPv4 и наоборот.

Почему затягивается полный переход на IPv6?

Причина у этого банально проста: высокая стоимость. Чтобы обновить все серверы, маршрутизаторы и коммутаторы, которые всё это время работали лишь с IPv4, потребуется много времени и денег.

Также здесь нельзя не упомянуть и повсеместную практику провайдеров назначать пользователям динамический адрес, меняющийся при подключении к другой сети. В таком случае после отключения от интернета устройства освобождают адрес, в результате чего он становится доступен другим устройствам (по сути вы не владеете адресом, а лишь арендуете адрес).

Всё это в целом замедляет долгожданный и повсеместный переход с IPv4 на IPv6. Но это не значит, что IPv6 плохо распространяется. Сегодня он применяется параллельно с IPv4. По данным Google, порядка 14 % его пользователей уже используют IPv6. А если верить заявлением американского провайдера Comcast, в 2018 году в США около половины пользователей уже перешли на IPv6.

Делаем выводы

Итак, вряд ли можно сказать, что IP-протокол IPv6 безопаснее и быстрее своего «младшего брата», однако его преимущества очевидны. Это и более эффективная маршрутизация без фрагментации пакетов, и встроенная поддержка IPsec, и возможность автоконфигурации адресов. А если вспомнить ограниченность и исчерпание адресного пространства IPv4, то становится понятным, что переход на IPv6 — это лишь вопрос времени.

По материалам статей: • https://www.juniper.net/us/en/products-services/what-is/ipv4-vs-ipv6/; • https://www.comparitech.com/blog/vpn-privacy/ipv6-vs-ipv4/.

Сегодня каждый пользователь интернета может столкнуться с терминами протоколов IPv4 и IPv6. Возможно, вы слышали, как люди говорят, что протокол IPv6 лучше, чем IPv4. Но что именно означают эти аббревиатуры IPv4 и IPv6?

Содержание

Что такое IP адрес?

Интернет-протокол или IP-адрес является основным протоколом связи для передачи датаграмм и позволяет соединять различные устройства по всему миру и эффективно создавать сеть, которую мы называем интернетом. IP-адрес отвечает за адресацию узлов, инкапсуляцию данных в датаграммы и путь датаграмм от узла-источника к узлу назначения в одной или нескольких IP-сетях. IP содержит набор правил и рекомендаций, которым необходимо следовать при передаче любых данных по любому спектру сети.

IPv4 vs IPv6: что они означают?

IPv4 является 4-й версией IP. IPv4 — это протокол без установления соединения, который реализуется в сетях с использованием коммутации пакетов. Он работает на основе лучшей модели доставки данных, что означает, что они получат неопределенную переменную пропускную способность и время доставки, в зависимости от текущей нагрузки трафика. Это не гарантирует саму доставку, не обеспечивает адекватной последовательности и не позволяет избежать повторной доставки.

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

На видео: Отличие IPv6 от IPv4

Зачем нам IPv6?

IPv4 использует только 32 бита для своих интернет-адресов. В основном это означает, что IPv4 может обрабатывать до 32 IP-адресов, что составляет 4 294 967 296 (4,29 миллиарда). Хотя это число кажется большим, оценочное число устройств, подключенных к интернету, превышает 20 миллиардов, и это число растет день ото дня. Следовательно, IP-адрес любого устройства должен быть конкретным и уникальным, и по мере роста числа пользователей адреса IPv4 заканчиваются.

IPv6 использует 128-битные интернет-адреса. Это означает, что протокол может обрабатывать в общей сложности до 2 ^ 128 IP-адресов, которые будут приблизительно составлять 340 282 366 920 938 000 000 000 000 000 000 000 000. По сути, стандарта IPv6 достаточно, чтобы интернет работал очень и очень долго.

Преимущества IPv6

IPv6, наряду с увеличением количества доступных адресов, приносит дополнительные преимущества. С помощью протокола IPv6 была устранена необходимость изменения сетевых адресов — NAT, которая ранее использовалась для сохранения глобального адресного пространства из-за отсутствия адресов IPv4. Кроме того, протокол IPv6 также исключает возможность конфликтов частных адресов, а также оптимизирует многоадресную маршрутизацию.

По сравнению со стандартами IPv4, IPv6 имеет более простой формат заголовков, что позволяет упростить и повысить эффективность маршрутизации. Это также повышает качество услуг (QoS), также известное как «маркировка потока». Не забывайте, что IPv6 имеет встроенную аутентификацию и защиту конфиденциальности, а также гибкие опции с поддержкой расширений. В целом, IPv6 упрощает администрирование с помощью протокола DHCP.

Почему повсеместный переход на IPv6 еще не скоро состоится?

Истощение IPv4 было предсказано много лет назад. Уже достаточно давно была введена CIDR, которая впоследствии была заменена широко распространенным транслятором — NAT. Хотя оба метода работают, но они являются лишь временным способом остановить умирающую IPv4. В принципе, уже давно необходимо перейти на IPv6, но прогресс идет очень медленно. Чтобы внести изменения, программное обеспечение и маршрутизаторы требуют колоссальных изменений для поддержки более продвинутой сети, а это требует времени и денег.

Увеличение количества устройств, принимающих стандарты IPv6

IPv4 продолжает обеспечивать более 99% мирового интернет-трафика. Несмотря на десятилетнюю историю разработки и внедрения стандартов, глобальное внедрение IPv6 происходит медленно. С 2017 года, доля пользователей с протоколом IPv6 впервые достигла 20,1%, увеличиваясь примерно на 7,2% в год. Хотя устройства содержат стандарты IPv6, количество сетевых провайдеров, переходящих на IPv6, все еще достаточно мало. Между тем, IPv4 и IPv6 эффективно работают как параллельные сети, хотя обмен данными между этими протоколами требует специальных шлюзов.

IPv4 vs IPv6: неизбежные изменения

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

ОБЗОР

tcp6_socket = socket(AF_INET6, SOCK_STREAM, 0);raw6_socket = socket(AF_INET6, SOCK_RAW, protocol);udp6_socket = socket(AF_INET6, SOCK_DGRAM, protocol);

ОПИСАНИЕ

В Linux 2.2 реализован протокол Интернета версии 6. Эта справочная страница содержит описание основного программного интерфейса IPv6, который реализован в ядре Linux и в glibc 2.1. Программный интерфейс основан на интерфейсе сокетов BSD; смотрите socket(7).

Программный интерфейс IPv6, по большей части, совместим с IPv4 (смотрите ip(7)). В этой справочной странице описаны только различия между ними.

Чтобы привязать сокет AF_INET6 к любому процессу нужно скопировать локальный адрес из переменной in6addr_any, имеющей тип in6_addr. При статической инициализации также может быть использован макрос IN6ADDR_ANY_INIT, который раскрывается в константное выражение. В обоих значениях используется сетевой порядок байт.

Адрес устройства обратной петли IPv6 (::1) доступен в глобальной переменной in6addr_loopback. Для инициализации нужно использовать IN6ADDR_LOOPBACK_INIT.

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

IPv4 и IPv6 совместно используют локальное портовое пространство. При установлении соединения IPv4 или приёма пакета на сокете IPv6, адрес его источника отобразится в v6, и в дальнейшем он будет отображаться как v6.

Формат адреса

struct sockaddr_in6 {     sa_family_t     sin6_family;   /* AF_INET6 */     in_port_t       sin6_port;     /* номер порта */     uint32_t        sin6_flowinfo; /* информация о потоке IPv6 */     struct in6_addr sin6_addr;     /* адрес IPv6 */     uint32_t        sin6_scope_id; /* ID области (новое в 2.4) */ }; struct in6_addr {     unsigned char   s6_addr[16];   /* адрес IPv6 */ }; 

Значение sin6_family всегда устанавливается в AF_INET6; в sin6_port указывается порт протокола (смотрите sin_port в ip(7)); в sin6_flowinfo указывается идентификатор потока IPv6; в sin6_addr указывается 128-битный адрес IPv6. Значением sin6_scope_id является идентификатор, зависящий от области адреса. Это новое поле, появившееся в версии Linux 2.4. Linux поддерживает его только для адресов локальной связи (link local); в этом случае sin6_scope_id содержит индекс интерфейса (смотрите netdevice(7)).

IPv6 поддерживает несколько типов адресов: однозначные (unicast) — для адресации одного узла, многоадресные (multicast) — для адресации группы узлов, anycast — для адресации ближайшего члена группы узлов (не реализовано в Linux), IPv4-on-IPv6 — для адресации узла IPv4, и несколько других зарезервированных типов адресов.

Адрес IPv6 представляет собой группу из 8 4-разрядных шестнадцатеричных чисел, разделённых двоеточием «:». Два двоеточия «::» обозначают строку 0 бит. Специальные адреса: ::1 (для устройства обратной петли) и FFFF::<адрес IPv4> — для IPv4-преобразованного-в-IPv6.

В IPv6 используется единое с IPv4 пространство портов.

Параметры сокета

IPv6 поддерживает некоторые параметры сокета, относящиеся к протоколу, которые могут быть установлены с помощью setsockopt(2) и прочитаны с помощью getsockopt(2). Значением уровня (level) параметров сокета для IPv6 является IPPROTO_IPV6. Логический флаг в виде целого числа со значением 0 означает «ложь», другие значения — «истина».

IPV6_ADDRFORM
Преобразует сокет AF_INET6 в сокет другого семейства адресов. На данный момент поддерживается только AF_INET. Разрешено только для сокетов IPv6, которые подсоединены и привязаны к адресам v4-преобразованные-в-v6. В аргументе задаётся указатель на целое со значением AF_INET. Это полезно для передачи v4-преобразованных сокетов в виде дескрипторов файлов программам, которые не понимают программного интерфейса IPv6.
IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP
Определяет членство в многоадресных (multicast) группах. Аргументом является указатель на struct ipv6_mreq.
IPV6_MTU
getsockopt(): Возвращает известное в данный момент значение MTU маршрута текущего сокета. Только для подключённых сокетов. Возвращается целое число.

setsockopt(): Устанавливает MTU, который должен использоваться для сокета. MTU ограничивается значением MTU устройства или MTU пути, если включено определение пути MTU. Аргументом является указатель на целое.

IPV6_MTU_DISCOVER
Управляет определением пути MTU для сокета. Смотрите описание IP_MTU_DISCOVER в ip(7).
IPV6_MULTICAST_HOPS
Определяет лимит многоадресных пересылок (hop) для сокета. Аргументом является указатель на целое число. Значение -1 означает использование маршрута по умолчанию, в противном случае значение должно быть в диапазоне от 0 до 255.
IPV6_MULTICAST_IF
Назначает устройство для исходящих многоадресных пакетов для сокета. Это разрешено только для сокетов SOCK_DGRAM и SOCK_RAW. Аргументом является указатель на индекс интерфейса (смотрите netdevice(7)) в виде целого числа.
IPV6_MULTICAST_LOOP
Определяет, видит ли сокет многоадресные пакеты, которые сам и посылал. Аргументом является указатель на логическое значение.
IPV6_RECVPKTINFO (начиная с Linux 2.6.14)
Задаёт отправку управляющего сообщения IPV6_PKTINFO для входящих дейтаграмм. Такие управляющие сообщения содержат структуру struct in6_pktinfo, описанную в RFC 3542. Разрешено только для сокетов SOCK_DGRAM или SOCK_RAW. Аргументом является указатель на логическое значение в виде целого числа.
IPV6_RTHDR, IPV6_AUTHHDR, IPV6_DSTOPTS, IPV6_HOPOPTS, IPV6_FLOWINFO, IPV6_HOPLIMIT Задают отправку управляющих сообщений для входящих дейтаграмм, содержащих заголовки расширения из принятых пакетов. IPV6_RTHDR доставляет заголовок маршрутизации, IPV6_AUTHHDR доставляет заголовок аутентификации, IPV6_DSTOPTS доставляет параметры назначения, IPV6_HOPOPTS доставляет параметры пересылок (hop), IPV6_FLOWINFO доставляет целое, содержащее ID потока, IPV6_HOPLIMIT доставляет целое, содержащее счётчик пересылок пакета. Управляющие сообщения имеют тот же тип, что и параметры сокета. Все эти параметры заголовка могут также устанавливаться для исходящих пакетов посылкой определённого управляющего сообщения в управляющий буфер sendmsg(2). Разрешено только для сокетов SOCK_DGRAM или SOCK_RAW. Аргументом является указатель на логическое значение.
IPV6_RECVERR
Управляет получением асинхронных параметров ошибки. Смотрите описание IP_RECVERR в ip(7). Аргументом является указатель на логическое значение.
IPV6_ROUTER_ALERT
Передаёт все пересланные пакеты, содержащие предупреждающий параметр hop-by-hop маршрутизатора в сокет. Разрешено только для сокетов SOCK_RAW. Выявленные пакеты не пересылаются ядром, пользователь должен отправить заново самостоятельно. Аргументом является указатель на целое. Положительное число означает перехват значения предупреждающего параметра маршрутизатора. Пакеты, содержащие предупреждающий параметр маршрутизатора с таким значением поля, будут доставлены в сокет. Отрицательное значение отключает доставку пакетов с предупреждающим параметром маршрутизатора в сокет.
IPV6_UNICAST_HOPS
Определяет лимит однозначных (unicast) пересылок (hop) для сокета. Аргументом является указатель на целое число. Значение -1 означает использование маршрута по умолчанию, в противном случае его значение должно быть в диапазоне от 0 до 255.
IPV6_V6ONLY (начиная с Linux 2.4.21 и 2.6)
Если этот флаг установлен (не равен 0), то сокет отправляет и принимает только пакеты IPv6. В этом случае приложение IPv4 и IPv6 может привязать один порт за раз.

Если этот флаг сброшен (равен 0), то сокет можно использовать для отправки и приёма пакетов с и на адрес IPv6 или адрес IPv4-преобразованный-в-IPv6.

Аргументом является указатель на логическое значение в виде целого числа.

Значение этого флага по умолчанию определяется из содержимого файла /proc/sys/net/ipv6/bindv6only. По умолчанию значение в файле 0.

ОШИБКИ

ENODEV
Пользователь пытался выполнить bind(2) на адрес локальной связи IPv6, но sin6_scope_id в переданной структуре sockaddr_in6 содержит некорректный индекс интерфейса.

ВЕРСИИ

В Linux 2.4 сломана двоичная совместимость sockaddr_in6 у 64-битных узлов из-за изменения выравнивания in6_addr и добавления дополнительного поля sin6_scope_id. Интерфейс ядра остался совместимым, но программа, включающая sockaddr_in6 или in6_addr в другие структуры, уже может не быть совместимой. Это не является проблемой для 32-битных узлов, например с архитектурой i386.

Поле sin6_flowinfo является нововведением в Linux 2.4. Оно прозрачно передаётся/считывается ядром в длине переданного адреса. Некоторые программы, которые передают более длинный буфер адреса и затем проверяют длину исходящего адреса, могут перестать работать.

ЗАМЕЧАНИЯ

Структура sockaddr_in6 по размеру больше, чем обычная sockaddr. Программы, которые допускают, что все типы адреса могут без проблем сохраняться в struct sockaddr, нужно изменить использовав вместо неё struct sockaddr_storage.

Параметры сокета SOL_IP, SOL_IPV6, SOL_ICMPV6 и другие SOL_* являются непереносимыми вариантами IPPROTO_*. Смотрите также ip(7).

ДЕФЕКТЫ

Расширенный программный интерфейс IPv6, описанный в RFC 2292, к настоящему времени реализован частично; хотя ядро версии 2.2 имеет почти полную поддержку параметров приёма, макросы для генерации параметров IPv6 в glibc 2.1 отсутствуют.

Поддержка IPSec для заголовков EH и АХ отсутствует.

Описание управления потоком на основе меток (label) не завершено и здесь не описано.

Эта справочная страница не полна.

Используемые источники:

  • https://otus.ru/nest/post/637/
  • https://bezopasnik.info/%d0%bf%d1%80%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bb%d1%8b-ipv4-%d0%b8-ipv6-%d0%b2-%d1%87%d0%b5%d0%bc-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0-%d0%b8-%d1%87%d1%82%d0%be-%d0%bb%d1%83%d1%87%d1%88%d0%b5/
  • http://ru.manpages.org/ipv6/7

Рейтинг автора
5
Подборку подготовил
Андрей Ульянов
Наш эксперт
Написано статей
168
Ссылка на основную публикацию
Похожие публикации