如何解释recvfrom(raw socket)的结果

时间:2017-03-15 21:47:40

标签: python-3.x sockets packet-sniffers

我正在使用Python3开发自定义数据包嗅探器 它不必是平台独立的。我正在使用Linux 我使用的方法是从套接字recivfrom()(AF_PACKET,SOCK_RAW) 它工作正常,但我对recvfrom()返回的信息有问题 recvfrom()返回一个包含5个组件的元组 示例:('eno1',2054,0,1,b'\ x00!\ x9b \ x16 \ xfa \ xd1')
我如何解释最后4个组件? 它在哪里记录?
我不喜欢使用libpcap或scapy。

好!这是一段代码片段:
    s = socket.socket(socket.AF_PACKET,socket.SOCK_RAW,socket.ntohs(0x0003))
...
packet,pktAdr = s.recvfrom(65565)
    print('pktAdr:'+ str(pktAdr))

谢谢!

1 个答案:

答案 0 :(得分:0)

docs.python.org上没有记录,所以我做了一些研究 我现在能够回答自己。

recvfrom返回的元组类似于Linux内核返回的sockaddr_ll结构。
元组包含5个组件:
  - [0]:界面名称(例如' eth0')
  - [1]:物理层的协议(在linux / if_ether.h中定义)
  - [2]:包类型(在linux / if_packet.h中定义)
  - [3]:ARPHRD(在linux / if_arp.h中定义)
  - [4]:实际地址
问题中提供的示例可以解码为:
  - ' eno1'
  - ARP协议(0x806)
  - 传入数据包
  - 以太网框架
  - MAC地址
在监视模式下的WiFi接口的情况下,[3]元素将是803(意味着' IEEE802.11 + RadioTap标题')。

希望这会对某人有所帮助