Я пытался понять эти методы парсинга данных из анализатора.
Например, базовый код извлекает заголовки IP с помощью преобразования "! 9s1s2s4s4s"
#!/usr/bin/env python
import socket
import struct
import binascii
global IP, TCP, UDP, HTTP
IP, TCP, UDP, HTTP = False, False, False, False
def parseIP(header):
global TCP, UDP
ip_hdr = struct.unpack("!9s1s2s4s4s", header)
source = socket.inet_ntoa(ip_hdr[3])
dest = socket.inet_ntoa(ip_hdr[4])
print "\nIP"
print "-Source:\t ", source
print "-Dest:\t\t ", dest
if binascii.hexlify(ip_hdr[1]) == '06':
TCP = True
elif binascii.hexlify(ip_hdr[1]) == '11':
UDP = True
rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x800))
while True:
pkt = rawSocket.recvfrom(2048)
print "Received packet:"
parseETH(pkt[0][0:14])
if IP:
parseIP(pkt[0][14:34])
С другой стороны, есть другие способы распаковки ('! BBHHHBBH4s4s', заголовок). Я ясно, что последние 4s4s являются адресом источника и назначения, но я не вижу омологации для 9s1s2s и BBHHHBBH, так как я считаю байты заголовка IP, но не вижу 9s1s2s.