| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> Netty面试题整理(个人复习) -> 正文阅读 |
|
[网络协议]Netty面试题整理(个人复习) |
Netty面试题整理JavaGuide Netty 常见知识点&面试题汇总 · 语雀 (yuque.com) 1、什么是Netty?Netty是基于NIO开发的网络通信框架,使用Netty可以极大的简化TCP和UDP套接字服务器等网络编程,并且性能以及安全性等很多方面都更好。 平常使用的开源框架,Dubbo、RocketMQ、ES等都使用到了Netty。 大部分微服务框架底层涉及到网络通信的部分都是基于Netty来做的。 2、BIO、NIO、AIO的区别?
3、原生的JavaNIO有什么不足?NIO的编程模型存在一定的bug,并且编写代码比较复杂,对编程功底有一定的要求。 NIO在面对断线重连、包丢失和粘包问题处理比较复杂,而Netty有更好的解决办法。 4、Netty应用场景
5、Netty有哪些核心组件?1)ByteBuf字节容器网络通信最终都是通过字节流进行传输的,ByteBuf是Netty提供的一个字节容器,内部是一个字节数组,我们通过Netty传输数据时就是通过ByteBuf进行的。 可以把ByteBuf看做是Netty对Java NIO中的ByteBuffer的封装和抽象,因为ByteBuffer这个类使用起来比较复杂,因此Netty对其进行了封装。 2)Bootstrap和ServerBootstrap启动引导类BootStrap是客户端的启动引导类,ServerBootstrap是服务端的启动引导类。 一个Bootstrap需要一个线程组(EventLoopGroup),而一个ServerBootstrap需要连个线程组,一个负责监听连接事件,另一个用于处理每个接收到的连接。 3)Channel网络操作抽象类Channel是Netty对网络操作抽象类,通过Channel可以进行IO操作。 当客户端连接到服务端后,就会新建一个Channel与该客户端绑定 常用的Channel接口实现类有:
4)EventLoop事件循环EventLoop定义了Netty的核心抽象,用于处理连接的生命周期中所发生的事件。 EventLoop的主要作用实际就是负责监听网络事件并调用事件处理器进行相关的IO操作的处理。
Channel为Netty网络操作抽象类,EventLoop负责处理注册到其身上的Channel的IO操作,两个配合进行IO操作。
EventLoopGroup包含多个EventLoop(每一个EventLoop通常包含一个线程),管理着所有的EventLoop的生命周期。 并且Eventloop处理的IO事件都将在它专有的线程上被处理,即Thread和EventLoop属于1:1的关系,从而保证线程安全。 5)ChannelHandler消息处理器 ChannelPipeline(ChannelHandler对象链表)ChannelHandler是具体的消息处理器,主要负责处理客户端服务端接收和发送的数据。 当Channel被创建时,它会自动地分配到它专属的ChannelPipeline。一个Channel包含一个ChannelPipeline。ChannelPipeline是ChannelHandler的链,一个pipeline上可以有很多的ChannelHandler。 可以在ChannelPipeline上通过addLast()方法添加一个或者多个ChannelHandler(一个数据或者事件可能会被多个Handler处理)。当一个ChannelHandler处理完之后就会将数据交给下一个ChannelHandler。 当ChannelHandler被添加到ChannelPipeline,它会有一个CHannelHandlerContext,代表一个ChannelHandler和ChannelPipeline之间的“绑定”。ChannelPipeline通过ChannelHandlerContext来间接管理ChannelHandler。 6、ChannelFuture操作执行结果Netty中所有的IO操作都为异步的,我们不能立刻得到操作是否执行成功。 但是可以通过ChannelFuture接口的addListener()方法注册一个ChannelFutureListener,当操作执行成功或者失败时,监听就会自动触发返回结果。 6、NioEventLoopGroup默认的够咱函数会起多少线程?实际会起 7、Reactor线程模型Reactor是一种经典的线程模型,Reactor模式基于事件驱动,特别适合海量的IO事件。 Reactor线程模型分为单线程模型、多线程模型以及主从多线程模型。
8、什么是TCP粘包、拆包?TCP粘包、拆包就是基于TCP发送数据时,出现了多个字符串“粘”在了一起或者一个字符串被“拆”开的问题。 解决办法:
9、Netty的长连接、心跳机制了解吗?
TCP在进行读写之前,server与client之间必须提前建立一个连接。建立连接的过程,需要三次握手,释放连接时需要四次挥手。这个过程是比较消耗网络资源并且有时间延迟的。 短连接说的就是server端与client端建立连接收,读写完成之后就关闭掉连接,如果下一次再要互相发送消息,就要重新连接。短连接优点很明显,就是管理和实现比较简单,缺点也很明显,每一次的读写都要建立连接必然会带来大量网络资源消耗,并且连接的简历也需要耗费时间。 长连接说的就是client向server双方建立连接之后,即使client与server完成一次读写,他们之间的连接也不会主动关闭,后续的读写操作会继续使用这个连接。长连接可以省去较多的TCP建立和关闭的操作,降低对网络资源的依赖,节约时间。对于拼房请求资源的客户来说,非常适合长连接。
在TCP保持长连接的过程中,可能会出现断网等网络异常出现,异常发生的时候,client与server之间如果没有交互的话,他们是无法发现对方已经掉线的,为了解决这个问题,引入了心跳机制。 心跳机制的工作原理是:在client与server之间在一定时间内没有数据交互时,基础与idle状态时,客户端或服务端就会发送一个特殊的数据包给对方,当接收方收到这个数据报文后,也立即发送一个特殊的数据报文回应给对方,这就是一个PING+PONG交互。所以当某一端收到心跳信息后,就知道对方仍然在线,这就确保了TCP连接的有效性。 TCP实际上自带的就有长连接选项,本身也有心跳包机制,也就是TCP的选项:SO_KEEP_ALIVE。但是,TCP协议层面的长连接灵活性不够,所以,一般情况下我们都是在应用层协议之上实现自定义心跳机制,也就是在Netty层面通过编码实现。通过Netty实现心跳机制,核心类时IdleStateHandler。 10、Netty的零拷贝?在OS层面上的零拷贝通常指避免在用户态和内核态之间来回拷贝数据,而在Netty层面,零拷贝主要体现在对数据操作的优化。 Netty的接收和发送ByteBuf采用DIRECTBUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存进行Socket读写,JVM会将堆内存Buffer拷贝一份到直接内存中,然后才写入Socket 中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。
NIO优化: 通过DirectByteBuf
Java可以使用DirectByteBuffer将堆外内存映射到jvm内存中来直接访问使用。减少了一次数据拷贝,用户态与内核态的切换次数没有减少。 进一步优化 底层代用linux2.1后提供的sendFile方法,java中对应这两个channel调用transferto/transferfrom方法拷贝数据。 java调用transferto方法后,要从java程序的用户态切换到内核态,使用DMA将数据读入内核缓冲区, 数据从内核缓冲区传输到socket缓冲区,cpu会参与拷贝 最后使用DMA将socket缓冲区的数据写入到网卡,不会使用cpu。 可以看到
进一步优化 java调用transferto方法后从java程序的用户态切换到内核态,使用DMA将数据读入内核缓冲区,不会使用CPU。 只会将一些offset和length信息拷入socket缓冲区,几乎无消耗。 使用DMA将内核缓冲区的数据写入网卡。 整个过程只发生了一次用户态与内核态的切换,数据拷贝了两次 所谓的零拷贝,并不是真正的无拷贝,而是在不会拷贝复制数据到jvm内存中。 零拷贝的优点:
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 8:59:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |