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

meaning of python socket address info output

我正在尝试理解 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”与接口有关(即 "lo" 的“772”)

  5. 'HE \xfd\x12h' :恢复转换后的十六进制值,我们得到'\x48\x45\x20\xfd\x12\x68',它给出主机machine的mac地址虚拟机桥接连接。

所以,主要问题是针对 #3。 1 或 0 在这里意味着什么?

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

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

Python 库包含函数 makesockaddr(). For PF_PACKET sockets (same as AF_PACKET), the relevant portion gives you the following order of fields. Explanations from the man page 以斜体显示。

  1. ifname(例如,ens33)(接口名称,如您所述)
  2. sll_protocol(例如,2048Physical-layer 协议
  3. sll_pkttype(例如,1数据包类型
  4. sll_hatype(例如,1ARP 硬件类型
  5. sll_addr(例如,MAC 地址,如上所述)Physical-layer 地址

Linux 来源给出了 packet type 的各种值。在该列表中,1PACKET_BROADCAST0PACKET_HOST,解释为 "To us"。