面试官:用了 TCP 协议,肯定不会丢包( 五 )


大家应该还记得我们文章开头提到过,为了简单,就将服务器那一方给省略了,从三端通信变成了两端通信,所以才有了这个丢包问题 。
现在我们重新将服务器加回来 。
聊天软件三端通信
大家有没有发现,有时候我们在手机里聊了一大堆内容,然后登录电脑版,它能将最近的聊天记录都同步到电脑版上 。也就是说服务器可能记录了我们最近发过什么数据,假设每条消息都有个 id,服务器和聊天软件每次都拿最新消息的 id 进行对比,就能知道两端消息是否一致,就像对账一样 。
对于发送方,只要定时跟服务端的内容对账一下,就知道哪条消息没发送成功,直接重发就好了 。
如果接收方的聊天软件崩溃了,重启后跟服务器稍微通信一下就知道少了哪条数据,同步上来就是了,所以也不存在上面提到的丢包情况 。
可以看出,TCP 只保证传输层的消息可靠性,并不保证应用层的消息可靠性 。如果我们还想保证应用层的消息可靠性,就需要应用层自己去实现逻辑做保证 。
那么问题叒来了,两端通信的时候也能对账,为什么还要引入第三端服务器?
主要有三个原因 。
所以看到这里大家应该明白了,我把服务端去掉,并不单纯是为了简单 。
总结
数据从发送端到接收端,链路很长,任何一个地方都可能发生丢包,几乎可以说丢包不可避免 。
平时没事也不用关注丢包,大部分时候 TCP 的重传机制保证了消息可靠性 。
当你发现服务异常的时候,比如接口延时很高,总是失败的时候,可以用 ping 或者 mtr 命令看下是不是中间链路发生了丢包 。
TCP 只保证传输层的消息可靠性,并不保证应用层的消息可靠性 。如果我们还想保证应用层的消息可靠性,就需要应用层自己去实现逻辑做保证 。