TCP粘包拆包问题的解决之道
# 4.1 TCP粘包/拆包
# 4.1.1 TCP粘包/拆包问题说明
TCP协议是”流“协议,流是没有间隔的。tcp会根据缓存大小将业务上的大包划分成多个小包发送出去、也可能多个小包合成一个大包发送出去。
# 4.1.2 TCP粘包/拆包发生的原因
- 应用层:大于套接字接口缓冲区大小
- TCP层:MSS
- IP层:MTU
# 4.1.3 TCP粘包/拆包问题的解决策略
- 消息定长len,例如每个报文固定200字节。那么读取到定长len后就重置计数器开始读取下一个包。
- 包尾加换行符分割,如ftp。
- 消息头+消息体。消息头包含消息长度信息。
- 更复杂的应用协议,如netty.
# 4.3 Netty解决tcp粘包问题
- LineBasedFrameDecoder:原理是遍历ByteBuf中字节,以换行符分割
- StringDecoder:将接收的byte对象转换为字符串,然后调用后面的handler 如果发送的消息不是以换行符结束的,netty也有其他解码器支持。
编辑 (opens new window)
上次更新: 2022/05/22, 00:01:01