Книга: UNIX: разработка сетевых приложений

А.6. ICMPv4 и ICMPv6: протоколы управляющих сообщений в сети Интернет

А.6. ICMPv4 и ICMPv6: протоколы управляющих сообщений в сети Интернет

Протокол ICMP (Internet Control Message Protocol) является необходимой и неотъемлемой частью любой реализации IPv4 или IPv6. Протокол ICMP обычно используется для обмена сообщениями об ошибках между узлами, как маршрутизирующими, так и обычными, но иногда этот протокол используется и приложениями. Например, приложения ping и traceroute (см. главу 28) используют протокол ICMP.

Первые 32 бита сообщений совпадают для ICMPv4 и ICMPv6 и приведены на рис. А.10. ICMPv4 документируется в RFC 792 [95], а ICMPv6 — в RFC 2463 [21].


Рис. А.10. Формат сообщений ICMPv4 и ICMPv6

Восьмиразрядное поле тип (type) указывает тип сообщения ICMPv4 или ICMPv6, а некоторые типы имеют дополнительную 8-разрядную информацию, указанную в поле кода (code). Поле контрольной суммы (checksum) является стандартной контрольной суммой, используемой в сети Интернет. Отличия между ICMPv4 и ICMPv6 заключаются в том, какие именно поля используются при подсчете контрольной суммы.

С точки зрения сетевого программирования необходимо понимать, какие сообщения ICMP могут быть возвращены приложению, что именно вызывает ошибку и каким образом эта ошибка возвращается приложению. В табл. А.5 приведены все сообщения ICMPv4 и показано, как они обрабатываются операционной системой 4.4BSD. В последнем столбце приведены значения переменной errno — то есть те ошибки, которые возвращаются приложениям. В табл. А.6 приведен список сообщений ICMPv6. При использовании TCP ошибка не возвращается приложению немедленно. Если TCP разрывает соединение по тайм-ауту, все накопленные ошибки возвращаются приложению. При использовании UDP ошибка возвращается при очередной операции чтения или записи, но только на присоединенном сокете (раздел 8.9).

Таблица А.5. Обработка различных типов ICMP-сообщений в 4.4BSD

Тип Код Описание Обработчик или errno
0 0 Echo-reply (Эхо-ответ) Пользовательский процесс (Ping)
3 Destination unreachable (Получатель недоступен)
0 Network unreachable (Сеть недоступна) EHOSTUNREACH
1 Host unreachable (Узел недоступен) EHOSTUNREACH
2 Protocol unreachable (Протокол недоступен) ECONNREFUSED
3 Port unreachable (Порт недоступен) ECONNREFUSED
4 Fragmentation needed but DF bit set (Необходима фрагментация, но установлен бит DF) EMSGSIZE
5 Source route failed (Сбой маршрута отправителя) EHOSTUNREACH
6 Destination network unknown (Неизвестна сеть получателя) EHOSTUNREACH
7 Destination host unknown (Неизвестен узел получателя) EHOSTUNREACH
8 Source host isolated (Узел отправителя изолирован). Устаревший тип сообщений EHOSTUNREACH
9 Destination network administratively prohibited (Сеть получателя запрещена администратором) EHOSTUNREACH
10 Destination host administratively prohibited (Узел получателя запрещен администратором) EHOSTUNREACH
11 Network unreachable for TOS (Сеть недоступна для TOS) EHOSTUNREACH
12 Host unreachable for TOS (Узел недоступен для TOS) EHOSTUNREACH
13 Communication administratively prohibited (Связь запрещена администратором) (Игнорируется)
14 Host precedence violation (Нарушение порядка старшинства узлов) (Игнорируется)
15 Precedence cutoff in effect (Действует старшинство узлов) (Игнорируется)
4 0 Source quench (Отключение отправителя) Обрабатывается ядром в случае TCP, игнорируется в случае UDP
5 Redirect (Перенаправление)
0 Redirect for network (Перенаправление для сети) Ядро обновляет таблицу маршрутизации
1 Redirect for host (Перенаправление для узла) Ядро обновляет таблицу маршрутизации
2 Redirect for type-of-service and network (Перенаправление для типа сервиса и сети) Ядро обновляет таблицу маршрутизации
3 Redirect for type of service and host (Перенаправление для типа сервиса и узла) Ядро обновляет таблицу маршрутизации
8 0 Echo request (Эхо-запрос) Ядро генерирует ответ
9 0 Router advertisement (Извещение маршрутизатора) Пользовательский процесс
10 0 Router solicitation (Запрос маршрутизатору) Пользовательский процесс
11 Time exceeded (Превышено время передачи)
0 TTL equals 0 during transit (Время жизни равно 0 во время передачи) Пользовательский процесс
1 TTL equals 0 during reassembly (Время жизни равно 0 во время сборки) Пользовательский процесс
12 Parameter problem (Проблема с параметром)
0 IP header bad (Неправильный IP-заголовок). Типичная ошибка ENOPROTOOPT
1 Required option missed (Пропущен необходимый параметр) ENOPROTOOPT
13 0 Timestamp request (Запрос отметки времени) Ядро генерирует ответ
14 0 Timestamp reply (Ответ об отметке времени) Пользовательский процесс
15 0 Information request (Информационный запрос). Устаревший тип сообщений (игнорируется)
16 0 Information reply (Информационный ответ). Устаревший тип сообщений Пользовательский процесс
17 0 Address mask request (Запрос маски адреса) Ядро генерирует ответ
18 0 Address mask reply (Ответ маски адреса) Пользовательский процесс

Таблица А.6. Сообщения ICMPv6

Тип Код Описание Обработчик или errno
1 Administratively prohibited, firewall filter (Запрещено администратором, фильтр брандмауэра) EHOSTUNREACH
2 Not a neighbor, incorrect strict source route (He сосед, некорректный маршрут отправителя) EHOSTUNREACH
3 Address unreachable (Адрес недоступен) EHOSTDOWN
4 Port unreachable (Порт недоступен) ECONNREFUSED
2 0 Packet too big (Слишком большой пакет) Ядро выполняет обнаружение транспортной MTU
3 Time exceeded (Превышено время передачи)
0 Hop limit exceeded in transit (При передаче превышено значение предельного количества транзитных узлов) Пользовательский процесс
1 Fragment reassembly time exceeded (Истекло время сборки из фрагментов) Пользовательский процесс
4 Parameter problem (Проблема с параметром)
0 Erroneous header filed (Ошибочное поле заголовка) ENOPROTOOPT
1 Unrecognized next header (Следующий заголовок нераспознаваем) ENOPROTOOPT
2 Unrecognized option (Неизвестный параметр) ENOPROTOOPT
128 0 Echo request (Эхо-запрос (Ping)) Ядро генерирует ответ
129 0 Echo reply (Эхо-ответ (Ping)) Пользовательский процесс (Ping)
130 0 Group membership query (Запрос о членстве в группе) Пользовательский процесс
131 0 Group membership report (Отчет о членстве в группе) Пользовательский процесс
132 0 Group membership reduction (Сокращение членства в группе) Пользовательский процесс
133 0 Router solicitation (Запрос маршрутизатору) Пользовательский процесс
134 0 Router advertisement (Извещение маршрутизатора) Пользовательский процесс
135 0 Neighbor solicitation (Запрос соседу) Пользовательский процесс
136 0 Neighbor advertisement (Извещение соседа) Пользовательский процесс
137 0 Redirect (Перенаправление) Ядро обновляет таблицу маршрутизации

Запись «пользовательский процесс» в этой таблице означает, что ядро не обрабатывает сообщение и ждет обработки данного сообщения от пользовательского процесса с символьным сокетом. Также следует отметить, что различные реализации могут обрабатывать одни и те же сообщения по-разному. Например, в Unix сообщения типа Router solicitation (Запрос маршрутизатору) и Router advertisement (Извещение маршрутизатора) обычно обрабатываются как пользовательские процессы, но некоторые реализации могут обрабатывать эти сообщения в ядре.

Версия ICMPv6 сбрасывает старший бит поля тип для сообщения об ошибке (типы 1-4) и устанавливает этот бит для информационного сообщения (типы 128–137).

Оглавление книги


Генерация: 2.070. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз