TCP粘包问题及其解决办法
-
什么是TCP粘包?
TCP粘包问题是指Socket发送端和接收端在进行数据传输时, 多个先后到达接收端的数据包粘在一起, 在接收端缓冲区首尾相连, 形成一个比较大的数据块, 看起来像是一个包。
-
造成TCP粘包问题的原因?
发送端采用了Nagle算法
Nagle算法是TCP默认采用的优化算法, 它会将多个间隔较小, 数据量小的数据, 合并成一个较大的数据块, 然后再进行封包发送 这样做可以减少网络中报文段的数量, 增加数据传输的效率。接收端接收速度大于处理速度
接收端在接收到数据后, 没有立即处理, 造成多个包在缓存中堆积, 首尾相连, 粘在一起 -
如何解决TCP粘包问题?
发送端关闭Nagle算法
使用TCP_NODELAY选项禁用Nagle算法应用层
格式化数据:添加特定的开始符和结束符 发送长度:发送数据之前, 首先发送需要发送数据的长度, 例如发送一个文件时, 首先发送文件信息的数据结构, 接收端根据数据长度判断后续多少字节是相同文件内容实际操作中还数据传输频率不高,数据量不大的情况下我还使用过一种笨方法, 每次传输过一个文件后, 增加一个延迟时间
-
为什么UDP没有粘包问题
TCP面向连接,确保可靠传输,采用基于流的传输,无保护消息边界(保护消息边界:指传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息)
UDP面向消息传输,每条消息是独立的,接收方一次只接收一条独立的消息