TCP粘包拆包原因以及解决办法

粘包、拆包发生原因

1要发送的数据大于TCP缓冲区剩余的大小,发生拆包

2要发送的数据大于MSS(最大报文长度),发生拆包

3要发送的数据小于TCP缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,发生粘包

4接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。等等

粘包、拆包表现形式

现在假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,那么服务端收到的数据可以分为三种,现列举如下:

第一种情况,接收端正常收到两个数据包,即没有发生拆包和粘包的现象,此种情况不在本文的讨论范围内。normal

第二种情况,接收端只收到一个数据包,由于TCP是不会出现丢包的,所以这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理。one

第三种情况,这种情况有两种表现形式,如下图。接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。这两种情况如果不加特殊处理,对于接收端同样是不好处理的。half_oneone_half

粘包、拆包解决办法

1发送端给每个数据包添加一个首部,首部至少包含此次数据包的长度,那么服务端每次按照首部的长度读取

2发送固定长度的数据包,不够的补0

3添加结束标识,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。

4上面三种组合使用

 

HTTP解决方案

我们知道HTTP底层也是包含TCP,那么HTTP采用什么解决方案呢

1HTTP请求头添加结束标识("\r\n")

2HTTP请求体添加数据包长度

 

你可能感兴趣的:(java,HTTP)