面试问到Netty看这一篇就够了

一、OSI七层模型

应用层: Http协议、电子文件传输、文件服务器等
表示层: 解决我们不同系统之间语法的通讯,兼容问题
会话层: 建立与应用程序之间的通讯
传输层: 提供了端口号和接口协议TPC/Udp
网络层: 为数据包选择路由 路由器、交换机,定义了ip地址,可以根据ip地址找到对应的服务器
数据链路层: 传输有地址的帧以及错误检测功能
物理层: 以二进制形式,在物理机器上实现传输(光纤、各种物理介质传输)

传输层非常核心的内容:socket套接字,不属于某种协议,属于网络编程技术
任何的编程语言都是支持socket(网络编程技术)技术开发,目的就是解决两个应用程序通讯的问题

二、TCP与UDP协议的区别?

  • TCP协议是一个面向连接可靠的协议,因为建立连接的时候必须通过三次握手才可以实现数据传输,所以数据不会丢失
  • UDP协议面向无连接协议,UDP在通讯的时候不需要对方接受,属于不可靠传输,可能存在数据丢包问题

三、TCP协议的三次握手

第一次握手:客户端会向服务器端发送消息问:你在不在?
第二次握手:服务器端收到了客户端的消息(你在不在?),然后回复客户端说:我在呢
第三次握手:客户端收到服务器端回复(我在呢)客户端就会向服务器端发送消息:好的,然后开始传输数据

第一次握手:客户端会向服务器发送代码syn=1,并随机产生一个数seq=x(x是随机数)发送到服务器端
第二次握手:服务器端确认收到syn=1和seq=x,回复给客户端ack=x+1和seq=y(y是随机数)
第三次握手:客户端接收syn、ack、y值之后向服务器发送ack=y+1此包发送完毕之后就开始建立连接
三次握手成功(预发送成功)之后就开始传输数据

syn(建立连接)、ack(确认标记)、fin(终止标记)

四、TCP协议的四次挥手

第一次挥手:客户端向服务端发送一个释放连接通知
第二次挥手:服务端告诉客户端说,还没传输完,先等一等
第三次挥手:所有数据传输完毕之后,服务端告诉客户端传输完成
第四次挥手:关闭连接

关闭连接:
第一次挥手: 客户端向服务器端发送释放的报文,停止发送数据 fin=1、生成一个序列号seq=u;
第二次挥手: 服务器端接受到释放的报文后,发送ack=u+1;随机生成的seq=v给客户端;当前状态为关闭等待状态,客户端收到了服务器确认通知之后,此时客户端就会进入到终止状态,等待服务器端发送释放报文。
第三次挥手:服务器端最后数据发送完毕之后,就向客户端发送连接释放报文,FIN=1,ack=u+1 当前为半关闭状态,随机生成一个随机数w
第四次挥手,客户端必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。

可以看到,服务器结束TCP连接的时间要比客户端早一些。

五、为什么不是两次握手?

三次更可靠,第三次是预发送

六、Http协议与Https协议的区别?

HTTP协议默认端口号:80端口,明文传输,效率比较高
HTTPS协议默认端口号:443端口,加密传输,效率比较低

HTTPS比HTTP协议安全:SSL+证书实现传输

扫描二维码关注公众号,回复: 11013782 查看本文章

七、HTTP协议特征

Http协议:超文本传输协议基于TCP/IP协议实现的包装,img/css/html中都会使用到http协议
1、无状态:没有记忆的会话token、jwt、session
2、请求(req)与响应(resp)模型
3、简单快捷
4、灵活,可以传输任何类型
请求:请求头、请求类型、请求方法
响应:响应行、响应头、响应体

八、长连接与短连接

HTTP1.0:规定客户端与服务器端传输完成之后,立马关闭连接
HTTP1.1:规定客户端与服务器端传输完成之后,不会立马关闭连接(挥手),1.1之后开始支持长连接
长连接:客户端与服务端建立连接之后,不会立马关闭连接,会保持一定的复用机制,默认情况下300s空闲情况下自动断开连接
短连接:立马关闭连接,频繁发包,会消耗服务器资源

九、同步和异步的区别?

站在多线程的角度分析
同步:整个代码的执行顺序是从上往下执行
异步:开启多个不同的分支实现并行执行,每个线程互不影响

站在web项目的角度分析
默认的情况下Http请求就是一个同步形式实现调用,基于请求与响应,如果我们响应非常久,客户端一直等待,客户端体验会非常不好,

同步:
问题:代码执行时间长
解决方法:比较耗时的代码,要么使用多线程,要么使用mq

异步:
问题:异步没有返回值
解决方法:前端使用aax,实现轮询主动查询,比如二维码

十、Linux中的五种I/O模型

1、阻塞I/O(同步)(BIO):当我们在调用一个io函数的时候,如果没有获取到数据的情况下,那么就会一直等待;等待的过程中会导致整个应用程序一直是一个阻塞的过程,无法去做其他的实现。会占用cpu资源
2、非阻塞I/O(同步)(乐观锁):不管是否有获取到数据,都必须要返回IO结果,如果没有获取数据结果的情况下,就使用循环控制不断重新获取。会非常消耗cpu资源
3、I/O复用(同步)(select,poll,epoll)(nginx,redis原理,mysql连接原理)IO实际指的就是网络的IO、多路也就是多个不同的tcp连接;复用也就是指使用同一个线程合并处理多个不同的IO操作,这样的话可以减少CPU资源。
4、信号驱动I/O(同步)(zk节点事件通知)发出一个请求实现观察监听,当有数据的时候直接走异步回调
5、异步I/O(异步)(AIO):异步io也就是发出请求数据之后,剩下的事情完全实现异步完成

十一、Linux中的空间模型

Linux中分为内核空间用户空间
1、recvfrom方法,数据是先到达内核空间,socket连接或者是磁盘上没有数据的情况下就会一直等待
2、内核空间中有数据之后将数据复制到用户空间,用户空间再往下执行代码

十二、什么是NIO?

面向于缓冲区、基于通道实现非阻塞式io、多路io复用实现
选择器selector轮询,效率高

十三、BIO与NIO的区别?

Bio是一个阻塞式io,是面向于流传输,也就是根据每个字节实现传输效率非常低
Nio是非阻塞式io,面向缓冲区,其中最大的亮点是io多路复用机制

十四、什么是IO多路复用?

用集合存放多个tcp连接,用循环去遍历这个集合,使用的非阻塞式io
多路:指多个tcp连接
复用:一个线程可以维护多个不同的io操作
好处:占用cpu资源非常小,线程安全(单线程)

十五、NIO核心组件

Selector(选择器):管道都会注册到选择器中统一管理
channel(管道):一个连接对应一个管道
Buffer(缓冲区):提高读取效率

十六、Windows和Linux实现IO多路复用的区别?

windows上是使用select(O(n)),linux是使用epoll(O(1)),都是selector
select存在空轮训,效率非常低,而且对轮询有一定的限制,很难支持上万的tcp连接
linux使用epoll实现事件驱动回调形式通知,不存在空轮训的情况,只对活跃的socket实现主动回调,性能有很大的提升

WindowsI/O效率会随着连接的变多导致效率下降,Linux中使用epoll,不存在这种情况
Nginx号称支持五万连接,底层也是使用linux的epoll,redis也是

十七、为什么放弃原生NIO选用Netty框架?

Nio操作很麻烦,Netty对NIO封装,使用方便,且性能很好

十八、Netty创建服务器端的时候,为什么使用两个线程池?

bossGroup线程池:接收请求
workGroup线程池:读写请求
Nginx启动的时候有两个进程和Netty两个线程池一样的原理

十九、Netty的五大核心?

Channel:管道
ChannelFuture:
EventLoop:
ChannelHandler:管道处理器
ChannelPipeline:

二十、什么时候会发生粘包、半包?如何解决?

粘包:多次发送的消息,客户端一次合并读取
拆包:多次发送的消息,变成msg msg --》msgm sg

Buffer缓存区造成的,Tcp协议为了高性能的传输,发送和接受的时候都采用了缓冲区,短连接不存在这些问题,长连接才存在
1.当我们的应用程序发送的数据大于套字节缓冲区的时候,就会实现拆包
2.当我们的应用程序发送的数据小于套字节缓冲区的时候,多次发送的消息会合并到一起接受,这个过程我们可以称做为粘包
3.接受端不够及时的获取缓冲区的数据,也会产生粘包的问题
4.进行mss(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>最大报文长度的时候将发生拆包

解决思路:
1.以固定的长度发送数据,到缓冲区(效率低)
2.可以在数据之间设置一些边界(\n或者\r\n)
3.利用编码器LineBaseDFrameDecoder解决tcp粘包的问题

二十一、常用编码器有哪些?

DelimiterBasedFrameDecoder解决TCP的粘包解码器(底层也是使用标识符分割的原理)
StringDecoder 消息转成String的解码器
LineBasedFrameDecoder 自动完成标识符分隔解码器
FixedLengthFrameDecoder 固定长度解码器,二进制
Base64Decoder Base64解码器

二十二、序列化问题

传对象的时候序列化
接收对象的时候反序列化
序列化:将对象转换成字节的形式,这个过程称为序列化
反序列化:将字节转换成对象的形式,这个过程称为序列化

transient标记的属性不参与序列化

TCP底层是字节,所以传输的时候要序列化
序列模式有两种:
1、对象持久化概念:将对象转换成字节,存放到硬盘或者是数据库中
2、网络传输对象概念:客户端将对象转换成字节的形式(序列化),变成二进制的形式发送给服务端,服务器接收到字节后,反序列化成对象(rpc远程讯通)

二十三、有哪些实现序列化的方式?

跨语言传输,序列化协议:
1、使用json序列化 轻量级
2、xml 占带宽,老项目,重量级
3、ProtoBuf 谷歌自定义协议
4、MessagePack 它像 JSON,但是更快更小。
MessagePack 是一种高效的二进制序列化格式。它允许您在 JSON 等多种语言之间交换数据,但它更快速更小巧。小整数被编码为单个字节,典型的短字符串除了字符串本身之外只需要一个额外的字节。
支持Python、Ruby、Java、C/C++等众多语言。宣称比Google Protocol Buffers还要快4倍。
要在实体类上下@message注解
5、企业内部自定义序列化协议

二十四、什么是RPC?有哪些RPC框架?

RPC概念:服务与服务之间实现通讯远程调用的过程
RPC框架有哪些?
dubbo、httpclient、grpc、feign客户端、rest模版
大型互联网公司都是内部实现rpc

二十五、

二十六、

二十七、

二十八、

二十九、

三十、

发布了52 篇原创文章 · 获赞 2 · 访问量 1866

猜你喜欢

转载自blog.csdn.net/qq_42972645/article/details/104626837