networking - 了解 traceroute 会话中的路由器行为
问题描述
我试图了解路由器如何处理 UDP 和 TCP 数据包。
我选择了一个网站并使用 UDP 和 TCP 使用 traceroute。
UDP输出如下:
yilmazali@udemy:~$ traceroute -v -m 15 metu.edu.tr
traceroute to metu.edu.tr (144.122.145.153), 15 hops max, 52 byte packets
1 csp3.zte.com.cn (192.168.1.1) 60 bytes to 192.168.1.4 16.534 ms 1.281 ms 1.136 ms
2 host-212-57-0-245.reverse.superonline.net (212.57.0.245) 60 bytes to 192.168.1.4 9.552 ms 9.559 ms 10.065 ms
3 10.40.22.237 (10.40.22.237) 76 bytes to 192.168.1.4 6.070 ms 10.966 ms 6.093 ms
4 10.34.255.157 (10.34.255.157) 36 bytes to 192.168.1.4 7.869 ms 9.842 ms 6.538 ms
5 10.34.255.250 (10.34.255.250) 76 bytes to 192.168.1.4 7.474 ms 7.732 ms 11.364 ms
6 10.38.207.137 (10.38.207.137) 148 bytes to 192.168.1.4 8.746 ms 7.645 ms 5.906 ms
7 10.40.145.85 (10.40.145.85) 36 bytes to 192.168.1.4 7.223 ms 8.806 ms 8.685 ms
8 * * *
9 144.122.1.18 (144.122.1.18) 60 bytes to 192.168.1.4 20.426 ms 13.984 ms 15.184 ms
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
使用 TCP traceroute,我可以在 12 跳内到达主机目的地:
yilmazali@udemy:~$ sudo tcptraceroute -p 80 metu.edu.tr
Selected device en0, address 192.168.1.4, port 80 for outgoing packets
Tracing the path to metu.edu.tr (144.122.145.153) on TCP port 80 (http), 30 hops max
1 192.168.1.1 1.215 ms 1.080 ms 1.316 ms
2 host-212-57-0-245.reverse.superonline.net (212.57.0.245) 4.183 ms 9.425 ms 10.032 ms
3 10.40.22.237 7.459 ms 7.782 ms 7.361 ms
4 10.34.255.157 6.455 ms 5.887 ms 14.849 ms
5 10.34.255.250 6.110 ms 10.768 ms 7.230 ms
6 10.38.207.137 7.604 ms 6.761 ms 9.247 ms
7 10.40.145.85 8.526 ms 8.942 ms 10.607 ms
8 * * *
9 144.122.1.18 15.320 ms 16.699 ms 14.010 ms
10 dng03.general.services.metu.edu.tr (144.122.145.153) [open] 17.520 ms 14.696 ms *
[Q1] 我无法理解路由器在 TCP 跟踪路由的步骤 [8] 中的行为方式。我有一个这样的猜测:路由器接收到 TTL=1 的数据包,并看到它应该返回“TTL 过期”响应。但它没有(为什么它不返回我?防火墙规则?)。在下一次迭代中,我的计算机使用 TTL=9 发送相同的数据包,这一次我从144.122.1.18
. 这是否意味着步骤 [8] 的路由器实际上转发了我的数据包,看到它是 TTL=2(并且在转发时还减少了 TTL)?在第 8 次迭代中,路由器丢弃了我的数据包并且没有向我返回响应,但在第 9 次迭代中,路由器将我的数据包转发到下一个路由器。如果我的数据包在第 8 次迭代中被定义为可丢弃的东西,为什么路由器在第 9 次迭代中转发它?
我认为路由器中的防火墙配置有两件事:
- [B1]拒绝回复主机(拒绝发送ttl过期消息),
- [B2] 还丢弃要在网络中传播到下一个主机的数据包。
我不确定这两件事是否在实践中完成。
[Q2] 我的第二个问题是:在 TCP traceroute 中,我们看到它metu.edu.tr
可以在 10 跳内到达。
假设 [B2] 为假,即考虑到路由器确实转发 TTL>1 的数据包,如果metu.edu.tr
在 10 跳内可达,为什么我在第一个跟踪路由会话中的 UDP 数据包在 15 次迭代中无法到达主机(即使 TTL=15 )。我希望路由器将它转发到下一个路由器,直到我到达dng03.general.services.metu.edu.tr
希望返回ICMP port unused
错误或类似的东西。
非常感谢您的时间!
解决方案
如果我的数据包在第 8 次迭代中被定义为可丢弃的东西,为什么路由器在第 9 次迭代中转发它?
它不是同一个数据包。丢弃的数据包的 TTL 为 8,因此无法转发。未丢弃的数据包的 TTL 为 9。
...并且在转发时还减少了 TTL
是的,路由器在转发时会递减 TTL。这就是 TTL 的重点:转发时递减 TTL,当TTL 达到零时递减。
为什么不回我?防火墙规则?
可能是防火墙规则、路由器配置、每次 ICMP 消息的限制......
如果 metu.edu.tr 在 10 跳内可达,为什么我在第一个 traceroute 会话中的 UDP 数据包无法在 15 次迭代中到达主机(即使 TTL=15
您显示的 traceroute 的输出并不意味着无法在 10 跳内到达主机。这意味着 10 跳的主机没有响应数据包,即没有超过 ICMP TTL,但也没有其他任何东西(如 ICMP 端口不可达)。可能是服务器实际上是在 10 跳时到达的,但它只是丢弃了您的 UDP 数据包而没有任何进一步的反应。这发生在所有 UDP 探测到达服务器时,即无论原始 TTL 是否为 10、11、12,...。
这就像敲门没有反应一样。可能有人不在里面,但也可能只是忽略了敲门声。因此,它不能从没有人在里面的“没有反应”推导出来。
推荐阅读
- google-cloud-platform - 为什么我的 GCP 负载均衡器证书在配置时卡住了?
- android - 在 Android Studio 3.2.1 的依赖解析中包含配置后,无法更改配置的依赖关系
- c# - WinForms 字体对话框样式被 WPF 应用程序样式覆盖
- python - Python:如何获取 IF 语句以从用户输入中识别关键字?
- javascript - 如果不选择选择框需要更改样式
- laravel - Laravel Nova自定义工具创建:vue组件不刷新
- jquery - 用于不允许仅数字或仅特殊字符的 Jquery 正则表达式
- google-cloud-dataflow - 如何在 Apache Beam 步骤中并行化 HTTP 请求?
- eclipse - eclipse 2018-09 MacOS 中缺少 BndTools 透视图
- html - Electron:如何打开电子中附加的浏览器上传文件对话框