目录
粘包:
一次接收到多个消息,粘包
应用进程无法从一个粘包中解析出数据
出现粘包的原因:
①:发送方每次写入数据<内核缓冲区大小;导致多个小的数据包一次性放到一个缓冲区中一起发送了,接收端接收到数据就对导致粘包。
②:接收方读取内核缓冲区不够及时。Tcp接收数据的三个队列并不是实时的,有可能会延时,可能会导致读到多个消息,粘包了。
半包:
一个消息分多次接收,半包
应用进程无法从一个半包中解析出数据
出现半包的原因:
①:发送方写入数据>内核缓冲区大小;
②:发送方数据大小大于MTU,必须拆包。
应用进程是无法从一个粘包、半包中解析出数据的,根本原因是:Tcp是面向字节的,消息无边界的。
应用进程如何解读字节流?如何解决粘包和半包问题?
找出消息的边界
①:固定长度
简单、但是浪费空间,不推荐。
(比如规定每10个字节表示一个消息,但是客户端发送的一个消息里只有1个字节那么剩下的字节就是浪费的,需要补空或者补0)
②:分隔符
简单,空间也不浪费,推荐使用
缺点:数据内容本身出现分隔符时,需要转义,所以需要扫描内容
典型的例子就是HTTP报文:
③:固定长度字段存储内容的长度信息
接收端先解析固定字段,获取长度,然后根据长度读取数据内容。
可以精确定位数据内容,内容不需要转义,推荐
缺点:数据内容长度有限制,需要提前知道可能的最长的消息的字节数