外观
Socket 为什么会出现粘包和拆包?
标准回答
TCP 提供有序可靠字节流,但一次 send 不对应一次 read。接收方必须用长度字段、分隔符或固定长度等协议规则还原完整消息。
关键机制
- 常见帧结构:魔数、版本、消息类型、请求编号、长度、负载、校验字段;根据产品需要裁剪。
- 读取时先放入缓冲区,够一个包再解析;不够继续等,多出来的部分留给下一个包。必须限制声明长度。
- 心跳检查应用层存活;断线重连用退避并设置上限;重发命令要靠请求编号和幂等控制重复执行。
通俗例子
设备发两条温度消息,手机一次 read 可能读到一条半。先解析完整的一条,把剩余半条保留,等下次字节到达再拼。
易混淆点
TCP 确认表示传输层可靠接收,不等于远端业务已经执行;需要业务 ACK 才能确认命令结果。
参考资料
内容来源
- Android 技术札记 · 原条目
socket