求助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个数据包,第一刀敌人没死,第二刀敌人死了,如果第二个包的处理结果先返回来,客户端会播放敌人死亡的动画,倒地变成尸体后收到第一个包的处理结果,就会发生砍尸体现象。
谢谢大家! 回复 1# boyjimeking
tcp有个sequence number,tcp重组后,在转发。内核tcp_data_queue()处理了,可以仿照一下 TCP是自动重组的,无需考虑乱序。UDP需要应用程序自行处理,一般是采用缓存,重排解决。 客户端缓存数据包,然后在数据包前面加个4字节tag,收到后重新排序下吧
页:
[1]