Первые 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 (Ответ маски адреса) | Пользовательский процесс |