tcp[12:1]
является байт со смещением 12 байт от начала заголовка TCP; 12 - это не смещение от начала пакета, это смещение от начала заголовка TCP (это tcp[12:1]
, а не ether[12:1]
или что-то в этом роде). «1» - это количество байтов, на которые ссылается.
В соответствии с RFC 793, который является спецификацией для TCP, байт со смещением в 12 байт от начала the TCP header содержит смещение данных в верхних 4 битах, а нижние 4 бита - зарезервированные биты. Смещение данных - «Число 32-битных слов в заголовке TCP», которое «указывает, откуда начинаются данные».
Данные в пакете отображаются в виде последовательности пар байтов. Это немного легче понять, если представить в виде последовательности отдельных байтов, так:
0x0000: 1a 17 8e 8a a3 a0 02 6d 62 7d 04 9c 08 00 45 00
eth dest eth src etype IP hdr
Первые 6 байт пакета являются адрес назначения Ethernet.
Следующие 6 байтов пакета - это адрес источника Ethernet.
2 байта после этого являются значением типа Ethernet; это big-endian, поэтому его значение равно 0x0800, что является значением типа Ethernet для IPv4.
Следующие 2 байта - это первые 2 байта заголовка IPv4. Согласно RFC 791, который является спецификацией для IPv4, первый байт the IPv4 header содержит версию IP в верхних 4 битах и длину заголовка в младших 4 битах. Этот байт имеет значение 0x45, поэтому версия IP равна 4 (как и должно быть, для IPv4), а длина заголовка равна 5. Длина заголовка «это длина интернет-заголовка в 32-битных словах», так что это 5 32-битные слова или 20 байтов.
Так, теперь давайте пропустить заголовок IPv4 и перейти в заголовок TCP:
0x0020: 0d c9 ba f0 1f 90 86 e2 f3 b7 f9 9e b5 03 80 18
TCP header 12 13
Так байт 12 заголовка TCP является 0x80. 0x80 & 0xf0 - 0x80, а 0x80 >> 2 - 0x20, что равно 32; это согласуется с верхними 4 битами этого байта, являющимися смещением данных в 32-битных словах, как 8 * 4 = 32. Таким образом, для этого пакета 444, т.е. 4 байта со смещением 32 из начала заголовка TCP.
32 байт от начала заголовка TCP является:
0x0040: 2e78 4745 5420 2f69 636f 6e73 2f75 6e6b
^
там, и это «GET» заголовка запроса HTTP, начиная с начала данных TCP сегмента. Эти 4 байта - «GET».
Так 12 в tcp[12:1]
является не смещения от начала пакета, это смещение от начала TCP заголовка (это tcp[12:1]
, не ether[12:1]
или что-то такое, как).
И, в ответ на вопросы о байтах пакета и что они являются:
0x0000: 1a 17 8e 8a a3 a0: Ethernet destination
02 6d 62 7d 04 9c: Ethernet source
08 00: Ethernet type/length field - 0x0800 = IPv4
Таким образом, первые 14 (0x000E) байт пакета являются заголовок Ethernet.
В этом пакете, то/поле длины типа Ethernet, является 0x0800, так что полезная нагрузка Ethernet, после заголовка Ethernet, является IPv4 пакет, начиная с заголовка IPv4:
45: IPv4 version/header length
00: IPv4 Type of Service/Differentiated Service
0x0010: 0a e2: IPv4 total length
9c bf: IPv4 identification
40 00: IPv4 flags/fragment offset
3f: IPv4 time-to-live
06: IPv4 (next) protocol - 6 = TCP
ac 3b: IPv4 header checksum
0a f0 23 51: IPv4 source address
ac 11: first 2 bytes of IPv4 destination address
0x0020: 0d c9: second 2 bytes of IPv4 destination address
Длина заголовка IPv4- 5, поэтому заголовок IPv4 составляет 20 байтов. Это минимальная длина заголовка IPv4; он не может быть меньше, но он может быть больше, если есть параметры IPv4 после части фиксированной длины заголовка. В этом случае их нет.
В поле протокола имеет значение 6, полезная нагрузка для IPv4 является TCP-пакетов:
ba f0: TCP source port (47856)
1f 90: TCP destination port (8080)
86 e2 f3 b7: TCP sequence number
f9 9e b5 03: TCP acknowledgment number
80: TCP data offset + reserved bits
18: reserved bits + TCP flags
0x0030: 00 1c: TCP window
f2 ef: TCP checksum
00 00: TCP urgent pointer
Это 20-байтовый фиксированной длины часть заголовка TCP; однако, длина заголовка TCP составляет 32 байт, так что есть еще 12 байт опций TCP в заголовке:
01: TCP No-Operation option
01: TCP No-Operation option
08 0a 71 a8 6f 0b 0c c8: first 8 bytes of TCP Timestamp option
0x0040: 2e 78: last 2 bytes of TCP Timestamp option
Длина TCP-Header должна быть кратной 32 бит, то есть кратна 4 байта; Параметры TCP могут не быть кратным 4 в длину - параметр временной метки TCP имеет длину 10 байт, поэтому для заполнения используется опция No-Operation.
Итак, эти 32 байта были заголовком TCP; что следует за полезной нагрузкой TCP.По-видимому, это на соединение HTTP (пакет посылается на порт 8080, который является альтернативным HTTP порт), и это начало запроса HTTP GET:
47 45 54 20 2f 69 63 6f 6e 73 2f 75 6e 6b
0x0050: 6e 6f 77 6e 2e 67 69 66 20 48 54 54 50 2f 31 2e
0x0060: 31 0d 0a 68 6f 73 74 3a 20 70 68 70 2d 6d 69 6e
Итак:
- , поскольку это было зафиксировано либо в сети Ethernet, либо в сети Wi-Fi, если оно не находится в режиме мониторинга (или в каком-либо другом типе сети, в котором используются заголовки Ethernet или на которых адаптер или драйвер снабжают заголовки «поддельные Ethernet», как с Wi-Fi), пакет начнется с заголовка Ethernet;
- как значение типа Ethernet - 0x0800, за ним следует заголовок IPv4;
- , поскольку значение протокола IPv4 равно 6, за ним следует заголовок TCP;
- как один из номеров портов TCP - это номер порта, который обычно используется HTTP (8080), это , вероятно,, за которым следуют HTTP-данные (это не гарантировано, однако, номера портов TCP больше похожи на подсказки) ,
Для ARP над одной и той же сети, вы будете снова иметь заголовок Ethernet (ffff ffff
является адресом Ethernet вещания, так что пакет транслируется, как и ARP запросы, как правило, являются), с типом Ethernet из 0x0806 , который является значением типа Ethernet для ARP.
Для ICMP по той же сети у вас снова будет заголовок Ethernet, и у вас также будет заголовок IPv4, поэтому тип Ethernet будет 0x0800. Значение в поле протокола в заголовке IPv4 будет 1 для ICMP.
Большое спасибо. Я думаю, что я отсутствовал, это правильное понимание «смещения данных». Прежде чем принимать ответ, позвольте мне спросить вас: (1), что же такое структура пакета - первые байты 0x0010 - это заголовок протокола ethernet? (2) Затем заголовок протокола IP? (3) Откуда вы это знаете (в каком-то контексте нужно было понять, какой пакет ожидать). Давайте сравним это с ARP tcpdump (ffff ffff ffff 0026 ...) или ICMP (0800 27b9 caba 0026 ...). Как узнать, какие цифры означают, что и когда? –