Netty基础组件和常见面试问题(粘包、半包)
来源:http://www.tudoupe.com时间:2022-07-19
目录
- 1.Netty
- 2.Netty通用组件
- 2.1 ServerBootstrap和Boottrap
- 2.2EventLoop和EventLoopGroup
- 2.3 Channel
- 2.4 ChannelPipeline
- 2.5 ChannelHandler
- 2.6 ChannelHanderAdapter
- 2.7 ByteBuf
- 2.7.1使用模式
- 2.7.2 分配
- 3.粘包和半包问题
- 3.1通信包和半包的原因
- 3.2粘贴和半粘贴解决方案
- 4.编解码问题
- 4.1 解码器
- 4.2 编码器
- 5.序列问题(简短)
- (英译汉)埃波尔死亡周期旋转问题
- 6.1Netty的解决方案
1.Netty
- NIO高性能, API简单, 低性能高.
- 它具有丰富的功能,支持许多协议的解码功能, 高性能.
- Java-based NIO, not AIO。
- 应用范围广泛, 如RockteMQ, Dubbo, Hadoop..
2.Netty通用组件
2.1 ServerBootstrap和Boottrap
网络通信基本上是多个进程之间的连接的通信,Netty抽象为服务器和客户端的两个类应用程序驱动程序:ServerBootstrap和Boottrap。
ServerBootstrp需要绑定一个端口,监听客户端的连接。Bootstrap需要绑定远程服务器端口和IP地址。其次,ServerBootstrap将包含2组Channel:ServerChannel作为服务器自身绑定到某端口正在监听的socket;第二个就是包含所有已经创建的用来处理客户端连接的channel。
2.2EventLoop和EventLoopGroup
EventLoop是Netty中处理网络事件的抽象,一个 EventLoop 与一个 Thread 相符,线程任务的提交也由EventLoop处理。多个 EventLoop是一个 EventLoopGroup,Nety可以使用少量 EventLoop来支持大量的频道,而不是为每个频道创建一个线程。
同一个EventLoop可能分配给多个Channel共享利用,一旦为某个Channel分配了EventLoop那么这个关系就绑定下来了,不会改变。
2.3 Channel
Netty的Channel屏蔽了Socket对IO的绑定、读写等操作,Channel用简单的API来实现IO的操作。Channel的生命周期:
当频道在这些状态中被扭曲时,会发生相应的事件,并发送到 ChannelHandler 中 ChannelPipeline 进行处理。
2.4 ChannelPipeline
当Channel被创建时,它将会被自动地分配一个新的ChannelPipelint,每一个Channel都有自己专属的ChannelPipeline,这个关联关系是永久的。
管道(英语:ChannelPipeline)指一种管道结构,类似于责任链模式;管道包含多种负荷ChannelHandler,使得事件可以通过这个责任链让各种ChannelHandler来处理事件。
2.5 ChannelHandler
负责处理ChannelPipeline责任链的事件处理程序,以及各种ChannelHandler的执行顺序取决于它们加入ChannelPipeline的定位决定。
ChannelHandler在添加到ChannelPipeline或者从中移除时,会触发一些方法执行,每一个方法都会接受一个ChannelHandlerContext。

2.6 ChannelHanderAdapter
Nety提供了一些ChannelHander适配器,这些适配器定义了许多默认的接口实现,我们已经开发了可以快速实现接口的接口。
2.7 ByteBuf
ByteBuf的优点:
2.7.1使用模式
2.7.2 分配
对于输入请求,Netty's EventLoop在处理通道读取操作时分配ByteBuf,对于这些缓冲器我们需要自己释放它。
对于输出请求,Netty在呼叫 write, writeAndFlush后自动释放ByteBuf。
3.粘包和半包问题
客户端与服务器的通信是基于文字序列的,客户端将数据包发送到服务器上,每个数据包的大小和语义可能不同,因此服务器上的文字序列的接收判断可能会导致粘贴或半数据包问题。
3.1通信包和半包的原因
TCP作为一种层级传输协议,通过文字序列传输自己,并不具有粘着或半包装的说法。 但基于TCP的应用程序层开发作为可靠传输的手段,存在粘着或半包装的问题。
客户端和服务器通过接口进行通信。如果发送的数据包太小,则使用TCPNagle算法如果数据包被合并并再发送,这可能导致粘包的问题。
半包的发生情况就是一个完整语义的数据包被分成了多次的数据包接收,就存在半包的问题,如果不做控制,服务端并不知道接收到的数据包是一个不完整的半包状态。半包发生的原因就是应用层写入数据的字节大小 > socket的buffer换从去大小。
UDP是一个不连接、不可靠的传输协议,没有包集成过程,因此UDP本身没有包。
3.2粘贴和半粘贴解决方案
贴图和半贴图本身不是TCP问题,所以它们只能在参考层中处理。解决方案如下:
4.编解码问题
网络通信传输中的字符序列需要以某种形式转换为数据格式,以获取信息。 解码过程涉及编码器和解码器,其中粘贴和半包装问题也是解码问题之一。
4.1 解码器
Nety提供两种解码方法:ByteToMessageDecoder解码字符串数据包作为消息对象.MessageToMessageDecoder将消息对象的解码转换为另一个格式消息对象.
4.2 编码器
与解码器相反,解码器的目的是将应用程序发送的消息编码成一个字符串,Netty还提供了消息传递字节和消息传递消息的接口。
5.序列问题(简短)
接下来,我将写一篇关于序列技术的文章,它涉及一般的JDK序列, Krio, Protobuf等。
(英译汉)埃波尔死亡周期旋转问题
这个问题的核心是对JDK NIO包的实现的“Bug:Selector空查询”,最终导致了CPU surge。 主要原因如下:
6.1Netty的解决方案
选择器的 #select() 周期性计算,当有罕见的旋转时,会进行计算,如果连续粒子在一个周期内旋转N次,这解释了埃波尔旋转的问题。重构选择器,从旧选择器中拔出原来的SocketChannel,重新登记到新的选择器,关闭旧选择器。
相关新闻
- 2023-04-16 2台电脑怎么共享(2台电脑怎么共享
- 2023-04-16 主板检测卡代码(电脑主板检测卡代
- 2023-04-16 dnf未响应(dnf未响应老是上不去)
- 2023-04-16 ppoe(pppoe拨号上网)
- 2023-04-16 网速不稳定(网速不稳定是路由器的
- 2023-04-16 wds状态(Wds状态成功)
- 2023-04-16 光标键(光标键不动了怎么办)
- 2023-04-16 电脑提速(电脑提速100倍的方法)
- 2023-04-16 切换用户(切换用户怎么切换回来
- 2023-04-16 数据包是什么(产品数据包是什么
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
