Ваша реализация tar
, вероятно, GNU
, определяет, что файл, переданный в качестве параметра, сжат.
Наиболее используемые в наши дни реализации tar
, GNU tar
и busybox
, смотрят на первые байты файла, так называемое магическое число, чтобы определить, сжат ли файл и какой алгоритм сжатия использовать.
Реализации tar
, найденные в коммерческих Unix, которые основаны на оригинальном коде AT&T, не поддерживают флаг -z
в первую очередь. Заметным исключением является Solaris 11 tar
, где это расширение было добавлено, включая возможность определения формата файла.
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 по умолчанию не задан порт, тогда как для TCP по умолчанию используется порт 80
.
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