【问题标题】:Does TCP ensure packet is received by sequence that server send itTCP是否确保数据包按服务器发送的顺序接收
【发布时间】:2017-06-05 09:27:59
【问题描述】:

我正在开发一个与游戏客户端通信的游戏服务器,但想知道当客户端收到数据包服务器发送到客户端时是否保持顺序?

像服务器发送数据包 A,B,C 但客户收到 B,A,C 吗?

我已经阅读了很棒的博客http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/ 好像服务端发送的每一个包都有一个客户端对应的ack,但是并没有说明为什么客户端收到的包和服务端的顺序是一样的

【问题讨论】:

  • @PSkocik 你的意思是单个 TCP 数据包可能会被拆分为多个没有顺序保证的 IP 数据报,并且它会被正确重组为原始 TCP 数据包?
  • 不一定。它同样适用于整个细分市场。
  • NB 引用质量差。三次握手并不“臭名昭著”,至少在引文中没有任何令人信服的理由。 “TCP 会话任一侧的客户端”在术语上是矛盾的。那里没有任何东西可以真正回答您的问题。

标签: sockets tcp


【解决方案1】:

值得一读TCP's RFC,尤其是第 1.5 节(操作),它解释了这个过程。在某种程度上,它说:

TCP 必须从 Internet 通信系统损坏、丢失、复制或乱序传送的数据中恢复。这是通过为每个传输的八位字节分配一个序列号并要求接收 TCP 的肯定确认 (ACK) 来实现的。如果在超时间隔内没有收到 ACK,则重新传输数据。在接收端,序列号用于正确排序可能被乱序接收的段并消除重复。损坏的处理方法是向传输的每个段添加校验和,在接收器处对其进行检查,然后丢弃损坏的段。

我看不出它在哪里明确,但由于确认(如第 2.6 节所述)描述了下一个预期的数据包,因此接收 TCP 实现只会确认连续的数据包序列从一开始就。也就是说,如果您从未收到第一个数据包,则您永远不会发送确认,即使您已收到消息中的所有其他数据包;如果您收到了 1、2、3、5 和 6,您只承认 1-3。

为了完整起见,在更详细地描述了上面引用的部分之后,我还要再次将您的注意力引向第 2.6 节:

TCP 的确认并不能保证数据已交付给最终用户,而只能保证接收方 TCP 承担了这样做的责任。

因此,TCP 确保数据包的顺序,除非应用程序没有收到它们。除了应用程序不可用的情况外,该异常可能并不常见,但这确实意味着应用程序不应假设成功发送等同于成功接收。 可能出于各种原因,但它明确超出了协议的范围。

【讨论】:

    【解决方案2】:

    TCP 保证字节流的顺序和完整性。您不会收到乱序的数据。来自RFC 793

    可靠的通信:在 TCP 连接上发送的数据流可靠且以 在目的地下单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-29
      • 2022-08-18
      • 1970-01-01
      • 2017-12-28
      • 2013-06-07
      • 2018-08-25
      • 1970-01-01
      • 2017-11-16
      相关资源
      最近更新 更多