UDP - 可选校验和

8

根据我所读的有关UDP的信息,它没有错误处理、没有检查发送/接收的数据序列、没有检查重复数据包、没有检查损坏的数据包,而且显然没有保证发送的数据包甚至被接收...

那么,考虑到这一点,为什么还要在UDP中使用校验和选项呢?因为如果您想确保发送的数据按正确顺序接收(而不是损坏等),那么您应该使用TCP...


1
“不检查损坏的数据包” - 显然,您的阅读是错误的,因为确实有一个校验和来实现这个目的。没有重新发送损坏的数据包的机制,但您至少可以检测到它们并将其丢弃。 - Blorgbeard
@Blorgbeard 哦,好的。所以在UDP中,可选的校验和仅用于检查接收到的数据包是否损坏。没错。非常感谢。 - Supertecnoboff
是的。我刚刚注意到在IPv6中它是不可选的。 - Blorgbeard
@Blorgbeard 有趣 - 每年似乎都是IPv6接管的一年哈哈.. - Supertecnoboff
2个回答

7
UDP数据包包含一个16位CRC校验和字段,接收操作系统将使用该字段来检查数据包是否损坏。如果校验和存在并失败,则数据包将被静默丢弃。应用程序需要注意到数据包消失并采取纠正措施。
UDP校验和在所有现代操作系统上都默认启用。IPv4可以在套接字或操作系统级别禁用UDP校验和。这样做可以减少处理每个数据包时发送方和接收方的CPU开销。例如,如果应用程序单独计算自己的校验和,则可能希望这样做。没有任何校验和,就无法保证接收到的字节与发送的字节相同。

哇,好棒的答案。然而,在IPv6中,校验和是强制性的,所以在这种情况下应用程序别无选择,只能处理它们? - Supertecnoboff
3
该应用程序不处理UDP校验和,通常甚至无法看到它。这在网络层处理,可能发生在操作系统内核、网络驱动程序或网络接口卡中。如果校验和失败,接收方的应用程序将永远看不到该数据包:它会被丢弃。 - Seth Noble
1
有没有一种方法可以禁用IPv6的UDP校验和?(原因是https://tools.ietf.org/html/rfc6935) - Prof. Moriarty
我不知道有任何方法可以禁用IPv6 UDP校验和。请注意,虽然RFC 6935提出了对强制校验规则的例外,但这并不意味着任何特定的网络堆栈都会实现它。我进行了一些搜索,但没有找到ioctl调用或类似的内容,因此我怀疑(但不确定)RFC 6935尚未被广泛实现。如果您发现其他情况,我很感兴趣听听。 - Seth Noble
@Seth,您能否稍微解释一下您在这里所说的“套接字或操作系统级别”的意思? - Alok Maity
根据操作系统和硬件的不同,更改校验和处理可能需要使用 sockopt()、sysctl()、修改内核或更改 NIC 驱动程序设置。 - Seth Noble

3
UDP的任务是传输数据报,即“网络数据包”。对于UDP来说,每个数据包都是独立传输的。如果您发送3个数据包,则对于UDP来说这是三个独立的传输。无论这3个数据包的内容是否相关或它们是否是三个单独的请求(比如DNS请求,其中每个请求都作为单独的UDP数据包发送),UDP都不知道也不关心。UDP保证的是一个数据包要么完整地传输,要么不传输;要么整个数据包到达,要么全部丢失,绝不会出现“半个数据包”到达的情况。因此,如果您只想发送一堆数据包,可以使用UDP。
另一方面,TCP的任务是传输数据流。这与数据包无关,而是关于字节流如何从一个主机传输到另一个主机。例如,TCP如何将数据流分成块并将这些块发送到网络上,并确保不会丢失任何数据并且所有数据都按顺序进行,这由TCP自己处理。TCP所保证的是字节将正确的按顺序到达另一端,除非TCP连接丢失,在这种情况下,数据流会在中途突然结束,但到那时为止到达的所有数据都已经正确地按正确顺序到达了。因此,尽管TCP也使用数据包,但其传输行为类似于没有内部“数据单元”的数据流。当使用TCP发送80字节时,可能有一个包含80字节的数据包或者每个包大小为8字节的10个数据包,或者介于两者之间的任何数值,您无从知晓也不必关心。
但是,仅仅因为您使用UDP并不意味着您不在意UDP数据包中的数据损坏问题。请记住,数据损坏可能不仅会影响您的数据,还可能会影响UDP头本身。如果只有一个比特位发生了交换,则UDP数据包的目标端口可能不正确。因此,它们添加了一种校验和机制,以确保UDP头和数据有效负载都没有损坏,但这是可选的,因此可以由您决定是否使用它。如果使用了校验和机制,则损坏的数据包将被丢弃,因此就像是丢失的数据包一样。如果您的代码处理了丢失的数据包,则自然也会处理损坏的数据包。
不过,在IPv6中,IP头中的校验和被删除了,这意味着IP头的损坏将不再被检测到。但是这被视为小问题,因为大多数第2层协议都有自己的机制来检测数据损坏(例如,Ethernet和WiFi已经保证数据在通过网络时不会损坏),而UDP / TCP的校验和也覆盖了一些IP头字段,因此即使没有第2层错误检查,接收方也会注意到如果IP地址在传输过程中被损坏,则会放弃该数据包。因此,在IPv6中,UDP校验和不再是可选的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接