【问题标题】:Calculate UDP layer checksum计算UDP层校验和
【发布时间】:2014-08-16 06:46:05
【问题描述】:

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

所以我找到了this 函数,它接受一个数组并返回Checksum,但我有两个小问题:

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

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

    编辑:

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

【问题讨论】:

  • 你查过维基百科吗?带有算法和所有内容的漂亮页面。
  • IP 校验和仅使用标头。 TCP/UDP 校验和使用标头和数据。

标签: c# .net packet checksum


【解决方案1】:

您是否尝试将其设置为零?根据 RFC 768,它是可选的。

https://www.rfc-editor.org/rfc/rfc768

“传输的校验和值全为零意味着发送器未生成校验和(用于调试或无关的更高级别协议)。”

如果您真的想计算它,您可以尝试查看 FreeBSD 中的 assemble_udp_ip_header 函数:http://svnweb.freebsd.org/base/head/sbin/dhclient/packet.c?view=markup。

你不应该只用一个 6 字节的数组来调用它,因为校验和过程应该在伪标头上运行。虽然您可能可以使用您在伪标头中提到的函数,但我怀疑它有一个错误,如果长度参数不是偶数,它可以访问数组末尾。

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

【讨论】:

    【解决方案2】:

    那篇文章的作者在他的 cmets 中说

    "...第一个参数是包含 IP Header 数据包的字节数组(已经形成,但校验和字段 [两个字节] 设置为零)。"

    因此您应该将两个校验和字节(字节 7 和 8)设置为零,然后发送您的标头的所有 8 个字节以计算校验和。

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

    【讨论】:

    猜你喜欢
    • 2010-12-01
    • 2010-12-18
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多