关注△mikechen的架构笔记△,十余年BAT架构经验倾囊相授
大家好,我是mikechen。
掌握TCP粘包不仅有助于提高网络通信的质量和性能,而且大厂也喜欢考察,下面我重点详解TCP粘包的原因以及解决方案@mikechen
最新mikechen原创超30万字《阿里架构师进阶专题合集》和《最全大厂面试题及答案总结》,请关注本公众号【mikechen的架构笔记】,后台回复:资料,即可领取。
什么是TCP粘包
TCP传输是一种面向字节流的方式,最大的优点就是使用方便,我们可以直接以字节为单位进行操作,但也带来了一个最大的问题:粘包。
TCP粘包是指在TCP通信中,发送端将多个小数据包合并成一个或更少的数据包,然后发送到接收端,从而导致接收端难以正确解析和处理这些数据包的现象。
下面用一个简单的例子来讲解什么是粘包:
假设客户端向服务端连续发送了两个数据包,用 packet1 和 packet2 来表示。
第一种情况,服务端按顺序正常收到两个包,即未出现粘包和拆包的现象。
如下图所示:
第二种情况,服务端只收到一个数据包,由于 TCP 保证送达的特性,所以这一个数据包包含了客户端发送的两个数据包的信息,这种现象就是粘包。
如下图所示:
粘包问题通常发生在网络通信中,尤其是在数据发送频繁的情况下。
TCP粘包的原因
出现TCP粘包的原因,主要包含如下3点:
1.发送方连续发送数据
如果发送方快速发送多个小数据包,TCP协议可能会将它们合并成一个大的数据包,以提高传输效率。
2.接收方读取不及时
如果接收方没有及时读取接收缓冲区中的数据,数据可能会积累,导致多个数据包合并成一个粘包。
3.操作系统的TCP缓冲区大小限制
操作系统的TCP缓冲区大小有限,当缓冲区满时,新的数据包必须等待,这可能导致粘包问题。
TCP粘包的解决方案
1.固定长度消息
确保每个消息具有固定的长度,这样接收方可以根据消息长度来划分数据。
比如:发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度。
这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
如下图所示:
在每个包前面加上包的实际长度。
2.消息边界标记
在传输的数据中加入消息边界标记,如特殊字符、长度前缀或结束标志,以帮助接收方正确划分消息。
这样,接收端通过这个边界就可以将不同的数据包拆分开。
如下图所示:
在每个包的后面加上特殊字符:/。
3.发送端将每个数据包封装为固定长度
不够的可以通过补0填充,这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
下图每个包的固定长度为 4,接收端很容易进行区分。
4.使用Nagle算法
Nagle算法可以用于抑制小数据包的发送,减少粘包问题的发生。但要小心使用,以免增加延迟。
TCP粘包总结
TCP粘包是网络通信中常见的问题,可能导致接收方无法正确处理数据。
解决TCP粘包问题需要根据具体情况选择适当的方法,例如添加消息边界标记、设计应用层协议、使用缓冲区等。
选择解决方案时需要考虑应用程序的通信模式和数据格式,以确保数据能够被正确划分和处理。
以上
最后送大家一个福利:
送我原创超30万字阿里架构师进阶专题合集。
以及给大家整理最全大厂Java面试题及答案详解,包含:Java、多线程、JVM、Spring、MySQL、Redis、中间件...等必考题答案详解。
需要以上架构专题&面试答案的同学,加我微信即可领取!
添加时备注:资料