ИМЯ
icmp - модуль
ядра Linux,
реализующий
протокол IPv4
ICMP
ОПИСАНИЕ
Этот
модуль
ядра
реализует
Internet Control Message Protocol,
описанный
в RFC 792. Он
используется
для
извещения
об ошибках
и для
диагностики.
Пользователь
не
взаимодействует
напрямую с
этим
модулем;
вместо
этого он
работает с
другими
протоколами
в ядре, а они
при помощи
протокола
ICMP передают
ошибки на
уровень
приложения.
Кроме того,
этот
модуль
отвечает
на
ICMP-запросы.
Пользовательский
протокол
может
получать
ICMP-пакеты
для всех
локальных
сокетов,
если
откроет
неструктурированный
(raw) сокет,
используя
протокол
IPPROTO_ICMP. Более
подробную
информацию
смотрите в
raw(7). Типы
ICMP-пакетов,
передаваемые
в сокет,
могут быть
отфильтрованы
с помощью
параметра
сокета ICMP_FILTER.
Пакеты ICMP
всегда
обрабатываются
ядром, даже
когда
передаются
в
пользовательский
сокет.
Linux
ограничивает
для
каждого
получателя
поток
ICMP-пакетов с
сообщениями
об ошибках.
Количество
ICMP_REDIRECT и ICMP_DEST_UNREACH
также
ограничивается
для
каждого
отправителя
приходящих
пакетов.
Интерфейсы
в /proc
Для
настройки
некоторых
глобальных
параметров
IP ICMP
поддерживает
набор
интерфейсов
в /proc. Эти
параметры
доступны
на чтение и
запись
через
файлы в
каталоге
/proc/sys/net/ipv4/.
Большинство
параметров
служит для
управления
ограничением
потока
пакетов ICMP
определённых
типов. В Linux 2.2
для
ограничения
ICMP
используется
фильтр
«протекающего
ведра» (token bucket).
Значение —
задержка в
jiffy,
отведённая
на очистку
фильтра
после
всплеска.
Величина jiffy
зависит от
архитектуры
машины,
обычно, это
10мс на i386 и
около 1мс на
alpha и ia64.
- icmp_destunreach_rate
(в Linux с 2.2 по 2.4.9)
- Максимальная
частота
посылки
ICMP-пакетов с
типом Destination Unreachable
по каждому
конкретному
маршруту
или
получателю.
Ограничение
не влияет
на посылку
пакетов
ICMP_FRAG_NEEDED,
необходимых
для
определения
MTU для
маршрута.
- icmp_echo_ignore_all
(начиная с Linux
2.2)
- Если
значение
больше
нуля, то Linux
будет
игнорировать
все
запросы
ICMP_ECHO.
- icmp_echo_ignore_broadcasts
(начиная с Linux
2.2)
- Если
значение
больше
нуля, то Linux
будет
игнорировать
все пакеты
ICMP_ECHO,
посланные
по
широковещательным
адресам.
- icmp_echoreply_rate
(в Linux с 2.2 по 2.4.9)
- Максимальная
частота
посылки
пакетов
ICMP_ECHOREPLY в ответ
на запросы
ICMP_ECHOREQUEST.
- icmp_errors_use_inbound_ifaddr
(логический;
по
умолчанию:
выключено;
начиная с Linux
2.6.12)
- Если
выключено,
то
сообщения
ICMP об
ошибках
посылаются
с
первичным
адресом
существующего
интерфейса.
- Если
включено,
то
сообщения
будут
посылаться
с
первичным
адресом
интерфейса,
на который
поступил
пакет,
вызвавший
ошибку ICMP.
Такое
поведение
соответствует
работе
маршрутизаторов,
как этого
ожидают
сетевые
администраторы.
Также, это
позволяет
облегчить
диагностику
проблем в
сложных
сетях.
- Заметим,
что если на
нужном
интерфейсе
первичный
адрес не
задан, то
используется
адрес
первого
интерфейса,
не
являющегося
обратной
петлёй, и
значение
данного
параметра
не
учитывается.
- icmp_ignore_bogus_error_responses
(логический;
по
умолчанию:
выключено;
начиная с Linux
2.2)
- Некоторые
маршрутизаторы
нарушают RFC1122,
отправляя
фиктивные
ответы на
широковещательные
пакеты. Эти
нарушения,
обычно,
протоколируются
предупреждением
ядра. Если
этот
параметр
включён, то
ядро не
будет
выдавать
такие
предупреждения,
что
позволяет
не
засорять
файл
журнала.
- icmp_paramprob_rate
(в Linux с 2.2 по 2.4.9)
- Максимальная
частота
посылки
пакетов
ICMP_PARAMETERPROB. Эти
пакеты
посылаются,
когда
приходит
пакет с
ошибочным
заголовком
IP.
- icmp_ratelimit
(целое; по
умолчанию:
1000; начиная с
Linux 2.4.10)
- Ограничивает
скорость
отправки
пакетов ICMP
для
определённого
получателя,
чьи типы
совпадают
с icmp_ratemask
(смотрите
далее).
Значение 0
отключает
ограничение,
иначе
указывается
минимальная
задержка
между
ответами в
миллисекундах.
- icmp_ratemask
(целое; по
умолчанию:
смотрите
далее;
начиная с Linux
2.4.10)
- Маска
типов ICMP, для
которых
накладывается
ограничение.
- Расстановка
битов: IHGFEDCBA9876543210
Маска по
умолчанию:
0000001100000011000 (0x1818)
- Описание
битов
(смотрите
файл include/linux/icmp.h
из
исходного
кода ядра
Linux):
0 Ответное
эхо |
3
Назначение
недостижимо
* |
4 Погасить
источник * |
5
Перенаправление |
8 Запрос
эхо |
B Время
вышло * |
C Проблема
с
параметром
* |
D Запрос
метки
времени |
E Ответ
меткой
времени |
F Запрос
информации |
G Ответ
информацией |
H Запрос
маски
адреса |
I Ответ
маской
адреса |
Для битов,
помеченных
звёздочкой,
ограничение
включено
по
умолчанию
(смотрите
маску по
умолчанию,
приведённую
ранее).
- icmp_timeexceed_rate
(в Linux с 2.2 по 2.4.9)
- Максимальная
частота
посылки
пакетов
ICMP_TIME_EXCEEDED. Эти
пакеты
посылаются
для
предотвращения
зацикливания,
когда
пакет
прошёл
слишком
большое
количество
транзитных
участков
(hops).
- ping_group_range
(два целых
числа;
значение
по
умолчанию
смотрите
далее;
начиная с Linux
2.6.39)
- Диапазон ID
групп
(минимальный
и
максимальный
ID группы,
включительно),
которым
разрешено
создавать
сокеты ICMP Echo.
По
умолчанию
«1 0», что
означает,
что всем
группам
запрещено
создавать
сокеты ICMP Echo.
ВЕРСИИ
Поддержка
запроса ICMP_ADDRESS
была
удалена из
2.2.
Поддержка
ICMP_SOURCE_QUENCH была
удалена из
Linux 2.2.
ЗАМЕЧАНИЯ
Так как
многие
реализации
не
поддерживают
неструктурированные
сокеты IPPROTO_ICMP,
то
использование
этой
возможности
нежелательно
при
написании
переносимых
программ.
Пакеты
ICMP_REDIRECT не
посылаются,
если Linux не
работает
как
маршрутизатор.
Также, они
принимаются
только от
старых
шлюзов,
определённых
в таблице
маршрутизации,
причем
информация
о
перенаправлении
маршрутов
устаревает
через
некоторое
время.
Значения
64-битных
временных
меток,
возвращаемых
по ICMP_TIMESTAMP,
отсчитываются
в
миллисекундах
с начала
Эпохи, 1970-01-01 00:00:00 +0000
(UTC).
В
Linux-реализации
ICMP для
посылки
ICMP-пакетов
используются
неструктурированные
сокеты.
Такие
сокеты
могут
показываться
программой
netstat(8), при этом
их inode будет
равен 0.
СМОТРИТЕ
ТАКЖЕ
ip(7), rdisc(8)
В RFC 792
приведено
описание
протокола
ICMP.