boyjimeking 发表于 2012-10-18 21:37

求助TCP数据包乱序问题

本帖最后由 boyjimeking 于 2012-10-18 21:42 编辑

请教一个TCP通信问题!!!!
1)客户端依次发送2个包,为了好记,我标记为1号包,2号包;
2)假设1号包到达服务器的时间戳为0,2号包到达服务器的时间戳为0+2ms;
3)服务器处理单条socket流采用的是单线程异步,所以1号包、2号包会同时被处理;
5)处理1号包耗时4ms,得到1'包,处理2号包1ms,得到2'包;
6)在0+3ms的时候,把2'号包发往客户端,0+4ms的时候把1'号包发往客户端;
7)客户端接收到的包序为2‘ 、 1’

而我期待的收包顺序为1' 2' , 请问这种接收端的乱序问题,有什么成熟的机制来避免吗?

因为某些情况下如果乱序,会导致应用层数据错误。比如:挥刀砍了敌人2刀,产生2个数据包,第一刀敌人没死,第二刀敌人死了,如果第二个包的处理结果先返回来,客户端会播放敌人死亡的动画,倒地变成尸体后收到第一个包的处理结果,就会发生砍尸体现象。

谢谢大家!

251300891 发表于 2013-03-15 16:44

回复 1# boyjimeking


    tcp有个sequence number,tcp重组后,在转发。内核tcp_data_queue()处理了,可以仿照一下

ssffzz1 发表于 2013-03-18 10:34

TCP是自动重组的,无需考虑乱序。UDP需要应用程序自行处理,一般是采用缓存,重排解决。

lifexx 发表于 2016-06-10 17:29

客户端缓存数据包,然后在数据包前面加个4字节tag,收到后重新排序下吧
页: [1]
查看完整版本: 求助TCP数据包乱序问题