tcp粘包问题是实际开发时会遇到的问题,面试官可以用该问题测试应聘者是否真的动手做过网络开发,如果没有实际开发经验,可能不知道这个问题。
一、tcp粘包问题
1、什么是tcp粘包
TCP粘包是指发送方发送的多个数据包被当做一个数据包接收,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
- 粘包可能由发送方造成,也可能由接收方造成。
- 只有TCP有粘包现象,UDP永远不会粘包
- 粘包不一定会发生
也称数据的无边界性,read()/recv() 函数不知道数据包的开始或结束标志(实际上也没有任何开始或结束标志),只把它们当做连续的数据流来处理。
2、粘包原因
出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。
- TCP为提高传输效率,一次发送的数据量太少时,发送端需要等缓冲区满才发送出去,造成粘包(Nagle算法)。
- 接收方不及时接收缓冲区的包,造成多个包接收。
- 拆包也会引起粘包(关于拆包见下面