求助:解析Python Socket地址信息输出各字段含义
解析PF_PACKET套接字recvfrom返回的地址元组
嘿,刚好对PF_PACKET类型的原始套接字返回格式门儿清,来帮你逐个拆解你拿到的输出('ens33', 2048, 1, 1, 'HE \xfd\x12h'):
ens33:这个你已经摸透了,就是捕获到数据包的网络接口名称,没啥疑问。2048:别误会,这不是缓冲区大小!它是**以太网帧类型(EtherType)**的十进制值,0x0800转十进制就是2048,对应IPv4协议——刚好你创建套接字时指定了socket.htons(0x0800),所以只会捕获IPv4帧,这个值就固定是2048啦。- 第一个
1(有时为0):这是数据包的接收类型标识,对应Linux内核的packet_type枚举值:0(PACKET_HOST):数据包是直接发给本机的单播包1(PACKET_BROADCAST):广播数据包2(PACKET_MULTICAST):多播数据包3(PACKET_OTHERHOST):发往其他主机但被本机捕获的(比如开了混杂模式)
所以你看到的1说明这是个广播包,换成0就是本机接收的单播包啦。
- 第二个
1(lo接口对应772):这个是网络接口的唯一索引(ifindex),系统里每个网卡都有专属的数字标识。你可以用ip link show ens33命令验证,就能看到ens33的索引是不是1;同理ip link show lo会显示你系统里lo的索引是772,不同系统的接口索引可能不一样哦。 'HE \xfd\x12h':这是链路层的源MAC地址,不过是二进制字节串格式。直接打印会把可打印的ASCII字符显示出来,不可打印的就会变成转义序列。你可以把它转成标准的MAC地址格式,比如用这段代码:import binascii mac_raw = b'HE \xfd\x12h' mac_hex = binascii.hexlify(mac_raw).decode('utf-8') mac_formatted = ':'.join([mac_hex[i:i+2] for i in range(0, 12, 2)]) print(mac_formatted) # 输出 48:45:20:fd:12:68
内容的提问来源于stack exchange,提问作者trogne
相关产品推荐
相关产品推荐

