Протокол ICMP
Теперь мы рассмотрим протокол управляющих сообщений Интернета (Internet Control Message Protocol, ICMP), используемый хостами, маршрутизаторами и шлюзами для обмена информацией сетевого уровня друг с другом. Спецификация протокола ICMP содержится в RFC 792. Наиболее типичное использование протокола ICMP заключается в передаче сообщений об ошибках. Например, при работе с Telnet-, FTP- или HTTP-приложениями вы можете встретить сообщение об ошибке, например Destination network unreachable (сеть назначения недоступна). Это сообщение формирует протокол ICMP, если IP-маршрутизатор не может найти маршрут к хосту, указанному в вашем приложении. Маршрутизатор создает и отправляет вашему хосту ICMP-сообщение об ошибке. Ваш хост получает ICMP-сообщение и возвращает пытающейся связаться с удаленным хостом TCP-программе код ошибки. Протокол TCP, в свою очередь, возвращает код ошибки вашему приложению.
Протокол ICMP часто рассматривается как часть протокола IP, однако с точки зрения архитектуры он работает поверх протокола IP, так как ICMP-сообщения переносятся внутри IP-пакетов. То есть ICMP-сообщения переносятся как полезная нагрузка IP-дейтаграмм. Аналогично, когда хост получает IP-пакет, в котором протокол ICMP указан в качестве протокола более высокого уровня, хост передает пакет протоколу ICMP, так же как он передает пакет протоколам TCP и UDP.
У ICMP-сообщений есть поле типа и кодовое поле. Кроме того, ICMP-сообщения содержат первые 8 байт IP-дейтаграммы, вызвавшей генерацию ICMP-сообщения (так, чтобы отправитель мог определить, который пакет вызвал ошибку). Некоторые типы ICMP-сообщений показаны в табл. 4.4. Обратите внимание, что ICMP-сообщения используются не только для сигнализации об ошибках. Хорошо известная команда ping посылает указанному хосту ICMP-сообщение типа 8 с кодом 0. Хост-адресат, получив запрос эха, посылает обратно ICMP-сообщение типа 0 с кодом 0. Еще одним интересным ICMP-сообщением является сообщение гашения источника. Это сообщение редко используется на практике. Изначально оно предназначалось для борьбы с перегрузкой — испытывающий перегрузку маршрутизатор отправлял это ICMP-сообщение передающему хосту, чтобы заставить его снизить скорость передачи. Как было показано в главе 3, у протокола TCP есть собственный механизм борьбы с перегрузками, действующий на транспортном Уровне и не требующий обратной связи (как ICMP-сообщения гашения источника) от сетевого уровня.
В главе 1 мы познакомились с программой (командой) Traceroute, позволяющей проследить маршрут от одного хоста до другого. Интересно отметить, что программа Traceroute реализована при помощи ICMP-сообщений. Чтобы определить имена и адреса маршрутизаторов между отправителем и получателем, программа Traceroute на хосте-отправителе посылает хосту-адресату серию обычных IP-дейтаграмм. У первой из этих дейтаграмм значение поля времени жизни равно 1, у второй оно равно 2, у третьей — 3, и т. д. Кроме того, для каждой из этих дейтаграмм отправитель запускает таймер. Когда п-я дейтаграмма прибывает на п-и маршрутизатор, п-и маршрутизатор видит, что время жизни этой дейтаграммы только что истекло. В соответствии с правилами протокола IP, маршрутизатор отбрасывает эту дейтаграмму и посылает источнику предупреждающее ICMP-сообщение (тип 11 код 0). Это сообщение содержит имя маршрутизатора и его IP-адрес. Когда это ICMP-сообщение прибывает к отправителю, тот по значению таймера узнает время оборота пакета, а также (из ICMP-сообщения) имя и IP-адрес п-то маршрутизатора. Теперь, когда вы понимаете, как работает программа Traceroute, возможно, вам захочется с ней поэкспериментировать.