mtr -u 使用什么 UDP 目标端口?

mtr -u 使用什么 UDP 目标端口?

traceroute默认情况下,将 UDP 数据包发送到端口 33434(及以上)。

我假设mtr -u手动的,主页,github)做同样的事情,但我找不到任何文档或测试结果来验证目标端口号。

是否mtr -u使用目标端口 33434 然后递增,例如traceroute

答案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 默认没有设置端口,而80TCP 默认设置端口。

mtr.h

#define MinPort 1024
#define MaxPort 65535

但这是误导性的,真实的事情发生在ui/net.c

  1. net_send_query来电new_sequence
  2. 并将结果传递给send_probe_command
  3. 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

相关内容