Python libnet创建具有无效校验和的UDP数据包

Python libnet创建具有无效校验和的UDP数据包,python,udp,libnet,Python,Udp,Libnet,我正在使用pylibnet构造和发送UDP数据包。我以这种方式构造的UDP数据包似乎都有无效的校验和。例如: # python Python 2.4.3 (#1, Sep 3 2009, 15:37:12) [GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> >>&g

我正在使用pylibnet构造和发送UDP数据包。我以这种方式构造的UDP数据包似乎都有无效的校验和。例如:

# python
Python 2.4.3 (#1, Sep  3 2009, 15:37:12)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import libnet
>>> from libnet.constants import *
>>> 
>>> net = libnet.context(RAW4, 'venet0:0')
>>> ip = net.name2addr4('www.stackoverflow.com', RESOLVE)
>>> data = 'This is my payload.'
>>> udptag = net.build_udp(sp=54321, dp=54321, payload=data)
>>> packetlen = IPV4_H + UDP_H + len(data)
>>> iptag = net.autobuild_ipv4(len=packetlen, prot=IPPROTO_UDP, dst=ip)
>>> 
>>> net.write() 
在发送主机上捕获上述数据包会显示无效校验和:

# tcpdump -i venet0:0 -n -v -v port 54321
tcpdump: WARNING: arptype 65535 not supported by libpcap - falling back to cooked socket
tcpdump: listening on venet0:0, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
08:16:10.303719 IP (tos 0x0, ttl  64, id 1, offset 0, flags [none], proto: UDP (17), length: 47) 192.168.55.10.54321 > 69.59.196.211.54321: [bad udp cksum 50c3!] UDP, length 0

我在这里做错了什么吗?

计算校验和的工作通常不在用户空间库中执行,而是在设备驱动程序或硬件中执行。我相信您看到了“校验和卸载”的结果,即物理设备计算传出数据包的校验和,从而节省主机上的CPU周期。许多(如果不是全部的话)现代以太网适配器都这样做,并且驱动程序不计算校验和。由于tcpdump在驱动程序中捕获数据包,因此在数据包到达物理设备之前,它只会在校验和字段中获取垃圾(可能是缓冲区中剩余的垃圾)并进行投诉

在2005-2008年的时间范围内,针对Wireshark报告了几个“bug”,涵盖了这一点,Wireshark(它只是tcpdump或其Windoze等效工具上的GUI包装器)现在可以选择禁用卸载案例的校验和验证

无论如何,我不希望pylibnet(或libnet)负责校验和


另请参见

计算校验和的工作通常不在用户空间库中执行,而是在设备驱动程序或硬件中执行。我相信您看到了“校验和卸载”的结果,即物理设备计算传出数据包的校验和,从而节省主机上的CPU周期。许多(如果不是全部的话)现代以太网适配器都这样做,并且驱动程序不计算校验和。由于tcpdump在驱动程序中捕获数据包,因此在数据包到达物理设备之前,它只会在校验和字段中获取垃圾(可能是缓冲区中剩余的垃圾)并进行投诉

在2005-2008年的时间范围内,针对Wireshark报告了几个“bug”,涵盖了这一点,Wireshark(它只是tcpdump或其Windoze等效工具上的GUI包装器)现在可以选择禁用卸载案例的校验和验证

无论如何,我不希望pylibnet(或libnet)负责校验和


另请参见

这与tcpdump错误或校验和卸载无关。Libnet还计算用户模式下的校验和(仅供参考)。问题在于您没有为UDP报头指定长度。这不是在pylibnet或libnet中自动计算的,因此您必须暂时指定它。下面是您的代码的更正版本。我将在pylibnet上应用一个补丁,以自动检测rc6中的头长度。请继续关注最新消息。我将推出一个新版本来解决这个问题。顺便说一下,如果您有bug或功能请求,请随时通过sourceforge的pylibnet页面与我联系。我喜欢听使用我的软件的开发人员说:)



这与tcpdump错误或校验和卸载无关。Libnet还计算用户模式下的校验和(仅供参考)。问题在于您没有为UDP报头指定长度。这不是在pylibnet或libnet中自动计算的,因此您必须暂时指定它。下面是您的代码的更正版本。我将在pylibnet上应用一个补丁,以自动检测rc6中的头长度。请继续关注最新消息。我将推出一个新版本来解决这个问题。顺便说一下,如果您有bug或功能请求,请随时通过sourceforge的pylibnet页面与我联系。我喜欢听使用我的软件的开发人员说:)



我已经更新了pylibnet,以便在大多数标题中包含长度字段的自动大小确定。这样,如果您忘记为任何需要它的头指定头的长度,它将尝试自动确定它。省去了找出校验和错误原因的麻烦;)

我已经更新了pylibnet,以便在大多数标题中包含长度字段的自动大小确定。这样,如果您忘记为任何需要它的头指定头的长度,它将尝试自动确定它。省去了找出校验和错误原因的麻烦;)

谢谢。我刚刚通过在接收主机上捕获这些数据包来研究这个问题。接收主机上的校验和也不正确(与发送主机上的捕获中观察到的值相同)。因此,这里的答案似乎不是校验和卸载。如果接收主机实现了标准协议栈,或者两台主机之间至少有一个路由器,则数据包在接收主机上不应该是可见的。还有别的事,谢谢。我刚刚通过在接收主机上捕获这些数据包来研究这个问题。接收主机上的校验和也不正确(与发送主机上的捕获中观察到的值相同)。因此,这里的答案似乎不是校验和卸载。如果接收主机实现了标准协议栈,或者两台主机之间至少有一个路由器,则数据包在接收主机上不应该是可见的。还有别的事,太好了。谢谢你的帮助!太好了。谢谢你的帮助!
import libnet
from libnet.constants import *

net = libnet.context(RAW4, 'venet0:0')
ip = net.name2addr4('www.stackoverflow.com', RESOLVE)
data = 'This is my payload.'
udptag = net.build_udp(len=UDP_H+len(data), sp=54321, dp=54321, payload=data)
packetlen = IPV4_H + UDP_H + len(data)
iptag = net.autobuild_ipv4(len=packetlen, prot=IPPROTO_UDP, dst=ip)

net.write()