Jacktose Asked: 2018-06-30 12:49:29 +0800 CST2018-06-30 12:49:29 +0800 CST 2018-06-30 12:49:29 +0800 CST mtr -u 使用什么 UDP 目标端口? 772 traceroute默认情况下将 UDP 数据包发送到端口 33434(及以上)。 我假设mtr -u(手册、主页、github)也是如此,但我找不到任何文档或测试结果来验证目标端口号。 是否mtr -u使用目标端口 33434 然后递增,例如traceroute? networking ip 1 个回答 Voted Best Answer Patrick Mevzek 2018-06-30T13:35:16+08:002018-06-30T13:35:16+08:00 TL;DR默认情况下,它从33000开始并上升。 如果您同时运行网络跟踪,您可以观察到它: tcpdump -i any -n host 8.8.8.8 & mtr -u --report -c 1 8.8.8.8 21:21:50.777482 IP [redacted].31507 > 8.8.8.8.33000: UDP, length 36 21:21:50.877579 IP [redacted].31507 > 8.8.8.8.33001: UDP, length 36 21:21:50.977694 IP [redacted].31507 > 8.8.8.8.33002: UDP, length 36 21:21:51.077850 IP [redacted].31507 > 8.8.8.8.33003: UDP, length 36 21:21:51.177966 IP [redacted].31507 > 8.8.8.8.33004: UDP, length 36 21:21:51.278081 IP [redacted].31507 > 8.8.8.8.33005: UDP, length 36 21:21:51.378198 IP [redacted].31507 > 8.8.8.8.33006: UDP, length 36 21:21:51.478341 IP [redacted].31507 > 8.8.8.8.33007: UDP, length 36 21:21:51.578498 IP [redacted].31507 > 8.8.8.8.33008: UDP, length 36 21:21:51.678646 IP [redacted].31507 > 8.8.8.8.33009: UDP, length 36 21:21:51.778801 IP [redacted].31507 > 8.8.8.8.33010: UDP, length 36 21:21:51.878949 IP [redacted].31507 > 8.8.8.8.33011: UDP, length 36 21:21:51.979117 IP [redacted].31507 > 8.8.8.8.33012: UDP, length 36 这就是代码中的原因。 源代码位于https://github.com/traviscross/mtr 如果您分析它,您会观察到 TCP 和 UDP 在解析命令行参数期间的不同行为: case 'u': if (ctl->mtrtype != IPPROTO_ICMP) { error(EXIT_FAILURE, 0, "-u , -T and -S are mutually exclusive"); } ctl->mtrtype = IPPROTO_UDP; break; case 'T': if (ctl->mtrtype != IPPROTO_ICMP) { error(EXIT_FAILURE, 0, "-u , -T and -S are mutually exclusive"); } if (!ctl->remoteport) { ctl->remoteport = 80; } ctl->mtrtype = IPPROTO_TCP; 所以默认情况下没有为 UDP 设置端口,而80默认情况下是为 TCP 设置的。 mtr.h有 #define MinPort 1024 #define MaxPort 65535 但这具有误导性,真正的事情发生在ui/net.c. net_send_query来电new_sequence 并将结果传递给send_probe_command new_sequence在这个文件中有static int next_sequence = MinSequence; 现在,经过大量的跳跃之后,您到达了set_udp_ports其中: if (param->dest_port) { ... } else { udp->dstport = htons(sequence); 简而言之,“序列”号实际上就是 UDP 目的端口。 如果我们回头看,ui/net.c我们会看到它被定义为: #define MinSequence 33000 #define MaxSequence 65536
TL;DR默认情况下,它从33000开始并上升。
如果您同时运行网络跟踪,您可以观察到它:
这就是代码中的原因。
源代码位于https://github.com/traviscross/mtr
如果您分析它,您会观察到 TCP 和 UDP 在解析命令行参数期间的不同行为:
所以默认情况下没有为 UDP 设置端口,而
80
默认情况下是为 TCP 设置的。mtr.h
有但这具有误导性,真正的事情发生在
ui/net.c
.net_send_query
来电new_sequence
send_probe_command
new_sequence
在这个文件中有static int next_sequence = MinSequence;
现在,经过大量的跳跃之后,您到达了
set_udp_ports
其中:简而言之,“序列”号实际上就是 UDP 目的端口。
如果我们回头看,
ui/net.c
我们会看到它被定义为: