netty面试题

一份Netty最全面试题!让面试官难不倒你! -

TCP可靠性表现

面向连接

校验和

确认应答与序列号(TCP传输时将每个字节的数据都进行了编号,这就是序列号)

超时重传

流量控制

滑动窗口设置

TCP的粘包/拆包原因

1.UDP首部采用了16bit来指示UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。TCP的首部没有表示数据长度的字段。

2.发两个数据包时会有有三种情况。主要原因是TCP发送缓冲区剩余空间的大小,将会发生粘包和拆包。

TCP粘包、拆包解决办法

1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度。

2、发送端将每个数据包封装为固定长度(不够的可以通过补0填充)。

3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。

Netty解决方案

Netty默认提供了多种编解码器用于处理半包,例如:LineBasedFrameDecoder

BIO、NIO、AIO分别是什么

阻塞 非阻塞  异步(read write 缓冲)

Netty跟Java NIO有什么不同

越底层的东西越麻烦涉及到多线程,网络编程,NIO底层还有bug。

框架模块丰富,有大量的实践,稳定,社区活跃。

Netty组件

其实NIOEventLoopGroup就是一个线程池实现,通过设置不同的NIOEventLoopGroup方式就可以对应三种不同的Reactor线程模型。 

channel 都有一个与之关联的eventLoop绑定一个线程然后注册到selector

当 channel 创建时,就会被自动分配到它专属的 ChannelPipeline ChannelHandler 链提供了容器。

Reactor线程模型

单线程模型

多线程模型

主从线程模型

Reactor线程模型以及在netty中的应用

select、poll、epoll的机制及其区别

都是同步多路IO复用

它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。

(2)poll==>时间复杂度O(n)

poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.

(3)epoll==>时间复杂度O(1)

epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))

1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。

2、select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善

你可能感兴趣的:(netty面试题)