【问题标题】:What is the right approach to checksumming UDP packets校验和 UDP 数据包的正确方法是什么
【发布时间】:2010-03-09 01:00:28
【问题描述】:

我正在用 C# 构建 UDP 服务器应用程序。我遇到了数据包校验和问题。

您可能知道,每个数据包都应该携带一些简单的方法来告诉接收者数据包数据是否完整。

现在,UDP 已经将 2 字节校验和作为标头的一部分,这是可选的,至少在 IPv4 世界中是这样。另一种方法是将自定义校验和作为每个数据包中数据部分的一部分,并在接收器上进行验证。

我的问题归结为:是在 UDP 数据包标头中依赖(可选)校验和,还是将自定义校验和实现作为数据包数据部分的一部分?

也许正确答案取决于具体情况(和往常一样),所以这里的一种情况是,即使代码是在 Windows 上用 .NET 编写和开发的,它可能必须在平台下运行 -独立的 Mono.NET,因此最终的解决方案应该与其他平台兼容。我相信自定义校验和算法很容易移植,但我不太确定第一个。

有什么想法吗?

此外,欢迎对数据包校验和大喊大叫。

【问题讨论】:

    标签: .net mono cross-platform network-programming udp


    【解决方案1】:

    您需要计算错误吗?如果 UDP 校验和错误,那么任何路由器都可能将数据包丢弃,而您将一无所获。

    当然,如果标头中有错误(例如目标 IP 地址),您也不会得到它。

    此外,UDP 校验和算法是完全标准化的,尽管打开或关闭校验和的函数调用确实因平台而异,尽管它通常涉及 setsockopt。

    【讨论】:

    • 路由器不检查校验和;这就是为什么首先关闭它们是有意义的。
    • @Andrew:这是一个过于宽泛的说法,这是它是错误的主要原因。也许大多数路由器不验证校验和,但也有很多。例如,在基于 linux 的路由器中,通常的 netfilter 配置会丢弃校验和错误的数据包。
    • @Andrew:好点,我之前没想过计算错误。答案现在似乎很明显。作为跨平台实施,System.Net.Sockets.SocketOptionName.ChecksumCoverage 似乎在所有平台上都受支持。
    猜你喜欢
    • 2013-08-29
    • 2015-02-23
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2013-04-25
    相关资源
    最近更新 更多