TCP和UDP如何检测传输错误?

问题描述 投票:0回答:3

这些协议如何检测数据传输过程中发生的错误?

network-protocols
3个回答
8
投票

可能会出现不同的错误:

  • 数据包顺序不正确
  • 数据包丢失
  • 数据包内的数据损坏
  • 幻像数据包(接收方收到从未发送过的数据包)

UDP 仅提供一种克服数据损坏的机制(这是 IPv4 中的可选功能,在 IPv6 中是强制的)。

数据损坏

UDP 仅在每个数据包的标头中使用校验和字段的情况下才能抵抗数据包内部数据的损坏。基本上它需要标头、数据包内容和一些更多信息(如 IP 地址),将其解释为一长串 16 位单词补码,并将它们相加 UDP 校验和

TCP 有类似的方法来解决数据损坏问题。

所有其他问题

TCP 对于每个数据包都有所谓的序列号。序列号寻址字节,因此如果发送者说“这是序列号为 102 的数据包”,他说,他发送的数据包以流的字节 102 开始。然后接收方向接收方发送确认。例如,如果数据包的长度为 10 个字节,则接收方将发送序列号为 112 的 Ack,这意味着“我希望接收到的下一个数据包以序列号 112 开始”。每个具有不同序列号的数据包要么是重复的(太低),要么是数据包丢失(接收到的序列号太高),要么是幻像(预期序列号与接收到的序列号完全不匹配)。因此,在所有序列号不匹配的情况下,接收方都知道出现问题并可以做出反应(与不同的 TCP 版本不同)。

发送方等待接收方的确认。如果他在一段时间内没有收到预期的确认,他将重新传输数据包,因为他认为数据包在途中丢失了。

这只是一个非常简短的解释。这个主题比这里描述的要大一些;)


2
投票

IP协议级别(UDP和TDP均基于该协议),有一个校验和来确认数据包的内容是否有效。然而,在某些情况下,此校验和无法检测到某些错误。

通常在较高级别(例如传输文件时),会对文件内容计算出更稳健的哈希值。这可以在整个文件上完成,也可以在某个大小的文件的各个块上完成(通常比单个 IP 数据包大得多)。


1
投票

如果我记得在各个课堂上,格雷格(Greg)将校验和作为数据验证的几个来源之一是正确的。然而,UDP(按其设计方式)并不总是 100% 可靠。这使得它非常适合流数据(例如网络摄像头),因为丢失一帧并不是什么大问题。虽然这在 TCP 中被认为是一个错误(然后必须重新发送帧,延迟所有后续帧),但 UDP 并不真正关心,除非它被配置为。

如果需要接收所有数据,请求方的相关协议会确保请求发送每个数据包,通常是按顺序发送。校验和在这里发挥作用,因为然后检查每个部分以确保其正确(当数据部分错误偶数次时出现小问题,因为校验和可能会抛出误报,但这种情况非常罕见)。每当一个部件失败时,就会重新请求它,直到它被接收并且校验和竖起大拇指。当接收到每个部分时,接收方的协议会向发送方回复一切都很好。如果发送方在一段时间内没有收到此响应,则会重新发送数据包。

© www.soinside.com 2019 - 2024. All rights reserved.