2014-06-25 281 views
-1

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

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

  1. UDP层具有8个字节:2源端口,2目的端口,2长度和2校验和。 我找到的函数需要用数组调用,那么我应该发送这个函数我的6字节数组有没有2字节校验和?

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

    编辑:

我发现this一篇文章,计算IP/TCP/UDP校验和,我可以帮助转换代码计算UDP校验到C#?

+0

您是否检查维基百科?与algos和所有的好页面。 – TomTom

+0

是的,我检查了 – user3637066

+0

IP校验和只使用头。 TCP/UDP校验和使用标题和数据。 – clcto

回答

0

该帖子的作者说,在他的评论

” ......的第一个参数是包含IP报头分组的字节阵列(已经形成的,但与所述校验和字段设置为零[两个字节])。 “

所以你应该设置两个校验和字节(字节7和8)为零,然后发送头的全部8个字节来计算校验和。

至于UDP/IP校验和,它们是两个不同的东西,作者声明这个计算专门用于IP头校验和创建。

+0

所以我可以使用此功能的UDP校验? – user3637066

+0

不可以。如最后一句所述,作者说这是IP头校验和。这无疑会为UDP校验和产生错误的值。请参阅此SO帖子,了解有关UDP校验和的信息:http://stackoverflow.com/questions/1480580/udp-checksum-calculation – GEEF

+0

请参阅我的更新 – user3637066

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字节的数组来调用它,因为校验和过程应该在伪头上运行。虽然你可以使用你在伪头文件中提到的函数,但是我怀疑它有一个错误,即如果length参数不是偶数,它可以访问数组的末尾。

您计算的校验和不正确,因为它需要在psuedo头上计算。您缺少诸如协议,IP地址源,IP地址目标以及实际有效负载等字段。你也只写了你分配的8个字节中的6个。

+0

请参阅我的更新 – user3637066