UDP - 可选校验和

时间:2014-04-29 19:38:13

标签: tcp error-handling udp packet checksum

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

所以考虑到这一点,为什么地球实际上有一个选项在UDP中使用校验和?因为当然如果你想确保以正确的顺序接收正在发送的数据(而不是损坏等等),那么你会使用TCP ......

感谢您的时间:)

2 个答案:

答案 0 :(得分:3)

UDP数据包包括一个16位CRC校验和字段,接收操作系统将使用该字段来检查数据包损坏。如果校验和存在且失败,则将以静默方式丢弃数据包。应用程序需要注意数据包消失并采取纠正措施。

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

答案 1 :(得分: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不再是可选的。