如何通过TCP发送不同间隔生成的同一数据多分段并确保接收端一次性收齐
延迟生成数据分段的TCP传输与完整接收实现方案
TCP本身是面向流的传输协议,不保留应用层的消息边界,因此你需要自行在应用层做封装和聚合逻辑实现需求,核心方案如下:
发送端实现逻辑
- 为每个完整数据分配唯一会话ID,生成的分段先存入对应会话ID的本地缓存队列,不直接发送
- 每个分段携带会话ID、分段序号、总分段数三个标识字段,用于接收端校验聚合
- 确认同一会话的所有分段全部生成完成后,再一次性组装为完整应用层报文发送,报文头部固定加入
magic number(魔数,用于识别报文起始)和完整数据总长度字段,解决TCP粘包拆包问题 - 如果业务场景不允许等全部分段生成再发送,也可以生成一段发一段,只需要保留上述的分段标识字段即可
接收端实现逻辑
- 提前约定应用层报文格式,做TCP流的粘包拆包处理:先读取固定长度的报文头,提取完整数据总长度后,再读取对应长度的载荷,即可拿到完整的一份数据交付上层
- 如果是发送端分段发送的场景,为每个会话ID维护独立的缓存队列,收到分段后按序号排序拼接,直到已缓存的分段数等于报文中的总分段数,再一次性将完整数据交付上层处理
注意事项
- 收发两端都需要增加会话超时清理逻辑,长时间未完成聚合的会话直接销毁,避免内存溢出
- 内核层TCP自动拆分的MSS分段不需要应用层处理,上述应用层的聚合逻辑可以正常覆盖这类场景
内容的提问来源于stack exchange,提问作者Bharath Reddy N
相关产品推荐
相关产品推荐

