TCP是否确保数据包是由服务器发送的序列接收的

时间:2017-06-05 09:28:00

标签: sockets tcp

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

像服务器一样发送数据包A,B,C 但是客户收到了B,A,C?

我已经阅读了很棒的博客http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/ 似乎服务器发送的每个数据包都有一个客户端对应的确认,但它没有说明为什么客户端收到的数据包与服务器具有相同的序列

2 个答案:

答案 0 :(得分:1)

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

  

可靠通信:TCP连接上发送的数据流可靠且可靠地传送     在目的地订购。

答案 1 :(得分:1)

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

  

TCP必须从因特网通信系统损坏,丢失,重复或无序传送的数据中恢复。这是通过为发送的每个八位字节分配序列号来实现的,并且需要来自接收TCP的肯定确认(ACK)。如果在超时间隔内未收到ACK,则重新传输数据。在接收器处,序列号用于正确地排序可能无序接收的段并消除重复。通过向传输的每个段添加校验和,在接收器处检查并丢弃损坏的段来处理损坏。

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

为了完整起见,我还会在你更详细地描述上面引用的部分之后再引导你注意第2.6节:

  

TCP的确认不保证数据已经交付给最终用户,而只是接收TCP负责这样做。

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