2-60 解决粘包、分包问题
粘包原因:
- 当发送的字节数据包比较小且频繁发送时,Socket内部会将字节数据进行粘包处理,既将频繁发送的小字节数据打包成 一个整包进行发送,降低内存的消耗。
- 发送端发送的太快,接收方没有及时接收缓冲区的包,造成多个包一起被接收
分包原因:
- 当发送的字节数据包比较大时(大于缓存剩余空间大小 或者 大于最大报文长度),Socket内部会将发送的字节数据进行分包处理
处理方法:
-
发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
-
发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
-
可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。
https://github.com/surserrr/learn_socket/commit/851a406dc498914c094bb0f821ce8fe41ce1a538