Программа 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]