平时大家在网络编程过程中可能会遇到这样一种现象:客户端发送了一长串消息,服务端接受的消息揉在一起或者被拆分了,这样就会造成消息难以被正确理解。
比如说有一天你特别想喝奶茶,看了一下外卖,「一点点」的奶茶看着不错,(一点点赶紧给我打钱 doge),于是你在群里发了一条消息,想找几个人拼奶茶:
一点点奶茶有人喝吗?
结果群里同事回了一句:
现在不是已经三点了吗?
你觉得莫名其妙,看了一眼同事的手机,他收到的消息是这样的两行:
一点 点奶茶有人喝吗?
哈哈,讲了一个冷笑话。用专业的术语来说这种现象就是「拆包」了,我们接着往下讲。
TCP 粘包拆包的现象
粘包拆包问题一般是处于应用层下的问题,在数据链路层、网络层以及传输层都有可能发生。我们日常的网络应用开发大多都在传输层进行,因此本文着重讲解传输层粘包拆包问题。
传输层有两个协议我们都很熟悉:UDP 和 TCP,UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP协议中。
下面用一个简单的例子来讲解什么是粘包和拆包。
假设客户端向服务端连续发送了两个数据包,用 packet1 和 packet2 来表示,那么服务端收到的数据可能有四种:
(1)第一种情况,服务端按顺序正常收到两个包,即未出现粘包和拆包的现象。