【发布时间】:2015-04-10 18:36:28
【问题描述】:
我想知道这些协议是如何检测到数据传输过程中发生错误的? 谢谢
【问题讨论】:
我想知道这些协议是如何检测到数据传输过程中发生错误的? 谢谢
【问题讨论】:
可能会出现不同的错误:
UDP 仅提供一种机制来克服数据损坏(这是 IPv4 中的可选功能,在 IPv6 中是强制性的)。
数据损坏
只有在每个数据包的标头中都使用了校验和字段时,UDP 才能防止数据包内的数据损坏。基本上,它需要标头、数据包内容和更多信息(如 IP 地址),将其解释为一长串 16 位字的反码并将它们总结 UDP checksum。
TCP 有类似的方法来解决数据损坏问题。
所有其他问题
TCP 对每个数据包都有所谓的序列号。序列号寻址字节,因此如果发送者说“这是序列号为 102 的数据包”,他说,他发送的数据包从流的字节 102 开始。接收方然后向接收方发送和确认。例如,如果数据包的长度为 10 字节,则接收方将以序列号 112 发送和确认,这意味着“我希望接收到的下一个数据包以序列号 112 开始”。每个具有不同序列号的数据包要么是重复的(太低),要么是丢失的数据包(接收到的序列号太高),或者是幻像(预期序列号与接收到的序列号完全不匹配)。因此,在所有序列号不匹配的情况下,接收方都知道出了问题并可以做出反应(与不同的 TCP 版本不同)。
发送者等待接收者的确认。如果他在一段时间内没有收到预期的确认,他将重新传输数据包,因为他假设数据包在途中丢失了。
这只是一个非常简短的解释。这个话题比这里描述的要大一些;)
【讨论】:
在IP protocol 级别(UDP 和 TDP 都基于此),有一个校验和来确认数据包的内容是有效的。但是,在某些情况下,此校验和未检测到某些错误。
通常在更高级别(例如传输文件时),会根据文件内容计算出更强大的哈希值。这可以在整个文件上完成,也可以在文件的某些大小的单个块上完成(通常比单个 IP 数据包大得多)。
【讨论】:
如果我从各种课程中回忆起,Greg 将校验和作为少数数据验证来源之一是正确的。但是,UDP(按原样设计)并不总是 100% 可靠。这使得它非常适合流数据(例如网络摄像头),因为丢失一帧并不是什么大问题。虽然这将被视为 TCP 中的错误(然后必须重新发送帧,延迟所有后续帧),但 UDP 并不真正关心,除非它被配置为。
如果需要接收所有数据,请求方的相关协议会确保请求发送每个数据包,通常是按顺序发送。校验和在这里发挥作用,因为然后检查每个部分以确保它是正确的(当数据部分错误偶数次时的小问题,因为校验和可能会引发误报,但这非常罕见)。每次部件失败时,都会重新请求它,直到它被接收并且校验和竖起大拇指。当每个部分都被接收到时,接收方的协议会向发送方回应一切都很酷。如果发送方在某个时间限制内没有收到此响应,它会重新发送数据包。
【讨论】: