用了TCP,数据一定不会丢吗

建立连接时会丢包

如果对方全连接或者半连接满了,会拒绝建立请求的

流量控制时丢包

发送数据过快时,超过流控队列 即 内核里面控制数据流量大小的队列 的长度

网卡丢包

Ringbuffer过小会溢出,丢包

网卡处理不过来会丢包

超出对方内核接受缓冲区大小

两端之间网络传输丢包

对于这些丢包现象,采用tcp想协议栈可以解决吗

tcp保证的可靠性只是说保证发送方能可靠地把数据从已方的传输层发到对方的传输层

至于数据到了接收方的传输层后,能不能到应用层,tcp是不管的

假设我们现在用手机给朋友发送一条消息,走到传输层的tcp缓冲区,然后发出,不管中间有没有丢包

最后通过重传保证发到了对方的缓冲区,此时接受端就会回一个ack,然后发送端收到ack后就会把缓存

区里的这一条消息摘掉。到这里tcp的任务就结束了

tcp的任务是结束了,但聊天软件的任务还没结束

聊天软件还需要把消息从tcp缓冲区里读出来,如果在读的时候手机内存不足,程序直接杀死了

但这时候发送端是不可能回重传的

于是乎,消息就丢了么

这个问题其实在两个用户之间加一层服务器中转即可(PS:但有一说一,服务器也会挂 狗头)

对于发送方,只要定时跟服务端的内容对账一下,就知道哪条消息没发送成功,直接重发就好了。

如果接收方的聊天软件崩溃了,重启后跟服务器稍微通信一下就知道少了哪条数据,同步上来就是了,所以也不存在上面提到的丢包情况。

两端通信的时候也能对账,为什么还要引入第三端服务器?

- 第一,如果是两端通信,你聊天软件里有1000个好友,你就得建立1000个连接。但如果引入服务端,你只需要跟服务器建立1个连接就够了,聊天软件消耗的资源越少,手机就越省电。 
- 第二,就是安全问题,如果还是两端通信,随便一个人找你对账一下,你就把聊天记录给同步过去了,这并不合适吧。如果对方别有用心,信息就泄露了。引入第三方服务端就可以很方便的做各种鉴权校验。 
- 第三,是软件版本问题。软件装到用户手机之后,软件更不更新就是由用户说了算了。如果还是两端通信,且两端的软件版本跨度太大,很容易产生各种兼容性问题,但引入第三端服务器,就可以强制部分过低版本升级,否则不能使用软件。但对于大部分兼容性问题,给服务端加兼容逻辑就好了,不需要强制用户更新软件。