ICMP 可靠性

ICMP 可靠性

假设有人发送了一个 UDP 数据包,就像一个traceroute实现一样。该数据包在 IP 标头中的 TTL 为 1,导致第一个路由器丢弃它并向发送者生成 ICMP 超时回复。

路由器是否可以保证发送方收到它生成并发送的 ICMP 超时错误消息?

ICMP 是在 UDP 之上实现的吗?如果是,那么 ICMP 中是否实现了错误控制机制?

我想要一个非常基本的简单答案,我只是想用几种方法来解决这个问题,这样会更清楚。

答案1

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,“有点”。

答案2

ICMP 是 IP,而不是 UDP,但是你是对的,它是不可靠的。

这里有一个列表用法。

相关内容