TCP 粘包与队首阻塞
粘包现象如何产生?
- 根因: TCP 面向字节流, 发送方可能把多次写入合并发送, 也可能把一次写入拆分发送;
- 表现: 接收端读到的是连续字节流, 无法自行辨别某段字节属于哪个应用层消息;
粘包有哪些处理方法?
| 方法 | 做法 | 代价 |
|---|---|---|
| 长度控制 | 在消息头部声明长度, 按长度读取 | 需要固定的长度字段 |
| 特殊字符 | 在消息末尾放置分隔符, 按分隔符切分 | 内容中出现该字符需转义 |
| 消息头 | 添加特殊标记, 按标记辨别消息 | 需要自定义协议 |
队首阻塞为什么发生在运输层?
- 机制: TCP 用滑动窗口实现流水线, 窗口队首字节丢失会阻止窗口向右移动;
- 后果: 后续已到达的字节无法交付给应用, 称为队首阻塞 (HOL);
- 位置: HOL 作用于运输层, 应用程序对此完全不可知, 只能感知到读取延迟;
抖动从何而来?
- 来源: 分组到达时间不可预知;
- 表现: 应用通过套接字读取数据时, 每次可读到的数据量与间隔都不稳定;