我想修改我的数据包并通过网卡发送这些数据包。为此,我需要计算我的UDP层Checksum
。
所以我发现this函数接受一个数组并返回Checksum
,但我有两个小问题:
UDP层有8个字节:2个源端口,2个目标端口,2个长度和2个校验和。 我发现需要用数组调用的函数,所以我应该发送这个函数我的6字节数组有或没有2字节的校验和?
此函数提到它计算IP校验和,这也适合计算UDP
校验和?
编辑:
我找到了计算IP / TCP / UDP校验和的this文章,我可以帮助将代码转换成计算UDP校验和到c#中吗?
答案 0 :(得分:0)
该帖子的作者在他的评论中说道
“...第一个参数是包含IP Header数据包的字节数组(已经形成,但校验和字段[两个字节]设置为零)。”
因此,您应该将两个校验和字节(字节7和8)设置为零,然后发送标头的所有8个字节以计算校验和。
至于UDP / IP校验和,它们是两个不同的东西,作者说这个计算专门用于IP头校验和创建。
答案 1 :(得分:0)
您是否尝试将其设为零?根据RFC 768,它是可选的。
http://tools.ietf.org/html/rfc768
“全零传输校验和值意味着发送器不生成校验和(用于调试或不关心的更高级别协议)。”
如果您真的想要计算它,可以尝试查看FreeBSD中的assemble_udp_ip_header函数:http://svnweb.freebsd.org/base/head/sbin/dhclient/packet.c?view=markup。
您不应该只使用6字节数组来调用它,因为校验和过程应该在伪标头上运行。虽然您可以使用伪标头上提到的功能,但我怀疑它有一个错误,如果长度参数不均匀,它可以访问数组的末尾。
您计算的校验和不正确,因为它需要在psuedo标头上计算。您缺少协议,IP地址源,IP地址目标和实际有效负载等字段。您也只是写入了您分配的8个字节中的6个。