NOTE
3.16 数据包协议
1. 粘包拆包是什么 1. 实际数据 2. 粘包现象 3. 拆包现象 2. 出现的原因 TCP有问题是因为她是面向字节流的协议,无法分辨从哪个字节到哪个字节是一条完整的消息 UDP没问题是面向报文的协议,会保留报文之间的分界 首先“粘包”是不存在的,“粘包”这一个词主要是面向低水平或者没有受过比较系
这是历史学习笔记,可能存在过时或不完整的理解。
1. 粘包拆包是什么
- 实际数据
Hello World
Hello World
- 粘包现象
Hello World Hello//第二个包合并到第一个包
World
- 拆包现象
Hello
World Hello World//第一个包拆分到第二个包
2. 出现的原因
TCP有问题是因为她是面向字节流的协议,无法分辨从哪个字节到哪个字节是一条完整的消息 UDP没问题是面向报文的协议,会保留报文之间的分界
首先“粘包”是不存在的,“粘包”这一个词主要是面向低水平或者没有受过比较系统的网络编程学习的读者。 因为 TCP 是没有包这个概念的,都是流。 那么既然没有包这个概念了,那么“粘包”如何谈起?显然包这概念就出现在应用层了( TCP/IP 五层网络模型)。“粘包”本质上就是如何从流里面提取信息出错。导致好像两个信息好像粘连在一起一样。 实际上这是一个解析错误,本质是对二进制数据解析出错。根本不是 TCP 的问题,是应用层的信息解析器写得太烂了。出现解析错误,无法正确处理从 socket 里面读取的数据。
3. 如何处理
- 自定义协议
3.1. 分割符
需要一个个字节读,判断是否分割符
3.2. 长度+数据
* 数据包格式
* +——----——+——-----——+——----——+——----——+——-----——+
* | 包头 | 模块号 | 命令号 | 长度 | 数据 |
* +——----——+——-----——+——----——+——----——+——-----——+
* </pre>
* 包头4字节
* 模块号2字节short
* 命令号2字节short
* 长度4字节(描述数据部分字节长度)