Netty——经典面试题

TCP和UDP的根本区别

  • TCP面向连接,如打电话要先拨号建立连接;UDP是无连接的,即发送数据之前不需要建立连接
  • TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  • TCP通过校验和、重传控制、序号标识、滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制
  • UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高要求的通信或广播通信
  • 每一条TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的交互通信
  • TCP对系统资源要求较多;UDP对系统资源要求较少

TCP如何保证可靠传输

TCP对发送的每一个包都进行编号,接收方对数据包进行排序,把有序数据传给应用层:

  • 校验和:TCP将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果收到段的校验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。

TCP的接收端会丢弃重复的数据:

  • 流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。(TCP利用滑动窗口实现流量控制。)
  • 拥塞控制:当网络拥塞时,减少数据的发送
  • 停止等待协议:也是为了实现可靠传输,它的基本原理就是没发完一个分组就停止发送,等待对方确认。收到确认后再发下一个分组。
  • 超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

Netty能解决什么问题

Netty是一款基于NIO开发的网络通信框架,相比于BIO,它的并发性能得到了很大提高。难能可贵的是,在保证快速和易用性的同时,并没有丧失可维护性和性能等优秀。

选用Netty作为通信组件框架的举例

典型应用:阿里分布式服务框架Dubbo,默认使用Netty作为基础通信组件;还有RocketMQ,也是使用Netty作为通信的基础。

Netty有哪些主要组件,它们之间有什么关联

  • Channel:作为Netty中进行网络操作的抽象类,包括基本的I/O操作,如bind()、connect()、read()、write()等。
  • EventLoop:主要是配置Channel处理I/O操作,用来处理连接的声明周期中所发生的事情。
  • ChannelFuture:Netty框架中所有的I/O操作都是异步的,因此需要ChannelFuture的addListenner()注册一个ChannelFutureListener监听事件,当操作执行成功或者失败时,监听机会自动触发返回结果。
  • ChannelHandler:充当所有处理入栈和出栈数据的逻辑容器。ChannelHandler主要用来处理各种事件,这里的事件很广泛,比如连接、数据接收、异常、数据转换等。
  • ChannelPipeline:为ChannelHandler链提供了容器,当Channel创建时,就会被自动分配到它专属的ChannelPipeline,这个关联是永久的。

相较同类框架,Netty有哪些优势

  • 使用简单:封装了NIO的很多细节,使用更简单
  • 功能强大:预置了多种编解码功能,支持多种主流协议
  • 定制能力强:可以通过ChannelHandler对通信框架进行灵活的扩展
  • 性能高:通过与其他业界主流的NIO框架对比,Netty的综合性能最优
  • 稳定:Netty修复了已经发现的所有NIO的Bug,让开发者可以专注于业务本身
  • 社区活跃:Netty是活跃的开源项目,版本迭代周期短,Bug修复速度快

Netty的高性能体现在哪些方面

  • I/O线程模型:同步非阻塞,用最少的资源做更多的事
  • 内存零拷贝:尽量减少不必要的内存拷贝,实现更高效率的传输
  • 内存池设计:申请的内存可以重用,主要指直接内存。内部实现用一颗二叉查找树管理内存分批情况
  • 串行化处理读写:避免使用锁带来的性能开销
  • 高性能序列化协议:支持Protobuf高性能序列化协议

默认情况下Netty起多少线程,何时启动

Netty线程数默认是CPU核数的两倍,Bind完之后启动。

Netty有几种发送消息的方式

  • 直接写入Channel,消息从ChannelPipeline中尾部开始传播
  • 写入与ChannelHandler绑定的ChannelHandlerContext,消息从ChannelPipeline的下一个ChannelHandler中传播

Netty支持哪些心跳类型设置

  • readerIdleTime:为读超时时间(即测试端一定时间内未接收到被测试端消息)
  • writerIdleTime:为写超时时间(即测试端一定时间内向被测试端发送消息)
  • allIdleTime:所有类型的超时时间

Netty和Tomcat的区别

  • 作用不同:Tomcat是Servlet容器,可以视为Web服务器,而Netty是异步事件驱动的网络应用程序框架和工具,用于简化网络编程,例如TCP和UDP套接字服务器
  • 协议不同:Tomcat是基于HTTP的Web服务器,而Netty能通过编程自定义各种协议,因为Netty本身自己能编码/解码字节流,所以Netty可以实现HTTP服务器、FTP服务器、UDP服务器、RPC服务器、WebSocket服务器、Redis的Proxy服务器、MySQL的Proxy服务器等

在实际应用中,如何确定要使用哪些编解码器

通过查看Netty的API,不难发现Netty自带的编解码器可以解决99%的业务需求,只有1%的需求需要自己编解码。

Guess you like

Origin blog.csdn.net/cold___play/article/details/108142929