跳到主要内容

TCP 粘包与队首阻塞

粘包现象如何产生?​

  • 根因: TCP 面向字节流, 发送方可能把多次写入合并发送, 也可能把一次写入拆分发送;
  • 表现: 接收端读到的是连续字节流, 无法自行辨别某段字节属于哪个应用层消息;

粘包有哪些处理方法?​

方法做法代价
长度控制在消息头部声明长度, 按长度读取需要固定的长度字段
特殊字符在消息末尾放置分隔符, 按分隔符切分内容中出现该字符需转义
消息头添加特殊标记, 按标记辨别消息需要自定义协议

队首阻塞为什么发生在运输层?​

  • 机制: TCP 用滑动窗口实现流水线, 窗口队首字节丢失会阻止窗口向右移动;
  • 后果: 后续已到达的字节无法交付给应用, 称为队首阻塞 (HOL);
  • 位置: HOL 作用于运输层, 应用程序对此完全不可知, 只能感知到读取延迟;

抖动从何而来?​

  • 来源: 分组到达时间不可预知;
  • 表现: 应用通过套接字读取数据时, 每次可读到的数据量与间隔都不稳定;