解包收到的数据后的奇怪协议

时间:2016-10-31 22:00:05

标签: python windows sockets ip raw-sockets

设置连接。

HOST = socket.gethostbyname(socket.gethostname())
con = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
con.bind((HOST, 0))
con.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
con.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

接收数据。

raw_data, addr = con.recvfrom(65536)

raw_data:\ x45 \ x00 \ x00 \ x77 \ x00 \ x00 \ x40 \ x00 \ x40 \ x11 \ xb4 \ xc0 \ xc0 \ xa8 \ x02 ...

解压缩原始数据。

dest, src, proto = struct.unpack('! 6s 6s H', data[:14])

dest:\ x45 \ x00 \ x00 \ x77 \ x00 \ x00

src:\ x40 \ x00 \ x40 \ x11 \ xb4 \ xc0

proto:49320

所以我的问题是:我正在做一个明显的错误吗?什么样的ethertype(协议)是49320?

1 个答案:

答案 0 :(得分:1)

你从哪里读过你的IPV4数据包定义?
您完全错误地解释了数据!

看起来您在OSI模型中混淆了第2层(数据链接)和第3层(网络层)。套接字在第3层进入.Socket raw允许您从第3层读取原始数据包。

看看这些链接:

  1. IPv4 packet structure
  2. List of IP Protocol Numbers
  3. 所以给出这个数据:
    \x45\x00\x00\x77\x00\x00\x40\x00\x40\x11\xb4\xc0\xc0\xa8\x02...

    \x45     = Version (IPV4) + IHL (5 32bit ints = 20 bytes)
    \x00     = DCSP (0 - best effort) + ECN (0 - Non ECN-Capable Transport, Non-ECT)
    \x00\x77 = Total length (119 bytes)
    \x00\x00 = Identification (0)
    \x40\x00 = Flags (100 - MF - more fragments) + Fragment Offset (0)
    \x40     = TTL (64 seconds)
    \x11     = Protocol (UDP)
    \xb4\xc0 = Header Checksum (0xb4c0)
    
    Followed by source IP then dest IP. You haven't given these 
      fully so I can't decode them.
    

    我希望现在有道理。