TL; DR Por padrão, ele começa em 33000 e sobe.
Você pode observá-lo se você executar um rastreamento de rede ao mesmo tempo:
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
Aqui está o porquê no código.
O código-fonte está no link
Se você analisar, observe o comportamento diferente entre TCP e UDP durante a análise dos argumentos da linha de comando:
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;
Portanto, nenhuma porta é definida por padrão para UDP, onde é 80
por padrão para TCP.
mtr.h
tem
#define MinPort 1024
#define MaxPort 65535
mas isso é enganoso, o material verdadeiro acontece em ui/net.c
.
-
net_send_query
chamadasnew_sequence
- e os resultados são passados entre outras coisas para
send_probe_command
-
new_sequence
neste arquivo temstatic int next_sequence = MinSequence;
Agora, depois de muitos saltos, você chega em set_udp_ports
, que tem:
if (param->dest_port) {
...
} else {
udp->dstport = htons(sequence);
Em suma, o número "sequence" é realmente a porta de destino do UDP.
E se voltarmos a ui/net.c
, vemos que é definido como:
#define MinSequence 33000
#define MaxSequence 65536