其实前面说的都对 , 没有一句是假话 。
但某绿皮聊天软件这么成熟 , 怎么可能没考虑过这一点呢 。
大家应该还记得我们文章开头提到过 , 为了简单 , 就将服务器那一方给省略了 , 从三端通信变成了两端通信 , 所以才有了这个丢包问题 。
现在我们重新将服务器加回来 。
文章插图
聊天软件三端通信
大家有没有发现 , 有时候我们在手机里聊了一大堆内容 , 然后登录电脑版 , 它能将最近的聊天记录都同步到电脑版上 。也就是说服务器可能记录了我们最近发过什么数据 , 假设每条消息都有个id , 服务器和聊天软件每次都拿最新消息的id进行对比 , 就能知道两端消息是否一致 , 就像对账一样 。
对于发送方 , 只要定时跟服务端的内容对账一下 , 就知道哪条消息没发送成功 , 直接重发就好了 。
如果接收方的聊天软件崩溃了 , 重启后跟服务器稍微通信一下就知道少了哪条数据 , 同步上来就是了 , 所以也不存在上面提到的丢包情况 。
可以看出 , TCP只保证传输层的消息可靠性 , 并不保证应用层的消息可靠性 。如果我们还想保证应用层的消息可靠性 , 就需要应用层自己去实现逻辑做保证 。
那么问题叒来了 , 两端通信的时候也能对账 , 为什么还要引入第三端服务器?
主要有三个原因 。
- 第一 , 如果是两端通信 , 你聊天软件里有1000个好友 , 你就得建立1000个连接 。但如果引入服务端 , 你只需要跟服务器建立1个连接就够了 , 聊天软件消耗的资源越少 , 手机就越省电 。
- 第二 , 就是安全问题 , 如果还是两端通信 , 随便一个人找你对账一下 , 你就把聊天记录给同步过去了 , 这并不合适吧 。如果对方别有用心 , 信息就泄露了 。引入第三方服务端就可以很方便的做各种鉴权校验 。
- 第三 , 是软件版本问题 。软件装到用户手机之后 , 软件更不更新就是由用户说了算了 。如果还是两端通信 , 且两端的软件版本跨度太大 , 很容易产生各种兼容性问题 , 但引入第三端服务器 , 就可以强制部分过低版本升级 , 否则不能使用软件 。但对于大部分兼容性问题 , 给服务端加兼容逻辑就好了 , 不需要强制用户更新软件 。
总结
- 数据从发送端到接收端 , 链路很长 , 任何一个地方都可能发生丢包 , 几乎可以说丢包不可避免 。
- 平时没事也不用关注丢包 , 大部分时候TCP的重传机制保证了消息可靠性 。
- 当你发现服务异常的时候 , 比如接口延时很高 , 总是失败的时候 , 可以用ping或者mtr命令看下是不是中间链路发生了丢包 。
- TCP只保证传输层的消息可靠性 , 并不保证应用层的消息可靠性 。如果我们还想保证应用层的消息可靠性 , 就需要应用层自己去实现逻辑做保证 。
最后给大家留个问题吧 , mtr命令是怎么知道每一跳的IP地址的?
推荐阅读
- TCP/IP攻击详细解释
- Office|微软Office平替!开源免费办公软件LibreOffice上新:更好用了
- 冰箱结冰别敲,用一个空瓶就搞定,五分钟冰块往下掉,太实用了
- QQ|QQ没人用了吗?活跃用户只有微信的44%
- IE浏览器|彻底告别IE浏览器:微软即将禁用TLS 1.0/1.1安全协议
- 离婚协议中将自己名下房产赠与子女或他人的约定能否撤销?
- 那么用了乳液还需要用霜吗? 乳液和霜的区别
- 安卓|谷歌宣布:Android 13正式开源 源代码已公开!华为小米等厂商可用了
- 三伏贴用了皮肤红痒怎么办?
- 蓝牙|189元 小米智能多模网关2发布:通吃三大主流通信协议
