关于ICMP回显应答报文中未解释额外字节的技术咨询
困惑:ICMP回显应答报文里出现了请求类型,还有28字节未解释数据
最近在研究ICMP回显报文,用Python 3的原始套接字抓包分析,遇到了挺奇怪的问题,跟大家聊聊:
先贴一下我的收发报文代码:
发送报文代码
mySocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) mySocket.settimeout(self.__ipTimeout) mySocket.bind(("", 0)) mySocket.setsockopt(IPPROTO_IP, IP_TTL, struct.pack('I', self.getTtl())) # Unsigned int - 4 bytes packet = b''.join([self.__header, self.__data]) mySocket.sendto(packet, (self.__destinationIpAddress, 0))
接收报文代码
recvPacket, addr = mySocket.recvfrom(1024)
已验证的报文部分
首先确认了IPv4头部是20字节:首字节0x45里,4表示IPv4协议,5对应IHL字段(5个32位字,换算下来就是20字节),这部分是符合规范的。
异常的ICMP类型
在报文中找到了08 00的标识——这是ICMP回显请求的起始标记,但问题是,这是我收到的应答报文啊!正常来说应答的类型码应该是0,结果这里却是8(回显请求),而且我已经把8字节的ICMP头部标红了,这完全反常。
自定义数据与未解释字段
紧跟ICMP头部的是我自己加的用户数据:8字节时间戳+52字节大小写字母表,这部分没问题。但之后还有28字节的数据完全没法解释,我是不是漏了网络层的某个头部?
这些未解释的数据里有几个字段看着眼熟:
C0 A8 00 23是我自己设备的局域网地址192.168.0.35,这个是对的- 还有一段连续的零值,看起来像是ICMP回显应答的起始部分,但后面的数据就乱套了——比如标识符是
45 00、序列号是00 58,虽然数值本身合法,但完全搞不懂为什么会出现在这里。
这次给我回包的设备是Virgin Media Superhub,会不会是这个设备本身就有问题,返回了格式错误的Ping报文?有没有大佬遇到过类似的情况?
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

