Допустим, кто-то отправляет UDP-пакет, как будто traceroute
реализации. Пакет имеет TTL 1 в IP-заголовке, в результате чего первый маршрутизатор отбрасывает его и генерирует ответ ICMP Time Exceeded отправителю.
Есть ли у маршрутизатора гарантия, что отправитель получит сообщение об ошибке ICMP Time Exceeded, которое он сгенерировал и отправил?
Реализован ли ICMP поверх UDP? Если да, то существуют ли какие-либо механизмы контроля ошибок как часть ICMP?
Мне нужен довольно простой простой ответ, я просто подумал, что смогу ответить на этот вопрос несколькими способами, чтобы он был более ясным.
ICMP - это не UDP, и даже не IP. Это еще один протокол уровня 3 OSI (сетевой уровень) наряду с IP. Тем не менее, у него есть совместимый с IP заголовок в начале пакета.
Нет никакой гарантии, что ICMP-пакет будет доставлен. Он имеет те же гарантии доставки, что и любой другой пакет в Интернете: нет. Нет никаких попыток гарантировать, что он будет доставлен, нет механизма повтора, но есть контрольная сумма как в заголовке IP, так и в заголовке ICMP. Протокол более высокого уровня должен повторить попытку отправки пакета, вызвавшего ошибку, что приведет к генерации другого пакета Time Exceeded, и в конечном итоге один из них будет получен отправителем.
http://www.networksorcery.com/enp/protocol/icmp.htm содержит пример заголовка ICMP (инкапсулированный внутри того, что идентично заголовку IP) и информацию о различных типах сообщений ICMP.
Учитывая, что люди голосуют против этого сообщения и недоразумения, я уточню:
IP - это язык интернета. Пакеты маршрутизируются по их IP-заголовкам. Протоколы инкапсулированы в IP (TCP, UDP, SCTP и т. Д.) Для большей части взаимодействия на уровне приложений.
Как вы общаетесь, когда что-то идет не так с коммуникацией на уровне IP? Для этого используется ICMP. Можете ли вы сообщить об ошибках уровня IP в IP? Это проблема курицы и яйца, и, как указывается в RFC, становится непонятной. Сообщения ICMP имеют IP-заголовок, и для них зарезервирован IP-протокол, но ICMP является протоколом уровня IP, а не инкапсулируется внутри IP-пакета. Поэтому я считаю, что это протокол, используемый наряду с IP.
Мы можем целый день спорить о том, «является ли ICMP IP», но больше всего я соглашусь, что да, это IP, «что-то вроде».
ICMP - это IP, а не UDP, но вы правы, это ненадежно.
Вот список обычаев.