implementation - 为什么在 UDP 上运行时,traceroute 在最后一跳期望“Destination Unreachable”而不是“Echo Reply”?
问题描述
摘自 Wikipedia page 的traceroute实现部分:
. . . 直到到达目的地,如果正在使用 UDP 数据包,则返回 ICMP Destination Unreachable 消息;如果正在使用 ICMP Echo 消息,则返回 ICMP Echo Reply 消息。
它说,当我期望它使用 ICMP“Echo 回复”时,在最后一跳 traceroute 期望 ICMP“Destination Unreachable”。
我看到了页面的历史,它被一个名叫“盖伊哈里斯”的人改变了。他说:
. . . 如果您使用 UDP 数据包,就像 traceroute 默认情况下所做的那样,最后一跳将返回 ICMP Destination Unreachable(除非您不幸将 UDP 数据包发送到带有侦听器的端口),而不是 ICMP Echo Reply。
有人可以对此有所了解吗?
解决方案
因为 traceroute 需要在 UDP 数据报到达目的地时获取消息。
Traceroute 的工作原理如下:
- 向目标主机发送 TTL 为 1 的 UDP 数据报。路由器读取数据报,减少 TTL 并返回 ICMP 超时消息。
- Traceroute接收到上述消息,发送另一个TTL为2的UDP数据报。互联网上的路由器读取这个数据报,每次递减TTL,最后发回ICMP超时消息。
- 继续上述步骤,最后,TTL为N,UDP数据报到达目的主机。那么,宿主应该返回什么?它不能像以前那样发回 ICMP 超时消息——没有超过 TTL。
Traceroute设计将UDP数据报发送到主机的某个端口,并且几乎不可能监听该端口(33435
例如)。目的主机收到UDP数据报,发现数据报的目标端口没有被监听,然后返回“Destination Unreachable”消息——更准确地说是“Port Unreachable”。
这就是为什么 traceroute 在最后一跳期望“Destination Unreachable”消息来确定 UDP 数据报已经到达目的地的原因。
顺便说一句,如果目标端口在目标主机上被意外监听,这就是 Guy Harris 所描述的场景:“除非你很不幸将 UDP 数据包发送到带有监听器的端口”
推荐阅读
- javascript - var fs = require('fs') 之后的代码没有运行
- css - 颜色的过渡是即时的?
- c++ - blobdetector 中的 opencv 3 C++ 功能规范中的错误?
- jquery - 使用 Jquery 发布图片
- python - 在 Python 列表理解中更新 JSON 元素
- python-3.x - 在 python 中解析嵌套的 List 列表和字典
- regex - 使用 sed 匹配同一行中的多个模式
- javascript - 覆盖 Javascript 文件 Maven
- c# - 谷歌驱动器重定向 URI 不匹配以及如何从 ASP.net 核心 2.0 中的谷歌驱动器获取文件列表
- javascript - Firefox 中的 SVG ClipPath 文本更新,但 Chrome 中没有