Сети TCP/IP > Программа tcpdump

Программа tcpdump позволяет прослеживать входящие и исходящие IP-пакеты. О каждом пакете программа выводит краткую информацию, которая содержит следующие сведения: кто послал пакет, кому, протокол, некоторые параметры пакета. Набор этих сведений варьируется в зависимости от протокола, по которому послан пакет, параметров, с которыми запущена программа, а также от версии программы.

Работа программы ping

На примере программы ping можно наблюдать отправление и прием ICMP-пакетов на данном компьютере.

baboon:/# ping macaca
PING macaca.school.ioffe.ru (192.168.5.20): 56 data bytes
64 bytes from 192.168.5.20: icmp_seq=0 ttl=255 time=0.3 ms
64 bytes from 192.168.5.20: icmp_seq=1 ttl=255 time=0.2 ms
64 bytes from 192.168.5.20: icmp_seq=2 ttl=255 time=0.2 ms
baboon:/#

Соответствующий вывод tcpdump.

14:46:40.264444 baboon > macaca: icmp: echo request (DF)
14:46:40.265247 macaca > baboon: icmp: echo reply
14:46:41.430389 baboon > macaca: icmp: echo request (DF)
14:46:41.431174 macaca > baboon: icmp: echo reply
14:46:42.423001 baboon > macaca: icmp: echo request (DF)
14:46:42.423773 macaca > baboon: icmp: echo reply

Компьютер, на котором запущен ping (baboon), отправляет echo запросы, и в ответ от macaca получает echo ответы. Опция (DF) означает, что пакет нельзя фрагментировать. (DF = Don't Fragment)

Работа программы traceroute

Запустив traceroute, мы можем понаблюдать за отправлением UDP-пакетов и приемом ICMP-пакетов.

baboon:/# traceroute macaca
traceroute to macaca.school.ioffe.ru (192.168.5.20), 30 hops max, 38 byte packets
 1  macaca (192.168.5.20)  0.238 ms  0.180 ms  0.138 ms

tcpdump напечатает примерно следующее:

14:50:24.233845 baboon.33271 > macaca.33435: udp 10 [ttl 1]
14:50:24.457792 baboon.33271 > macaca.33436: udp 10 [ttl 1]
14:50:24.463999 baboon.33271 > macaca.33437: udp 10 [ttl 1]
14:50:24.474829 macaca > baboon: icmp: macaca udp port 33435 unreachable [tos 0xc0] 
14:50:24.482407 macaca > baboon: icmp: macaca udp port 33436 unreachable [tos 0xc0] 
14:50:24.580256 macaca > baboon: icmp: macaca udp port 33437 unreachable [tos 0xc0] 

baboon послал с порта 33271 три пакета на macaca на порты 33435, 33436, 33437 по протоколу UDP. TTL у пакетов был установлен в 1. В ответ пришел ответ по ICMP, о том что эти порты никто не слушает.

Работа программы telnet

Программа telnet для соединения с хостом использует протокол TCP. При помощи tcpdump можно видеть начало соединения (синхронизацию)…

15:04:05.551401 baboon.2137 > macaca.telnet: S 2308018509:2308018509(0) win 5840 <mss 1460,sackOK,timestamp 296369 0,nop,wscale 0> (DF) [tos 0x10] 
15:04:05.552115 macaca.telnet > baboon.2137: S 3331317264:3331317264(0) ack 2308018510 win 5792 <mss 1460,sackOK,timestamp 7560401 296369,nop,wscale 0> (DF)

Рассмотрим детально первую строчку вывода с информацией о первом пакете и объясним на ее примере некоторые опции и параметры TCP-пакета.

15:04:05.551401 baboon.2137 > macaca.telnet: S 2308018509:2308018509(0) win 5840 <mss 1460,sackOK,timestamp 296369 0,nop,wscale 0> (DF) [tos 0x10]
Время отправки пакета Кто отправил пакет и кому Бит SYN sequence number, в скобках – длина пакета window size опции TCP-пакета (не фрагментировать) и TOS (0x10 = minimize delay)

Параметр Window Size. В параметре Window Size драйвер TCP указывает размер своего буфера. Т. е. Window Size – это максимальное количество байт, которое будет сохранено в буфере без передачи приложению.

Опция MSS. MSS (Maximum Segment Size) – максимальный размер пакета, который будет передан без фрагментации. MSS зависит от физических возможностей канала (по Ethernet, например, можно передать пакет длиной не более 1500 байт, по протоколу SLIP – 256 байт). Таким образом для Ethernet MSS будет равно 1460 (= 1500 – 20 (IP header) − 20 (TCP header)).

При установлении соединения (и, может быть, в процессе соединения) компьютеры обмениваются своими предпочтительными значениями MSS. На основании этих данных, драйвер может принять решение, о том какой длины отправлять пакеты.

Если порт, на который послан запрос, не слушает никакая порграмма, то в ответ придет примерно следующее сообщение о том, что соединение завершено. (У этого пакета установлен бит RST.)

15:51:24.551401 baboon.2137 > macaca.33333: S 2308018509:2308018509(0) win 5840 <mss 1460,sackOK,timestamp 296369 0,nop,wscale 0> (DF) [tos 0x10] 
15:51:24.637520 macaca.33333 > baboon.2061: R 0:0(0) ack 2308018509 win 0 (DF) [tos 0x10]

Далее можно видеть процесс обмена пакетами, передающими команды пользователя и ответы telnet-демона… (Он устанавливает у всех пакетов PSH-бит, чтобы данные сразу отправлялись приложению, в данном случае на терминал.)

15:04:05.552784 baboon.2137 > macaca.telnet: . ack 1 win 5840 <nop,nop,timestamp 296370 7560401> (DF) [tos 0x10] 
15:04:05.562961 macaca.telnet > baboon.2137: P 1:13(12) ack 1 win 5792 <nop,nop,timestamp 7560402 296370> (DF) [tos 0x10] 
15:04:17.495729 baboon.2137 > macaca.telnet: . ack 397 win 6432 <nop,nop,timestamp 297564 7561595> (DF) [tos 0x10] 
15:04:17.496270 macaca.telnet > baboon.2137: P 397:405(8) ack 101 win 5792 <nop,nop,timestamp 7561595 297564> (DF) [tos 0x10] 

…и завершение соединения (компьютеры обмениваются пакетами с битом FIN).

15:04:17.496524 macaca.telnet > baboon.2137: F 405:405(0) ack 101 win 5792 <nop,nop,timestamp 7561595 297564> (DF) [tos 0x10] 
15:04:17.506739 baboon.2137 > macaca.telnet: F 101:101(0) ack 406 win 6432 <nop,nop,timestamp 297565 7561595> (DF) [tos 0x10] 
15:04:17.511724 macaca.telnet > baboon.2137: . ack 102 win 5792 <nop,nop,timestamp 7561597 297565> (DF) [tos 0x10] 

Виктор Кропп