【问题标题】:UDP - Optional ChecksumUDP - 可选校验和
【发布时间】:2014-06-15 22:16:44
【问题描述】:

从我读到的关于 UDP 的内容来看,它没有错误处理,没有检查发送/接收的数据序列,没有检查重复数据包,没有检查损坏的数据包,显然不能保证发送的数据包是偶数收到...

因此,考虑到这一点,为什么地球实际上可以选择在 UDP 中使用校验和?因为如果您想确保以正确的顺序接收正在发送的数据(并且没有损坏等等),那么您肯定会使用 TCP...

【问题讨论】:

  • “不检查损坏的数据包” - 显然,您的读数不正确,因为有 用于此目的的校验和。没有机制可以重新发送损坏的数据包,但您至少可以检测到它们并将它们丢弃。
  • @Blorgbeard 啊,好吧。因此在 UDP 中,可选校验和仅用于检查已接收的数据包是否损坏。正确的。非常感谢你
  • 是的。我也注意到它在 IPv6 中不是可选的。
  • @Blorgbeard 有趣 - 似乎每年都是 IPv6 接管的一年哈哈..

标签: tcp error-handling udp packet checksum


【解决方案1】:

UDP 数据包包含一个 16 位 CRC 校验和字段,接收操作系统将使用该字段检查数据包损坏。如果校验和存在且失败,则数据包将被静默丢弃。由应用程序通知数据包消失并采取纠正措施。

所有现代操作系统默认启用 UDP 校验和。可以在套接字或操作系统级别禁用 IPv4 中的 UDP 校验和。这样做会减少发送方和接收方处理每个数据包的 CPU 开销。例如,如果应用程序单独计算自己的校验和,这可能是可取的。如果没有任何校验和,就无法保证接收到的字节与发送的字节相同。

【讨论】:

  • 哇,答案很好。但是在 IPv6 中校验和是强制性的,所以在这种情况下应用程序别无选择,只能处理它们?
  • 应用程序不处理 UDP 校验和,通常甚至看不到它。这是在网络层处理的,可能发生在操作系统内核、网络驱动程序或网络接口卡中。如果校验和失败,接收应用程序将永远看不到该数据包:它就消失了。
  • 有没有办法禁用 IPv6 的 UDP 校验和? (原因是tools.ietf.org/html/rfc6935
  • 我不知道有什么方法可以禁用 IPv6 UDP 校验和。请注意,虽然 RFC 6935 提出了强制校验和规则的例外情况,但这并不意味着任何特定的网络堆栈都会实施它。我进行了一些搜索,但找不到 ioctl 调用等,因此我怀疑(但不确定)RFC 6935 尚未得到广泛实施。我很想知道您是否发现其他情况。
  • @Seth 你能解释一下你在这里“套接字或操作系统级别”的意思吗?
【解决方案2】:

UDP 的任务是传输数据报,即“网络数据包”。对于 UDP,每个数据包都是它自己的传输。如果您发送 3 个数据包,则这些是 UDP 的三个独立传输。这 3 个数据包的内容是否以某种方式属于一起,或者它们是否是三个单独的请求(想想 DNS 请求,每个请求都作为自己的 UDP 数据包发送),UDP 不知道也不关心。 UDP 所保证的只是一个数据包要么作为一个整体传输,要么根本不传输。无论是整个数据包到达还是整个数据包丢失,您都不会看到“半个数据包”到达。所以如果你只是想发送一堆数据包,你使用UDP。

另一方面,TCP 的任务是传输数据流。这与数据包无关。这是关于字节流以某种方式从一个主机到另一个主机。这是如何发生的,例如TCP 如何将数据流分成块并通过网络发送这些块并确保没有数据丢失并且所有数据都井井有条,这取决于 TCP。 TCP 保证的所有内容是字节将正确且按顺序到达另一端,除非 TCP 连接丢失,在这种情况下,流在中间某处突然结束,但到达该点的所有数据确实到达正确和正确的顺序。因此,尽管 TCP 也处理数据包,但传输行为就像没有内部“数据单元”的流。当通过 TCP 发送 80 字节时,可能有一个 80 字节的数据包或 10 个每个 8 字节的数据包或任何介于两者之间的数据包,您无法知道也不必知道。

但仅仅因为您使用 UDP 并不意味着您不关心 UDP 数据包中的数据损坏。请记住,损坏可能不仅会影响您的数据,还可能会影响 UDP 标头本身。如果只有一个位交换,则 UDP 数据包可能具有不正确的目标端口。因此,他们添加了一个校验和,以确保 UDP 标头和数据有效负载都没有损坏,而是使其成为可选的,因此您是否要使用它取决于您。如果使用,损坏的数据包将被丢弃,因此表现得像丢失的数据包。如果您的代码处理丢失的数据包,它也会自动处理损坏的数据包。

不过,对于 IPv6,校验和已从 IP 标头中删除,这意味着不再检测到 IP 标头损坏。但这被视为一个小问题,因为大多数第 2 层协议都有自己的机制来检测损坏的数据(例如以太网和 WiFi 已经保证数据在通过网络的过程中不会损坏)并且 UDP/TCP 的校验和也涵盖一些 IP 报头字段,因此即使没有第 2 层错误检查,接收方也会注意到报头中的 IP 地址是否已损坏并丢弃数据包。因此,UDP 校验和对于 IPv6 不再是可选的。

【讨论】:

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