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

6

我想知道这些协议如何检测到在数据传输过程中发生的错误?谢谢。

3个回答

8

可能会发生不同的错误:

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

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

数据损坏

如果在每个数据包的头部使用校验和字段,则UDP仅对数据包内部数据的损坏具有抵抗力。基本上,它将头部、数据包内容和更多信息(如IP地址)解释为16位字的长列表,并将它们加起来 UDP校验和

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

其他所有问题

TCP为每个数据包都分配了序列号。序列号是针对字节的,因此如果发送方说“这是序列号为102的数据包”,他就表示发送的数据包以流中的第102个字节开始。然后接收者发送确认给发送者。例如,如果数据包长度为10个字节,则接收者将发送一个带有序列号112的Ack,这意味着“我期望接收到的下一个数据包以序列号112开始”。任何具有不同序列号的数据包都是重复(太低)、数据包丢失(接收到的序列号太高)或幻象数据包(预期序列号与接收到的序列号完全不匹配)。因此,在所有序列号不匹配的情况下,接收者都知道出了什么问题,并可以做出反应(与不同的TCP版本有所不同)。

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

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


2
在基于IP协议的UDP和TDP级别上,存在一个校验和以确认数据包内容的有效性。但是,在某些情况下,这个校验和无法检测出特定的错误。
通常在更高的层次(例如在传输文件时),会对文件内容进行更强大的哈希计算。这可以在整个文件或某些大小的文件块上完成(通常比单个IP数据包大得多)。

TCP是一种面向连接的协议,而IP是一种无连接的协议,那么TCP如何基于IP呢? - user472221
我推荐阅读传输控制协议文章,或者一本好的相关书籍(例如:TCP/IP详解)。 - Greg Hewgill
如下所述,这取决于IP协议的版本。当TCP运行在IPv4上时,计算校验和的方法在http://tools.ietf.org/html/rfc793中定义。 - Lars Tackmann
4
IP层校验和只检查IP头部是否存在错误。 - Giacomo Verticale

1

如果我回想起来各种课程的话,Greg 在校验和作为数据验证的几个来源之一方面是正确的。然而,UDP(设计方式)并不总是100%可靠。这使得它非常适合流媒体数据(例如网络摄像头),因为丢失一帧并不是很大的问题。虽然在TCP中这将被视为错误(然后必须重新发送该帧,延迟所有后续帧),但UDP实际上并不关心,除非它被配置为。

假设需要接收所有数据,则请求方的协议确保要求发送每个数据包,通常按顺序。校验和在此处发挥作用,因为然后检查每个部分以确保其正确性(当数据部分错误偶数次时会出现小问题,因为校验和可能会产生误报,但这种情况非常罕见)。每次某个部分失败时,都会重新请求,直到它被接收并且校验和给出了肯定的反馈。当每个部分被接收时,接收方的协议会响应发送方,表示一切正常。如果发送方在某个时间限制内未收到此响应,则会重新发送数据包。


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