Networking

mtr -u 使用什麼 UDP 目標埠?

  • June 29, 2018

traceroute預設情況下將 UDP 數據包發送到埠 33434(及以上)。

我假設mtr -u手冊首頁github)也是如此,但我找不到任何文件或測試結果來驗證目標埠號。

是否mtr -u使用目標埠 33434 然後遞增,例如traceroute

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.

  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

引用自:https://unix.stackexchange.com/questions/452709