【问题标题】:How do TCP and UDP detect transmission errors?TCP 和 UDP 如何检测传输错误?
【发布时间】:2015-04-10 18:36:28
【问题描述】:

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

【问题讨论】:

    标签: network-protocols


    【解决方案1】:

    可能会出现不同的错误:

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

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

    数据损坏

    只有在每个数据包的标头中都使用了校验和字段时,UDP 才能防止数据包内的数据损坏。基本上,它需要标头、数据包内容和更多信息(如 IP 地址),将其解释为一长串 16 位字的反码并将它们总结 UDP checksum

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

    所有其他问题

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

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

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

    【讨论】:

      【解决方案2】:

      IP protocol 级别(UDP 和 TDP 都基于此),有一个校验和来确认数据包的内容是有效的。但是,在某些情况下,此校验和检测到某些错误。

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

      【讨论】:

      • TCP是面向连接的协议,而IP是无连接的协议,TCP如何基于IP?
      • 我推荐Transmission Control Protocol 的文章,或者关于这个主题的好书(例如TCP/IP Illustrated)。
      • 正如我在下面的回答中提到的,这取决于 IP 协议的版本。当 TCP 在 IPv4 上运行时,用于计算校验和的方法定义在 tools.ietf.org/html/rfc793
      • IP 级别校验和仅检查 IP 标头中的错误。
      【解决方案3】:

      如果我从各种课程中回忆起,Greg 将校验和作为少数数据验证来源之一是正确的。但是,UDP(按原样设计)并不总是 100% 可靠。这使得它非常适合流数据(例如网络摄像头),因为丢失一帧并不是什么大问题。虽然这将被视为 TCP 中的错误(然后必须重新发送帧,延迟所有后续帧),但 UDP 并不真正关心,除非它被配置为。

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

      【讨论】:

        猜你喜欢
        • 2012-03-07
        • 1970-01-01
        • 2020-08-21
        • 1970-01-01
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 2011-04-19
        • 2012-05-18
        相关资源
        最近更新 更多