Netty进阶:粘包、半包

现象分析

粘包

  • 现象
    • 发送 abc def ,接收 abcdef
  • 原因
    • 应用层:接收方 ByteBuf 设置太大(Netty 默认 1024)
  • 传输层-网络层
    • 滑动窗口:假设发送方 256 bytes 表示一个完整报文,但由于接收方处理不及时且窗口大小足够大(大于256 bytes ),这 256 bytes 字节就会缓冲在接收方的滑动窗口中,当滑动窗口中缓冲了多个报文就会粘包
    • Nagle算法:会造成粘包

半包

  • 现象
    • 发送 abcdef ,接收 abc def
  • 原因
    • 应用层:接收方 ByteBuf 小于实际发送数据量
    • 传输层-网络层
      • 滑动窗口:假设接收方的窗口只剩了128 bytes,发送发的报文大小是256 bytes,这时接收方的窗口无法容纳发送方的全部报文,发送方只能先发送前128 bytes,等待ack后才能发送剩余部分,这就造成了半包
    • 数据链路层
      • MSS限制:当发送的数据超过MSS限制后,会将数据切分发送,这就造成了半包

本质

发生粘包、半包现象的本质是因为TCP是流式协议,消息无边界

后续的代码小编已经上传至git仓库了,并做了版本管理,不会在文章中贴出简单的代码了,当然比较重要的代码还是会贴出来的,需要完整代码的同学,可以关注【空谷有来人】微信公众号或者私信博主索要。

持续关注,后续更精彩

你可能感兴趣的:(Netty,java,it,网络,tcp/ip,Netty)