Joh*_*eys 5 icmp network-protocols
假设有人发送了一个 UDP 数据包,就像一个traceroute
实现一样。该数据包在 IP 标头中的 TTL 为 1,导致第一个路由器丢弃它并向发送方生成一个 ICMP Time Exceeded 回复。
路由器是否有任何保证发送方收到它生成并发送的ICMP Time Exceeded错误消息?
ICMP 是在 UDP 之上实现的吗?如果是,是否有任何错误控制机制作为 ICMP 的一部分实施?
我想要一个非常基本的简单答案,我只是想我会以几种方式解决这个问题,这样会更清楚。
ICMP 不是 UDP,它实际上甚至不是 IP。它是除 IP 之外的另一个 OSI 第 3 层协议(网络层)。也就是说,它在数据包的开头有一个与 IP 兼容的标头。
不能保证 ICMP 数据包会被传送。它具有与互联网上任何其他数据包相同的交付保证:无。没有尝试确保它被传递,没有重试机制,但是在 IP 标头和 ICMP 标头中都有一个校验和。更高级别的协议应该重试发送产生错误的数据包,这将导致生成另一个超时数据包,最终其中一个将被发送方接收。
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,“有点”。