针对三种不同的粘包现象,分包算法分别采取了相应的解决办法。其基本思路是首先将待处理的接收数据流(长度设为m)强行转换成预定的结构数据形式,并从中取出结构数据长度字段,而后根据n计算得到第一包数据长度。

1)若n<m,则表明数据流包含多包数据,从其头部截取n个字节存入临时缓冲区,剩余部分数据依此继续循环处理,直至结束。

2)若n=m,则表明数据流内容恰好是一完整结构数据,直接将其存入临时缓冲区即可。

3)若n>m,则表明数据流内容尚不够构成一完整结构数据,需留待与下一包数据合并后再行处理。

也就是说,n也是数据包中的一部分内容,个人觉得,常见的TCP分包一般都是对应的TCP粘包问题而提出来的。

粘包
TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。粘包可能由发送方造成,也可能由接收方造成。TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据,造成多个数据包的粘连。如果接收进程不及时接收数据,已收到的数据就放在系统接收缓冲区,用户进程读取数据时就可能同时读到多个数据包。因为系统传输的数据是带结构的数据,需要做分包处理。

tcp长连接分包的四种方法
1.消息长度固定
2.使用特殊的字符串作为消息边界。比如http协议的headers以“\r\n”为字段的分隔符
3.在每条消息的头部加一个长度字段。这是最常见的
4.利用消息本身的格式来分包。比如xml中的的配对等