IP in IP

IP in IP — это протокол IP-туннелирования, который инкапсулирует один IP-пакет в другой IP-пакет. Инкапсуляция одного IP-пакета в другой IP-пакет -- это добавление внешнего заголовка с SourceIP (точкой входа в туннель) и Destination (точкой выхода из туннеля). При этом внутренний пакет не был изменен (кроме поля TTL, которое уменьшилось). Поля Don’t Fragment и The Type of Service должны быть скопированы в внешний пакет. Если размер пакета больше, чем Path MTU, пакет фрагментируется в инкапсуляторе, это должно быть во внешнем заголовке. Декапсулятор должен будет собрать пакет.

Инкапсуляция IP in IP

Внешний IP заголовок Внутренний IP заголовок Полезная информация


Внешний IP заголовок имеет следующие поля
Version: 4 бита
Это поле содержит номер версии протокола. Всегда 4, так как IP в IP поддерживается только для IPv4.
Header Length: 4 бита
Это поле содержит длину заголовка внешнего IP.
Type of Service (TOS): 8 бит
Это поле копируется из заголовка внутреннего IP.
Total Length: 16 бит
Это поле содержит длину заголовка инкапсулированного IP (включая заголовок внешнего IP, заголовок внутреннего IP, полезную информацию)
Identification: 16 бит
Это поле используется для идентификации фрагментов дейтаграммы, необходимо для сборки фрагментов инкапсулятором. Для внешнего заголовка IP это новое сгенерированное число.
Flags: 3 бита

R DF MF

R:1бит
Этот бит зарезервирован и должен быть установлен в 0.
DF: 1бит
Это поле указывает, может ли фрагментировать дейтаграмму или нет. Если бит установлен в 1 во внутреннем заголовке, то во внешнем он тоже должен быть установлен в 1, это говорит о том, что дейтаграмму фрагментировать нельзя. Если бит установлен в 0 во внутреннем заголовке, то во внешнем он может быть 1/0.
MF: 1 бит
Поле используется, когда дейтаграмма фрагментирована, показывает, что дейтаграмма содержит ещё фрагменты, это поле не копируется из внутреннего заголовка.
Fragment Offset:13 бит
Это поле используется, когда собираются фрагменты.
Time To Live (TTL):8 бит
Это поле используется, чтобы отслеживать время жизни датаграммы. Внутренний заголовок TTL уменьшается до инкапсуляции и не меняется в декапсуляторе. Внешний заголовок устанавливает значение TTL, такое, чтобы датаграмма была доставлена до конечной точки туннеля.
Protocol: 8 бит
Это поле указывает следующий после этого протокол датаграммы. Значение установлено в 4. В большинстве случаев это будет протокол IPv4, если нет каких-либо дополнительных заголовков для инкапсулируемого пакета.
Header Checksum: 16 бит
Это поле содержит контрольную сумму IP внешнего заголовка.
Source IP Address: 32 бита
Это поле содержит IP-адрес инкапсулятора
Destination IP Address: 32 бита
Это поле содержит IP-адрес декапсулятора
Options: Переменная длина
Это поле не копируется из заголовка внутреннего IP. Новые опции могут быть добавлены.
Padding: Переменная длина
Это поле используется для заполнения дейтаграммы, так чтобы полезная нагрузка начиналась с границы в 32 бита.

Обработка ICMP сообщений

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

ICMP-сообщения с типом и кодом, а также меры, принятые инкапсулятором.

  • Destination Unreacheable (Тип 3)
  • Network Unreachabe (Code 0) — ICMP-сообщение об ошибке с типом 3 и кодом 0 должно быть отправлено оригинальному отправителю.
  • Host Unreachable (Code 1) — ICMP-сообщение об ошибке с типом 3 и кодом 1 должно быть отправлено оригинальному отправителю.
  • Protocol Unreachable (Code 2) — ICMP-сообщение об ошибке с типом 3 и кодом 0 или 1 должно быть отправлено оригинальному отправителю.
  • Port Unreachable (Code 3) — не ICMP-сообщение об ошибке следует направить отправителю.
  • Datagram too big (Code 4) — ICMP-сообщение об ошибке с типом 3 и кодом 4 или 1 должно быть отправлено оригинальному отправителю.
  • Source Route Failed (Code 5) — не ICMP-сообщение об ошибке следует направить оригинальному отправителю.
  • Sourse Quence (Type 4) — не ICMP-сообщение об ошибке следует отправить оригинальному отправителю.
  • Redirect (Type 5) — не ICMP-сообщение об ошибке следует направлять оригинальному отправителю.
  • Time Exceeded (Type 6) ICMP-сообщение об ошибке с типом 3 и кодом 1 следует направлять оригинальному отправителю (случай петель в маршрутах в туннеле).
  • Parameter Problem (Type 12).
  • Если сообщение об ошибке в точке копированного поля из неинкапсулированной дейтаграммы, тогда ICMP-сообщение об ошибке следует отправить оригинальному отправителю.
  • Если сообщение об ошибке в поле добавленном инкапсулятор, значит ICMP-сообщение об ошибке не следует отправлять оригинальному отправителю.

Обработка петель в туннелях

Петли в туннелях могут возникать по следующим причинам:

  1. Когда IP-адрес источника дейтаграммы такой же, как и IP-адрес маршрутизатора в любом интерфейсе.
  2. Когда источник IP-дейтаграммы такой же, как конечная точка туннеля.

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

Управление туннелями

Для ICMP-сообщений промежуточный маршрутизаторы возвращают 64-битную дейтаграмму поверх заголовка IP, который не достаточно скопировать внутренний заголовок. Так инкапсулятор не сможет ретранслировать соответствующее сообщение оригинальному отправителю. Но оно может быть обработано ПО туннеля. Оно должно поддерживать следующее:

  • MTU туннеля;
  • TTL туннеля;
  • Достижимость декапсулятора.

Ссылки