默认
发表评论 3
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
求教基于TCP协议的IM系统中消息收发时序的疑惑
阅读(62276) | 评论(3 收藏 淘帖1
5金币
假设Server发送了1,2,3,客户端可能接受到3,2,1的组合,反正就是接受的顺序不一定就是发送的顺序,关于这个问题,站里的相关文章:
零基础IM开发入门(四):什么是IM系统的消息时序一致性?说到假设1对1的情况下也不能保证收发顺序,那我就很有疑问了。
TCP本来就是有序列号,为了解决IP无序的问题,由此又会带来了对头阻塞的问题,其实就是纠正收发顺序。
我的理解是假设Server发送了1,2,3,接受到先接受到3,2的话,会等到1之后,纠正了顺序才会交给应用层,那实际上为什么还是保证不了顺序?

标签:求助 IM开发
上一篇:求助P2P打洞:peer两边都是端口受限Port Restricted Cone NAT下的打洞疑问下一篇:关于使用protobuf协议的websocket的抓包解析问题

本帖已收录至以下技术专辑

推荐方案
评论 3
文章里说的乱序,其实是应用层的乱序。

TCP协议这一层肯定是有序的,但应用层因为异步、并发等等情况,放入TCP协议栈的业务数据本身就是乱序的,tcp协议栈一层当然是无感知的。
TCP协议它只保证把你业务层放入的数据,按帧序发过去,到于应用层是不是没按业务顺序放入,它没办法控制,想想就明白了。
引用:JackJiang 发表于 2021-01-16 23:54
文章里说的乱序,其实是应用层的乱序。

TCP协议这一层肯定是有序的,但应用层因为异步、并发等等情况, ...

一般情况下,客户端都会有只用一条线程去处理收到的数据,那么这里就不存在并发的问题,因为是单线程处理,假设Server是按顺序发送数据的话,客户端又是单线程处理接收到的消息,就不存在乱序问题了吧?
引用:cyc 发表于 2021-01-17 11:12
一般情况下,客户端都会有只用一条线程去处理收到的数据,那么这里就不存在并发的问题,因为是单线程处理 ...

乱序一般是服务端造成的,因为im的服务端都讲究高吞吐、高并发、异步,这些性能指标跟顺序本身就是矛盾的,而且成熟的系统里,加上关键词过滤等等处理,异步、高并发的情况下是很有可能发生乱序的
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部