3.5. Протокол ICMP

Протокол управляющих сообщений Интернет, ICMP, предназначен для обработки сетевых ошибок и других ситуаций, требующих вмешательства сетевых программ. В тех редких случаях, когда программа обращается к сетевому уровню, минуя протоколы транспортного уровня TCP или UDP, скорее всего ей нужен ICMP. Протокол ICMP описан в RFC 792 (Internet Control Message Protocol, Postel, 1981). Для того чтобы обратиться к протоколу низкого уровня, в частности, к ICMP, программе нужен простой сокет. Необходимо понимать, что создание простого сокета — нетривиальная задача, требующая от программиста значительных усилий. Так, например, для работы с ICMP на простом сокете вы будете должны самостоятельно заполнять структуры данных заголовков ICMP.

Сетевой уровень TCP/IP состоит из модуля IP и двух других модулей: ICMP и протокола групповых сообщений Интернет (IGMP). Для доставки данных ICMP, так же, как TCP и UDP, пользуется протоколом IP.

Так же, как и IP, ICMP является частью сетевого уровня. Однако по отношению к IP ICMP все-таки протокол более высокого уровня. Другими словами, он доставляет собственные сообщения при помощи IP, точно так же, как это делают TCP или UDP. Вы знаете, что доставка сообщений IP происходит в среде сетей с переключением пакетов, через мосты и маршрутизаторы. В большинстве случаев сеть работает надежно, поэтому у самого IP нет никаких методов, чтобы уведомить пакетный переключатель или маршрутизатор об ошибке при доставке пакета (что сделало протокол IP гораздо проще в реализации). ICMP добавляет эти методы к арсеналу TCP/IP. Если прикладная программа не пользуется надежным протоколом, она и не должна рассчитывать на получение каких-либо уведомлений об ошибках при доставке данных. Конструкция стека протоколов TCP/IP такова, что сообщения об ошибках видны только сетевому или транспортному уровням.

Если все сетевые компьютеры функционируют нормально и знают, как правильно маршрутизировать данные, сеть TCP/IP доставляет сообщения вполне эффективно. Разумеется, если в сети возникают проблемы, они в первую очередь влияют на доставку данных. Те или иные проблемы свойственны любой сети, не только на базе TCP/IP. Если неисправность местная, генерируется сообщение о неисправности аппаратуры, например. Для определения неисправности используются разнообразные приборы-анализаторы. Если неисправность удаленная, сначала необходимо выяснить, где она находится. Для этого исследуется структура сети, то есть совокупность маршрутизаторов, мостов и другой техники, установленной на пути к месту неисправности. В случае, если неисправность возникает где-то в объединении сетей, найти ее практически невозможно или крайне затруднительно.

Изначально, ICMP проектировался как протокол, позволяющий маршрутизатору указать сетевому уровню передающего хоста на ошибку при доставке пакета. Сетевой уровень в свою очередь мог предпринять ответные действия. В последствии оказалось, что ICMP полезен не только маршрутизаторам. Им может воспользоваться любой сетевой компьютер для передачи сообщения об ошибке управляющего либо информационного сообщения другому сетевому компьютеру на локальной или глобальной сети. Сообщения ICMP инкапсулируются в IP-датаграммы. Пункт назначения сообщения ICMP — всегда сетевой уровень и никогда — определенный пользователь или сетевое приложение. Модуль ICMP IP-уровня компьютера-получателя определяет, передать ли сообщение протоколам высокого уровня, например, транспортным или прикладным. Как вы увидите дальше, TCP/IP ограничивает сферу применения некоторых сообщений ICMP.

ICMP обеспечивает только сообщения об ошибках. То есть в нем отсутствуют какие-либо функции по исправлению ошибочных данных. ICMP никак не определяет характер действий сетевого уровня в ответ на те или иные ошибки.

Если при доставке пакета случается ошибка, ICMP доставляет сообщение только компьютеру-источнику. Как правило, это ограничение несущественно, поскольку ошибки возникают чаще всего из-за компьютера-источника сообщения. Однако поскольку ни один из промежуточных переключателей пакетов не получает ICMP-сообщения, то и компьютер-источник не всегда в состоянии исправить ошибку. Предположим, что неисправный переключатель пакетов неправильно маршрутизирует сообщение. По протоколу ICMP компьютер, принявший «неправильный» пакет, может доложить об этом только компьютеру-источнику. В результате компьютер-источник оказывается не в состоянии определить, где именно случился сбой, и предпринять какие-либо ответные действия.

Чтобы понять, почему протокол ICMP ограничен, давайте пристальнее рассмотрим дизайн семейства протоколов TCP/IP. А именно, давайте вспомним, что нам известно о маршрутизации IP-датаграмм. Заголовок IP-датаграммы содержит только адреса источника и приемника данных. Адреса в заголовке остаются неизменными на протяжении всего путешествия датаграммы по сети. Когда датаграмма попадает в переключатель пакетов, он исследует адрес назначения, сопоставляет его с имеющимися в таблице маршрутизации данными и отправляет по заданному маршруту, то есть к следующему переключателю пакетов. В конце концов датаграмма доходит до переключателя пакетов, связанного напрямую с сетью или компьютером-получателем данных. В этом случае датаграмма отправляется прямо к компьютеру-получателю.

В сетях TCP/IP маршрутизация происходит динамически, то есть таблицы обновляются и корректируются на ходу, и ни один отдельный маршрутизатор (переключатель пакетов) не знает всей таблицы маршрутизации объединения сетей. (Для упрощения протоколы маршрутизации TCP/IP сделаны невидимыми со стороны остальных протоколов семейства.) В результате, когда датаграмма доходит до получателя, ни она, ни получатель не имеют ни малейшего представления о пройденном маршруте. Также не существует метода, чтобы его выяснить. В результате ICMP может доложить об ошибке доставки датаграммы только компьютеру-источнику данных. Для того чтобы ICMP обладал большими возможностями, понадобилось бы переделать все семейство TCP/IP. И все-таки, несмотря на ограничения, ICMP является достаточно мощным средством в ряду протоколов TCP/IP.

Для доставки своих данных ICMP пользуется услугами IP. В результате приоритет сообщения ICMP и его надежность оказываются не выше, чем у любого другого пакета IP. Более того, ICMP сам может привести к некоторым проблемам при доставке данных. Например, если ICMP-сообщение возникает в результате столкновения сетевых данных, поток данных увеличивается, еще больше усугубляя ситуацию. Аналогично, если сообщение об ошибке ICMP умудряется само сгенерировать сообщение об ошибке, то оно, в свою очередь, может сгенерировать еще одно и т. д. Для того чтобы не возникало лишних сообщений об ошибках, пришлось разработать несколько важных правил. До того как вы познакомитесь с ними, необходимо познакомиться с двумя типами ICMP-сообщений: сообщением-запросом и сообщением об ошибке. Вы будете использовать сообщение-запрос ICMP для измерения величины задержки прохождения датаграммы между двумя компьютерами. Сообщения-запросы ICMP служат для переноса или запросов сетевой информации.

Как правило, сообщения об ошибках ICMP появляются в результате каких-либо проблем с доставкой сетевого сообщения. Таким образом, ICMP-сообщение тесно связано с IP-датаграммой — виновницей его появления. Сообщение об ошибке всегда содержит заголовок этой IP-датаграммы и первые 64 бита (восемь байт) ее данных. В отличие от сообщения об ошибке, сообщение-запрос не связано с ошибками доставки. Сообщение-запрос доставляет информацию относительно определенной сети или сетевого компьютера. Сообщения-запросы ICMP используются для диагностических целей.

В спецификации TCP/IP четко определены правила, руководствуясь которыми сетевой компьютер решает, может ли он передать ICMP-сообщение. Например, сообщение-запрос ICMP может привести к возникновению сообщения об ошибке. Чтобы сообщение об ошибке не привело к возникновению следующего сообщения и т. д., пока канал связи не исчерпает своей пропускной способности, сетевое программное обеспечение никогда не генерирует ICMP-сообщение об ошибке в ответ на другое ICMP-сообщение. Сообщение об ошибке никогда не генерируется в ответ на IP-датаграммы с широковещательным или групповым адресом. Такие адреса означают, что датаграмма направлена нескольким компьютерам, а их одновременная реакция на ICMP-сообщение может привести к полной перегрузке сети (broadcast storm).

Чтобы лучше осознать последнее заявление, рассмотрим, что получится, если датаграмма с широковещательным адресом столкнется с проблемами при доставке и сгенерируется ICMP-сообщение об ошибке. Поскольку широковещательная датаграмма принимается всеми сетевыми компьютерами, IP-уровень каждого из них сгенерирует собственное ICMP-сообщение, и произойдет это одновременно. Ситуация лишь не намного улучшается, если адрес датаграммы не широковещательный, а групповой. Неопознанный адрес источника IP-датаграммы приведет к еще большим проблемам, поскольку ICMP-сообщения высылаются именно по его адресу.

Если размер датаграммы слишком велик для физического уровня конкретной сетевой технологии, TCP/IP фрагментирует ее для пересылки по частям. Если фрагмент датаграммы по каким бы то ни было причинам повреждается или исчезает, ICMP отсылает сообщение об ошибке компьютеру-источнику. Поскольку компьютеру-источнику все равно потребуется повторить всю датаграмму целиком, ICMP-сообщение связывается только с первым поврежденным фрагментом. Такой подход также помогает справиться с проблемами перегрузки сети.