我正在使用生插座 (用于在网络上发送原始数据的节点模块),并使用他们的Ping示例。
我让Wireshark来监视交通。我可以看到我的ICMP包出了,一个回复回来了。
事情变得怪怪的。
Wireshark显示了以下数据包:
IP: 4500003c69ea00004001e2fec0a85647c0a85640
ICMP: 00004b5200010a096162636465666768696a6b6c6d6e6f7071727374757677616263646566676869但是,当数据进入时触发的节点事件处理程序显示:
IP: 4500280069ea00004001e2fec0a85647c0a85640
ICMP: 00004b5200010a096162636465666768696a6b6c6d6e6f7071727374757677616263646566676869ICMP组件匹配。但是,字节0x02和0x03 (长度字节)不同。Wireshark显示0x003c或60个字节(如预期的那样)。节点显示0x2800或10 or .这并不是人们所期望的。
值得注意的是,校验和(字节0x18和0x19)在每种情况下都是相同的,尽管它只对Wireshark数据包有效。
所以,问题是:什么会导致这种差异?我倾向于相信Wireshark是正确的,因为60个字节对于ICMP答复来说是正确的,但是为什么Node在这里是错误的呢?
OSX注记
这个模块的文档指出,在OSX上,如果不允许使用SOCK_DGRAM,它将尝试使用SOCK_RAW。我在禁用该函数并使用sudo的情况下尝试了这个方法,并得到了与以前相同的响应。
Github问题
看起来https://github.com/nospaceships/node-raw-socket/issues/60对这个问题是开放的,但尚不清楚这是代码错误还是使用问题……
发布于 2022-12-04 22:04:03
这是由于FreeBSD错误(特性?)它从IP长度标头字段中减去IP报头的长度,并将其翻转到主机字节顺序。
https://cseweb.ucsd.edu//~braghava/notes/freebsd-sockets.txt
https://stackoverflow.com/questions/74448657
复制相似问题