用了TCP协议就一定不会丢包吗( 五 )


假设现在,我们输入一条消息,从聊天框发出,走到传输层TCP协议的发送缓冲区,不管中间有没有丢包,最后通过重传都保证发到了对方的传输层TCP接收缓冲区,此时接收端回复了一个ack,发送端收到这个ack后就会将自己发送缓冲区里的消息给扔掉 。到这里TCP的任务就结束了 。
TCP任务是结束了,但聊天软件的任务没结束 。
聊天软件还需要将数据从TCP的接收缓冲区里读出来,如果在读出来这一刻,手机由于内存不足或其他各种原因,导致软件崩溃闪退了 。
发送端以为自己发的消息已经发给对方了,但接收端却并没有收到这条消息 。
于是乎,消息就丢了 。
?
使用TCP协议却发生丢包
虽然概率很小,但它就是发生了 。
合情合理,逻辑自洽 。
所以从这里,我铿锵有力的得出结论,我的读者已经回了这位女生消息了,只是因为发生了丢包所以女生才没能收到,而丢包的原因是女生的手机聊天软件在接收消息的那一刻发生了闪退 。
到这里 。女生知道自己错怪她男朋友了,哭着表示,一定要让她男朋友给她买一台不闪退的最新款 。
额 。。。
兄弟们觉得我做得对的,请在评论区扣个"正能量" 。
这类丢包问题怎么解决?
故事到这里也到尾声了,感动之余,我们来聊点掏心窝子的话 。
其实前面说的都对,没有一句是假话 。
但某绿皮聊天软件这么成熟,怎么可能没考虑过这一点呢 。
大家应该还记得我们文章开头提到过,为了简单,就将服务器那一方给省略了,从三端通信变成了两端通信,所以才有了这个丢包问题 。
现在我们重新将服务器加回来 。
聊天软件三端通信
大家有没有发现,有时候我们在手机里聊了一大堆内容,然后登录电脑版,它能将最近的聊天记录都同步到电脑版上 。也就是说服务器可能记录了我们最近发过什么数据,假设每条消息都有个id,服务器和聊天软件每次都拿最新消息的id进行对比,就能知道两端消息是否一致,就像对账一样 。
对于发送方,只要定时跟服务端的内容对账一下,就知道哪条消息没发送成功,直接重发就好了 。
如果接收方的聊天软件崩溃了,重启后跟服务器稍微通信一下就知道少了哪条数据,同步上来就是了,所以也不存在上面提到的丢包情况 。
可以看出,TCP只保证传输层的消息可靠性,并不保证应用层的消息可靠性 。如果我们还想保证应用层的消息可靠性,就需要应用层自己去实现逻辑做保证 。
那么问题叒来了,两端通信的时候也能对账,为什么还要引入第三端服务器?
主要有三个原因 。
第一,如果是两端通信,你聊天软件里有1000个好友,你就得建立1000个连接 。但如果引入服务端,你只需要跟服务器建立1个连接就够了,聊天软件消耗的资源越少,手机就越省电 。
第二,就是安全问题,如果还是两端通信,随便一个人找你对账一下,你就把聊天记录给同步过去了,这并不合适吧 。如果对方别有用心,信息就泄露了 。引入第三方服务端就可以很方便的做各种鉴权校验 。
第三,是软件版本问题 。软件装到用户手机之后,软件更不更新就是由用户说了算了 。如果还是两端通信,且两端的软件版本跨度太大,很容易产生各种兼容性问题,但引入第三端服务器,就可以强制部分过低版本升级,否则不能使用软件 。但对于大部分兼容性问题,给服务端加兼容逻辑就好了,不需要强制用户更新软件 。
所以看到这里大家应该明白了,我把服务端去掉,并不单纯是为了简单 。