IP
IP (Internet Protocol) - протокол сетевого уровня стека TCP/IP. Протокол был создан в 1981 году и описан в RFC 791. Основной задачей протокола является доставка датаграмм между хостами сетей TCP/IP через произвольное число промежуточных узлов (маршрутизаторов).
Протокол IP не гарантирует надежной доставки пакета: пакеты могут прийти в неправильном порядке, пакет может быть утерян, пакет может продублироваться или оказаться поврежденным. За надежность доставки пакетов отвечают протоколы транспортного уровня.
На данный момент наиболее распространена четвертая версия протокола (IPv4), однако ведутся активные работы по внедрению более совершенного IPv6.
IPv4
IPv4 (англ. Internet Protocol version 4) — четвёртая версия интернет протокола (IP). Описан в IETF в статье RFC 791 (сентябрь 1981 года). Это один из самых используемых интернет протоколов. Был введен в использование в ARPANET в 1983 году.
Функция протокола — передавать дейтаграммы по множеству соединенных сетей.
Структура пакета
Рассмотрим формат IPv4-дейтаграмм.
Дейтаграмма состоит из заголовка и основной части (данных). Биты передаются слева направо и сверху вниз (big-endian порядок). В настоящее время ясно, что лучше было бы использовать обратный (little-endian) порядок, но во время создания протокола это не было очевидно. Так на Intel x86 требуется программное преобразование, как при передаче, так и при приеме.
Рассмотрим структуру заголовка:
0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Версия | IHL | Дифференциальное обслуживание (Тип службы) | Полная длина | ||||||||||||||||||||||||||||
Идентификатор | Флаги | Смещение фрагмента | |||||||||||||||||||||||||||||
Время жизни | Протокол | Контрольная сумма заголовка | |||||||||||||||||||||||||||||
IP-адрес источника | |||||||||||||||||||||||||||||||
IP-адрес назначения | |||||||||||||||||||||||||||||||
Опции | Остаток |
- Версия: 4 бита
- Поле Версия содержит версию протокола, к которому принадлежит пакет. В случае IPv4 это 4.
- IHL: 4 бита
- Поле IHL (англ. Internet Header Length) содержит длину заголовка (в нем указано число 32 -разрядных слов). Следовательно, оно указывает на начало данных. Минимальное значение длины равно 5 . Максимальное — 15, что соответствует заголовку длиной 60 байт. Так, максимальный размер необязательного поля равен 40 байтам.
- Дифференциальное обслуживание (Тип службы): 8 битов
- Изначально это поле называлось Тип службы. По спецификации оно предназначено для различения классов обслуживания. Но поскольку никто не знал, что с ним делать, оно много лет не использовалось. Теперь, когда появилось дифференцированное обслуживание, ему нашли другое применение. Первые 6 бит задают класс обслуживания (DSCP), а в последние 2 помещаются явные уведомления о перегруженности (ECN).
- Полная длина: 16 бит
- Поле Полная длина содержит длину всей дейтаграммы, включая как заголовок, так и данные. Минимальная длина равна 20 байтам. Максимальное допустимое значение равно 65535 байт. Такие длинные дейтаграммы непрактичны для большинства хостов и сетей. Так, все хосты должны уметь принимать дейтаграммы до 576 байтов. Рекоммендуется отправлять дейтаграммы большего размера, только если есть уверенность, что принимающая сторона сможет их обработать.
- Идентификатор: 16 бит
- Идентификатор позволяет хосту-получателю определить какому пакеты принадлежат полученные им фрагменты. Все фрагменты одного пакета содержат одно и то же значение идентификатора.
- Флаги: 3 бита
- Бит 0: зарезервированное значение, должны быть равно 0.
- Бит 1 (DF): Не фрагментировать (англ. Don't Fragment). 0 — можно фрагментировать, 1 — нельзя. Также может использоваться при определении путевого значения MTU, которое равно максимальному размеру пакета, передаваемого по пути без фрагментации. Пометив этот бит, отправитель гарантирует, что либо дейтаграмма дойдет единым блоком, либо отправитель получит сообщение об ошибке.
- Бит 2 (MF): Продолжение следует (англ. More Fragments). 0 — в последнем фрагменте, 1 — в предыдущих.
- Смещение фрагмента: 13 битов
- Это поле указывает положение фрагмента в исходном пакете. Длина всех фрагментов в байтах должна быть кратна 8 (кроме последнего). Позволяет (2^13−1)×8=65528 байт смещения, что превышает максимальный размер пакета.
- Время жизни: 8 битов
- Поле Время жизни (TTL, англ. Time To Live) представляет собой счетчик, ограничивающий время жизни пакета. По спецификации он отсчитывает время в секундах, таким образом допуская максимальное время жизни пакета в 255 с. На каждом маршрутизаторе значение должно уменьшаться как минимум на единицу плюс время стояния в очереди. Но на практике этот счетчик считает количество переходов черех маршрутизаторы. Когда значение равно 0, пакет отвергается, а отправителю отсылается сообщение ICMP Time Exceeded. Таким образом удается избежать вечного странствования пакетов.
- Протокол: 8 битов
- Это поле указывает, какому процес транспортного уровня передать этот пакет, например TCP, UDP, ICMP. Присвоенные номера протоколов можно найти на сайте IANA.
- Контрольная сумма заголовка: 16 бит
- Это поле хранит контрольную сумму только заголовка. Так как некоторые поля меняются (например, TTL), то оно пересчитывается на каждом транзитивном участке. Используется следующий алгоритм: складываются все 16-разрядные полуслова заголовка в дополнительном коде, преобразуя результат также в дополнительный код. Таким образом проверяемая получателем контрольная сумма заголовка (вместе с этим полем) должна быть равна нулю. Более подробно алгоритм описан в RFC 1071.
- IP-адрес источника: 32 бита.
- IP-адрес получателя: 32 бита.
- Опции: переменная длина
- В начале поля всегда располагается однобайтный идентификатор. Иногда за ним может располагаться также однобайтное поле длины, а затем один или несколько информационных байтов. Размер этого поля должен быть кратен 4 байтам. Поле опции имеет следующий формат:
- 1 бит — флаг копирования. Показывает, если опция скопирована во все фрагменты.
- 2 бита — класс опции. Могут быть следующие классы: 0 — control, 2 — debugging и измерение, 1 и 3 — зарезервированы на будущее.
- 5 бит — номер опции.
- Приведем примеры опций:
- Безопастность — указывет уровень секретности дейтаграммы. Но на практике все его игнорируют.
- Строгая маршрутизация от источника — задает полный путь следования дейтаграммы.
- Свободная маршрутизация от источника — задает список маршрутизаторв, которыенельзя миновать.
- Запомнить маршрут — требует от всех маршрутизаторов добавлять свой IP-адрес.
- Временной штамп — требует от всех маршрутизаторв добавлять свой IP-адрес и текущее время.
- Обычно маршрутизаторы либо игнорируют опции, либо обрабатывают неэффективно, отодвигая в стороны как нечто необычное.
- В начале поля всегда располагается однобайтный идентификатор. Иногда за ним может располагаться также однобайтное поле длины, а затем один или несколько информационных байтов. Размер этого поля должен быть кратен 4 байтам. Поле опции имеет следующий формат:
- Остаток (Padding): переменная длина
- Часть из нулей, гарантирующая, что длина заголовка заканчивается на 32 бите.
IPv6
IPv6 (англ. Internet Protocol version 6) — новая версия интернет протокола (IP), являющаяся результатом развития IPv4. Протокол был создан IETF в 1996 году. Описан в спецификации RFC 2460.
Основной причиной для создания новой версии протокола послужил факт скорого исчерпания пула IPv4 адресов (по разным оценкам последние выделенные IANA адреса будут заняты в период с 2016 по 2020 года).
Основные отличия IPv6 от IPv4:
- В IPv6 заголовок имеет фиксированную длину 40 октетов.
- Поле общей длины заменено полем длины области данных.
- В IPv6 предусмотрена передача пакетов, длины которых превышают 64 кбайт.
- Заголовки надстроек.
- Поле времени жизни заменено полем ограничения количества переходов.
- Многие дополнения IPv4 были оформлены как отдельные протоколы.
Структура пакета
Отступ в байтах | 0 | 1 | 2 | 3 | |||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Отступ в битах | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
0 | 0 | Версия | Класс трафика | Метка потока | |||||||||||||||||||||||||||||
4 | 32 | Длина полезной нагрузки | Следующий заголовок | Лимит кол-ва переходов | |||||||||||||||||||||||||||||
8 | 64 | Адрес отправителя | |||||||||||||||||||||||||||||||
C | 96 | ||||||||||||||||||||||||||||||||
10 | 128 | ||||||||||||||||||||||||||||||||
14 | 160 | ||||||||||||||||||||||||||||||||
18 | 192 | Адрес получателя | |||||||||||||||||||||||||||||||
1C | 224 | ||||||||||||||||||||||||||||||||
20 | 256 | ||||||||||||||||||||||||||||||||
24 | 288 |
- Весрия (Version)
- 4 бита. Версия протокола. Для IPv6 - 0110 (6).
- Класс трафика (Traffic class)
- Метка потока (Flow Label)
- 20 бит. Используется для передачи информации маршрутизаторам и коммутаторам о необходимости поддержания одного и того же пути для пути для потока пакетов, чтобы избежать переупорядочивания.
- Длина полезной нагрузки (Payload length)
- 16 бит. Размер всего пакета, включая заголовок и дополнительные расширения.
- Следующий заголовок (Next header)
- 8 бит. Тип расширенного заголовка (extension), идущего следующим. В последнем расширенном заголовке это поле хранит тип транспортного протокола.
- Лимит кол-ва переходов (Hop limit)
- 8 бит. Поле, уменьшаемое на единицу каждым маршрутизатором. Когда поле счетчик равным 0, пакет отбрасывается.
- Адрес отправителя (Source address)
- 128 бит. IPv6 адрес отправителя.
- Адрес получателя (Destination address)
- 128 бии. IPv6 адрес получателя.
IP-адрес
Определение: |
IP-адрес — уникальный сетевой адрес узла в компьютерной сети, построенной по протоколу IP. |
IPv4-адрес
IPv4 использует 32-битные адреса, ограничивающие адресное пространство 4 294 967 296 (232) возможными уникальными адресами. У каждого хоста и маршрутизатора в Интеренете есть IP-адрес. IP-адрес не имеет отношения к хосту. Он имеет отношение к сетевому интерфейсу, поэтому иногда хост или маршрутизатор могут иметь несколько IP-адресов.
IP-адреса имеют иерархическую организацию. Первая часть имеет переменную длину и задает сеть, а последняя указывает на хост.
Обычно IP-адреса записываются в виде 4 десятичных чисел, каждое в диапозоне от 0 до 255, разделенными точками (dot-decimal notation). Каждая часть представляет один байт адреса. Например, шестнадцатиричный адрес 80D00297 записывается как 128.208.2.151.
Определение: |
Префикс — непрерывный блок пространства IP-адресов, соответствующий сети, в которой сетевая часть совпадает для всех хостов. |
Префикс задается наименьшим IP-адресом в блоке и размером блока. Размер определяется числом битов в сетевой части, оставшиеся биты в части хоста могут варьироваться. Таким образом, размер является степенью двойки. Он записывается после префикса IP-адреса в виде слэша и длины сетевой части в битах. В предыдущем примере префикс содержит 28 адресов и поэтому для сетевой части отводится 24 бита. Записывается так: 128.208.2.0/24.
Сетевые адреса, адреса интерфейсов и широковещательные адреса
IP адрес может означать одно из трех:
- Адрес IP сети (группа IP устройств, имеющих доступ к общей среде передаче - например, все устройства в сегменте Ethernet). Сетевой адрес всегда имеет биты интерфейса (хоста) адресного пространства установленными в 0 (если сеть не разбита на подсети);
- Широковещательный адрес IP сети (адрес для 'разговора' со всеми устройствами в IP сети). Широковещательные адреса для сети всегда имеют интерфейсные (хостовые) биты адресного пространства установленными в 1 (если сеть не разбита на подсети).
- Адрес интерфейса (например Ethernet-адаптер или PPP интерфейс хоста, маршрутизатора, сервера печать итд). Эти адреса могут иметь любые значения хостовых битов, исключая все нули или все единицы - чтобы не путать с адресами сетей и широковещательными адресами.
Маска подсети
Длина префикса не выводится из IP-адреса, поэтому протоколу маршрутизации вынуждены передавать префиксы на маршрутизаторы. Иногда префиксы задаются с помощью указания длины.
Определение: |
Маска подсети — двоичная маска, соответствующая длине префикса, в которой единицы указывают на сетевую часть. |
То есть маска подсети определяет как будут локально интерпретироваться IP адреса в сегменте IP сети, что для нас весьма важно, поскольку определяет процесс разбивки на подсети.
Стандартная маска подсети - все сетевые биты в адресе установлены в '1' и все хостовые биты установлены в '0'. Выполненение операции И между маской и IP-адресом позволяет выделить сетевую часть.
О маске подсети нужно помнить три вещи:
- Маска подсети предназначена только для локальной интерпретации локальных IP адресов (где локальный значит - в том же сетевом сегменте);
- Маска подсети - не IP адрес - она используется для локальной модификации интерпретации IP адреса.
Бесклассовая междоменная маршрутизация
Изначально использовалась классовая адресация (INET), но со второй половины 90-х годов XX века она была вытеснена бесклассовой адресацией (CIDR), при которой количество адресов в сети определяется маской подсети.
Таблицы маршрутизации со временем сильно растут, и с этим нужно что-то делать. Маршрутизатор может узнавать о расположении IP-адресов по префиксам различной длины. Но вместо того чтобы разделять сеть на подсети, мы объединим несколько коротких префиксов в один длинный. Этот процесс называется агрегацией маршрута (route aggregation). Длинный префикс, полученный в результате, иногда называют суперсетью (supernet), в противоположность подсетям с разделением блоков адресов.
При агрегации IP-адреса содержатся в префиксах различной длины. Один и тот же IP-адрес может рассматриваться одним маршрутизатором как часть блока /22 (содержащего 210 адресов), а другим — как часть более крупного блока /20 (содержащего 212 адресов). Это зависит от того, какой информацией обладает маршрутизатор. Такой метод называется CIDR (Classless InterDomain Routing — бесклассовая междоменная маршрутизация).
Приведем пример:
Пусть есть 3 университета: Кембриджский, Оксфордский и Эдинбургский.
Допустим, у нас есть блок из 8192 адресов, начиная с 194.24.0.0.
- Допустим также, что Кембриджскому университету требуется 2048 адресов и ему выделяются адреса от 194.24.0.0 до 194.24.7.255, а также маска 255.255.248.0. Это будет префикс /21.
- Затем Оксфордский университет запрашивает 4096 адресов. Так как блок из 4096 адресов должен располагаться на границе, кратной 4096, то ему не могут быть выделены адреса, начинающиеся с 194.24.8.0. Вместо этого он получает адреса от 194.24.16.0 до 194.24.31.255 вместе с маской 255.255.240.0. Это будет префикс /20.
- Наконец, Эдинбургский университет просит выделить ему 1024 адреса и получает адреса от 194.24.8.0 до 194.24.11.255 и маску 255.255.252.0. Это будет префикс /22.
После этого всем маршрутизаторам, находящимся в свободной от умолчаний зоне, сообщаются IP-адреса трех новых сетей. Маршрутизаторы, находящиеся рядом с этими университетами, возможно, захотят отправлять пакеты на эти префиксы по разным исходящим линиям. Тогда они запишут эти адреса в свои таблицы маршрутизации.
Теперь посмотрим на эту троицу университетов с точки зрения отдаленного маршрутизатора в Нью-Йорке. Все IP-адреса, относящиеся к этим трем префиксам, должны отправляться из Нью-Йорка (или из США) в Лондон. Процесс маршрутизации в Лондоне узнает об этом и объединяет три префикса в одну агрегированную запись 194.24.0.0/19 и передает ее в Нью-Йорк.
Также префиксы могут пересекаться. Согласно правилу, пакеты передаются в направлении самого специализированного блока, или самого длинного совпадающего префикса (longest matching prefix), в котором находится меньше всего IP-адресов.
По сути CIDR работает так:
- Когда прибывает пакет, необходимо определить, относится ли данный адрес к данному префиксу; для этого просматривается таблица маршрутизации. Может оказаться, что по значению подойдет несколько записей. В этом случае используется самый длинный префикс. То есть если найдено совпадение для маски /20 и /24, то для выбора исходящей линии будет использоваться запись, соответствующая /24.
- Однако этот процесс был бы трудоемким, если бы таблица маршрутизации просматривалась запись за записью. Вместо этого был разработан сложный алгоритм для ускорения процесса поиска адреса в таблице (Ruiz-Sanchez и др., 2001).
- В маршрутизаторах, предполагающих коммерческое использование, применяются специальные чипы VLSI, в которые данные алгоритмы встроены аппаратно.
Классы IP-сетей
Раньше использовали классовую адресацию.
Сколько бит используется сетевым ID и сколько бит доступно для идентификации хостов (интерфейсов) в этой сети, определяется сетевыми классами.
Всего 3 класса IP-адресов:
- Класс A. IP сетевых адресов использует левые 8 бит для указания сети, оставшиеся 24 бита для идентификации интерфейса хоста в этой сети. Адреса класса A всегда имеют самый левый бит самого левого байта нулевым. Таким образом доступно максимум 128 адресов сетей класса A, каждый из которых может содержать до 33,554,430 интерфейсов. Однако сети 0.0.0.0 (известная как маршрут по умолчанию) и 127.0.0.0 (loop back сеть) имеют специальное назначение и не доступны для использования в качестве идентификаторов сети. Поэтому доступно только 126 адресов сетей класса A.
- Класс B. IP сетевых адресов использует левые 16 бит для идентификации сети, оставшиеся 16 бит указывают хостовые интерфейсы. Адрес класса B всегда имеет самые левые два бита установленными в 1 0. Таким образом для номера сети остается 14 бит, что дает 32767 доступных сетей класса B. Первый байт адреса сети класса B может принимать значения от 128 до 191, и каждая из таких сетей может иметь до 32,766 доступных интерфейсов.
- Класс C. IP сетевых адресов использует левые 24 бит для идентификации сети, оставшиеся 8 бит указывает хостовый интерфейс. Адрес класса С всегда имеет самые левые три бита установленными в 1 1 0. Таким образом для номера сети остается 14 бит, что дает 4,194,303 доступных сетей класса B. Первый байт адреса сети класса B может принимать значения от 192 до 255, и каждая из таких сетей может иметь до 254 доступных интерфейсов. Однако сети класса C с первым байтом больше, чем 223, зарезервированы и не используются.
Существует также специальные адреса, которые зарезервированы для 'несвязанных' сетей - это сети, которые используют IP, но не подключены к Internet. Вот эти адреса:
- Одна сеть класса A: 10.0.0.0
- 16 сетей класса B: 172.16.0.0 - 172.31.0.0
- 256 сетей класса С: 192.168.0.0 - 192.168.255.0
Стандартные маски подсети для трех классов сетей:
- A класс - маска подсети: 255.0.0.0
- B класс - маска подсети: 255.255.0.0
- C класс - маска подсети: 255.255.255.0
IPv6-адрес
Адрес в IPv6 представляется как восемь групп из четырех шестнадцатеричных чисел, разделенных двоеточиями. При записи адреса используются следующие правила:
- Если одна и более групп, идущих подряд, равны 0000, то они опускаются и заменяются на двойное двоеточие.
- Незначащие старшие нули в группах опускаются.
- Для записи встроенного или отображенного IPv4 адреса последние две группы цифр заменяются на IPv4 адрес.
- При использовании IPv6 адреса в URL он помещается в квадратные скобки.
- Порт в URL пишется после закрывающей квадратной скобки.
Типы IPv6 адресов
- Одноадресный (Unicast) - для отправки пакет на конкретный адрес устройства.
- Global unicast - глобальные адреса. Могут находиться в любом не занятом диапазоне.
- Link loсal - локальный адрес канала. Позволяет обменивать данными по одному и тому же каналу (подсети). Пакеты с локальным адресом канала не могут быть отправлены за пределы этого канала.
- Unique local - уникальный локальные адреса. Используются для локальной адресации в пределах узла или между ограниченным количеством узлов.
- Многоадресный (Multicast) - для отправки пакетов на группу адресов.
- Assigned - назначенные адреса. Зарезервированные для определённых групп устройств Multicast адреса.
- Solicited - запрошенные адреса. Остальные адреса, которые устройства могут использовать для прикладных задач.
- Групповой (Anycast) - для отправки пакета на "любой" индивидуальный адрес. Такой адрес может быть назначен нескольким устройствам. Пакет будет доставлен ближайшему устройству с этим адресом.