Каждый пакет inte rnet существует из следующих уровней:
- L2 - канал передачи данных (например, адреса Ma c, ethertype, VLAN, ...)
- L3 - Сеть (например, IPv4 / IPv6 / ...)
- L4 - Транспорт (например, UDP / TCP / ...)
- L5 - Полезная нагрузка Некоторые разделяют L5 на три разных уровня (L5 , L6 и L7, которые являются Сессией, Представлением и Приложением соответственно). Более подробную информацию можно найти в wiki OSI Moudel !
Для L2, поскольку вы ожидаете IPv4 (не IPv6, верно?):
EthernetFrame {
Dest Mac Addr, # Len is 6 B
Src Mac Addr, # Len is 6 B
EtherType, # Len is 2 B - This value will be 0x0800
}
Если это IPv4, затем EtherType==0x0800
Если EtherType==0x8100
, то это VLAN, затем после этого ожидайте прочитать еще 2 B для данных VLAN PCP / DEI / VID - подробнее о VLAN ! Таким образом, ваш пакет будет выглядеть так:
EthernetFrame {
Dest Mac Addr, # Len is 6 B - Some Dest Mac
Src Mac Addr, # Len is 6 B - Some Src Mac
EtherType, # Len is 2 B - 0x8100 - VLAN
VlanData, # Len is 2 B - VLAN Data - DEI / PCP / VID
EtherType # Len is 2 B - Again, need to parse...
}
Теперь, если второй EtherType==0x0800
, то следующий уровень (L3 - сеть) - IPv4. Подробнее о ethertype
L3 - сетевой уровень - из вики https://en.wikipedia.org/wiki/IPv4? Поскольку этот IPv4, то длина L3 фиксирована до 5 B (40 бит), если только IHL> 5.
Version - 4 b
IHL - 4 b
DSCP - 6 b
ECN - 2 b
Total Len - 16 b - Include header + data
Identification - 16 b
Flags - 3 b
Fragment offset - 13 b
TTL (Time to Live) - 8 b
Protocol - 8 b (for next Layer parse, in your case will be UDP with 0x11)
Header Checksum - 16 b
Src IP Addr - 32 b
Dest IP Addr - 32 b
Выше пакета описывают пакет IPv4 в случае IHL<=4
. В противном случае, добавьте опции tail к пакету относительно len IHL.
На этом этапе вы знаете общее len, и что Layer-4 является UDP. Проверьте вики https://en.wikipedia.org/wiki/User_Datagram_Protocol? L4 выглядит так - Для UDP (TCP отличается, другие протоколы разные ..):
Source prot - 2 B
Dest port - 2 B
Length - 2 B
Checksum - 2 B
Подводя итог - нужно:
- Начать с L2, понять, что такое ethertype и на его основе для анализа L3
- На L3 необходимо узнать всю общую длину len и тип протокола L4 (например, UDP или TCP).
- На L4 необходимо узнать len (вы также знаете это из L3 !!!).
- Разбор полезной нагрузки !!
Если нет VLAN или любого другого типа ether кроме IPv4 и IHL <= 4, то полезная нагрузка начинается с <code>14 + 20 + 8
- 14 B для L2
- 20 B для L3
- 8 B для L4
Удачи !