1

我正在使用 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

我在这里做错了吗?

4

3 回答 3

3

这与 tcpdump 错误或校验和卸载无关。Libnet 也在用户模式下计算校验和(仅供参考)。问题与您没有为 UDP 标头指定长度这一事实有关。这不是在 pylibnet 或 libnet 中自动计算的,因此您必须暂时指定它。以下是您的代码的更正版本。我将为 pylibnet 应用一个补丁来自动检测 rc6 中的标头长度。请继续关注http://sourceforge.net/projects/pylibnet以获取更新。我将推出一个新版本来解决这个问题。顺便说一句,如果您有错误或功能请求,请随时通过 sourceforge 的 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()
于 2010-01-15T13:21:33.103 回答
1

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

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

http://wiki.wireshark.org/TCP_Checksum_Verification

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

另见http://www.wireshark.org/docs/wsug_html_chunked/ChAdvChecksums.html#id4744523

于 2009-12-14T21:52:58.847 回答
1

I have updated pylibnet to include an auto size determination for the length fields in most headers. This way if you forget to specify the length of the header for any of the headers that require it, it will attempt to automagically determine it. Saves you the headache of figuring out why your checksum is bad;)

于 2010-01-22T03:41:35.507 回答