为什么会为不可靠的 UDP 数据包生成 ICMP Destination Port Unreachable 错误消息?

网络工程 UDP icmp
2022-02-19 01:34:24

我的疑问是为什么会为 udp 生成 icmp 目标端口无法访问的错误消息。如果目标端口不可达,为什么我们不能简单地丢弃 udp 数据包,说 udp 是无连接的

4个回答

来自 ICMP RFC 792:

  If, in the destination host, the IP module cannot deliver the
  datagram  because the indicated protocol module or process port is
  not active, the destination host may send a destination
  unreachable message to the source host.

因为关键字是 MAY,所以如果没有进程在该 tcp 或 udp 端口​​上侦听,则接收主机不需要发送无法到达的目标端口,但根据标准是允许的。

作为 UDP 应用程序开发人员,知道目标端口不可达是有帮助的,因此 ICMP 错误消息很有帮助并受到赞赏。

有时,答案是,“我们这样做是因为标准要求这样做”。

当您尝试做某事并且它不起作用时,没有什么比这更令人气愤的了

这就是为什么我们将错误消息构建到协议中,甚至是无连接的协议。

为什么会为不可靠的 UDP 数据包生成 ICMP Destination Port Unreachable 错误消息?

我的问题是为什么不呢?根据 RFC,这是允许的操作。我什至会更进一步,建议应该推荐这个。您可以静默丢弃 TCP 段,但不应该使用 UDP。

我的疑问是为什么会为 udp 生成 icmp 目标端口无法访问的错误消息。如果目标端口不可达,为什么我们不能简单地丢弃 udp 数据包,说 udp 是无连接的

事实上,UDP 是无连接的,它应该发送这个响应。在这种情况下,冷 TCP 只是丢弃段,因为它是面向连接的让我举个例子说明为什么在这种情况下发送 ICMP 目标端口不可达响应是一个好主意。

假设计算机 (C) 有 3 TB 的数据要发送,并且认为它应该将其发送到服务器 (S)。如果这是面向连接的 TCP 传输,如果端口不可用,则 TCP 握手将失败。

现在,如果 C 打算使用 UDP 将此数据发送给 S,它就不需要握手,因为它是无连接的。也不会丢失任何确认来减慢/停止数据流(并最终使连接超时)。C 只是开始发送数据并将继续发送数据。除非服务器 S 做某事(如发送 ICMP 目标端口不可达)或 C 上的应用程序出于某种原因停止此传输,它将继续向 S 发送 3 TB 数据。S 仍必须接收(然后丢弃)所有这些数据.

ICMP Destination Port Unreachable 阻止了大部分此类数据的发送。它不需要C处理/发送,不需要在C和S之间传输网络,也不需要S以任何形式接收和处理。

ICMP 消息是一个网络层功能,它是为封装 UDP 数据报的丢弃 IP 数据包发送的——它根本不关心有效负载。

唯一的例外是没有为丢弃的 ICMP 消息生成 ICMP 消息(以防止 ping-pong 消息循环):

为了避免关于消息等的消息无限回归,不发送关于ICMP消息的ICMP消息。