计算UDP层校验和

时间:2014-06-25 15:46:12

标签: c# .net packet checksum

我想修改我的数据包并通过网卡发送这些数据包。为此,我需要计算我的UDP层Checksum

所以我发现this函数接受一个数组并返回Checksum,但我有两个小问题:

  1. UDP层有8个字节:2个源端口,2个目标端口,2个长度和2个校验和。 我发现需要用数组调用的函数,所以我应该发送这个函数我的6字节数组有或没有2字节的校验和?

  2. 此函数提到它计算IP校验和,这也适合计算UDP校验和?

    编辑:

  3. 我找到了计算IP / TCP / UDP校验和的this文章,我可以帮助将代码转换成计算UDP校验和到c#中吗?

2 个答案:

答案 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个。