python套接字地址信息输出的含义

时间:2018-03-20 13:41:33

标签: python sockets packet-sniffers

我想了解python套接字地址信息输出的含义。

import socket
rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
pkt = rawSocket.recvfrom(2048)

print pkt[1]
('ens33', 2048, 1, 1, 'HE \xfd\x12h')
  1. ens33是发送数据的界面。

  2. 我猜2048是缓冲区大小。

  3. 我不知道第一个" 1"是。有时它" 0"。

  4. 我注意到第二个" 1"涉及界面(即" 772" for" lo")

  5. ' HE \ xfd \ x12h' :还原转换后的十六进制值,我们得到' \ x48 \ x45 \ x20 \ xfd \ x12 \ x68',它在VM桥接连接中给出主机的mac地址。

  6. 所以,主要问题是#3。这里1或0是什么意思?

1 个答案:

答案 0 :(得分:2)

简而言之,第三个1表示它是一个广播数据包。 0意味着它是一个发往运行Python代码的机器的数据包。详情如下。

这是基于Python 3.6,但对于其他Py2或Py3版本,答案应该类似。答案分为source for the socket modulepacket(7) man pagethe Linux source

Python库包含函数makesockaddr()。对于PF_PACKET套接字(与AF_PACKET相同),relevant portion为您提供以下字段顺序。 man page的解释用斜体表示。

  1. ifname(例如,ens33)(接口名称,如您所述)
  2. sll_protocol(例如2048物理层协议
  3. sll_pkttype(例如1数据包类型
  4. sll_hatype(例如1 ARP硬件类型
  5. sll_addr(例如,MAC地址,如上所述)物理层地址
  6. Linux源代码为packet type提供了各种值。在该列表中,1PACKET_BROADCAST0PACKET_HOST,解释为“给我们”。