04-Netty网络程序优化

本文详细介绍了TCP粘包/拆包现象及其原因,并探讨了Netty如何通过各种解码器来解决这个问题。同时,讨论了Netty的二次编码,包括一次编解码和二次编解码的原理与应用场景。此外,提到了Netty的心跳机制和长连接的优势,以及零拷贝技术在提升网络传输效率中的作用。

文章放置于:https://github.com/zgkaii/CS-Study-Notes,欢迎批评指正!

TCP 粘包/拆包

什么是 TCP 粘包/拆包?有什么解决办法呢?

TCP 粘包/拆包 就是你基于 TCP 发送数据的时候,出现了多个字符串“粘”在了一起或者一个字符串被“拆”开的问题。我们发送两条消息:ABC 和 DEF,可能一次就把两条消息接收完了,即 ABCDEF;也可能分成了好多次,比如 AB、CD 和 EF。

对方一次性接收了多条消息这种现象,我们就称之为粘包现象

对方多次接收了不完整消息这种现象,我们就称之为拆包现象

为什么会出现粘包 / 拆包?

粘包

TCP 发送消息的时候是有缓冲区的,当消息的内容远小于缓冲区的时候,这条消息不会立马发送出去,而是跟其它的消息合并之后再发送出去,这样合并发送是明显能够提高效率的。但是,对方接收到的消息就是一个粘包,无法有效区分出来到底是几条消息。当然,接收消息也是会通过 TCP 的缓冲区的,如果接收方读取得不及时,也有可能出现粘包现象

可见,出现粘包的原因无非两种:

  • 发送方每次写入数据 < 套接字缓冲区大小
  • 接收方读取套接字缓冲区数据不够及时

拆包

类比粘包,如果发送的消息太大,已经超过了缓冲区的大小,这时候就必须拆分发送,也就形成了拆包现象。还有一种情况,网络协议各层是有最大负载的,所以,对应到各种协议它们是有最大发送数据的限制的,这种可以发送的最大数据称作 MTU(Maximum Transmission Unit,最大传输单元)。

可见,出现拆包的原因有两种:

  • 发送方写入数据 > 套接字缓冲区大小
  • 发送的数据大于协议的 MTU(Maximum Transmission Unit,最大传输单元),必须拆包

本质原因

TCP 是流式协议,消息无边界。(UDP 协议不会出现粘包 / 拆包现象,它的消息是有明确边界的。UDP 像邮寄的包裹,虽然一次运输多个,但每个包裹都有“界限”,一个一个签收, 所以无粘包、半包问题)。

如何解决粘包/拆包?

方法 如何确定消息边界 优点 缺点 推荐度
定长法 使用固定长度分割消息 简单 空间浪费 不推荐
分割符法 使用固定分割符分割消息 简单 分割符本身需要转义,且需要扫描消息的内容 不特别推荐
长度 + 内容法 先获取消息的长度,再按长度读取内容 精确获取消息的内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值