一个导致TCP数据乱序的问题

15 篇文章 1 订阅

众所周知,TCP是面向连接的可靠的流数据传输方式, 有应答确认机制和重传机制,一般不会丢失数据,或数据顺序颠倒。

【但是考虑下面这种情况:】

Client端socket的send buffer满了(可能是因为没有及时收到应答,也可能是因为数据量太大,buffer size太小), 这时候send fail, Client端因此断开连接,并且我们设计了重连的机制, Client端马上新建一个socket并与服务端建立连接,继续send新的数据。

连接重新建立后,Server端开始收到最新的数据和旧的socket buffer中的旧数据。 在Server端观察到,有些旧数据会比新数据更晚收到。 确实有这种情况,但是很难模拟出来。

分析原因为,旧连接断开后,在socket buffer中的旧数据的仍然会被发送到Server端, 并且Server端仍能接收(此时Server端应该处于CLOSE_WAIT状态), 而新连接的数据也同时发到服务端, 由于旧连接的socket buffer中堆积了太多数据,可能导致有些旧的数据会比新的数据晚到达Server端。

所以说,TCP只能保证单个连接的数据有序性和完整性,在有断开和重连的情况下不能保证。 这一点需要开发者注意, 当在应用层需要严格要求数据有序性时应避免或能够应对这种情况。(主要还是因为数据量太大了)

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值