答案1
长话短说默认情况下,它开始于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