网络编程面试题

1.BIO,NIO,AIO分别是什么

BIO

同步阻塞式IO操作,使用BIO读取数据的时候线程会被阻塞住,并且需要线程主动的去查询是否有数据可读,并且需要处理完一个Socket之后才能处理下一个Socket

NIO

同步非阻塞IO,使用NIO读取数据的时候,线程不会阻塞,但是需要线程主动去查询是否有IO事件

AIO

异步非阻塞IO,使用AIO读取数据的时候线程不会阻塞,并且当有数据可读取的时候会通知线程,不需要线程主动去查询

2.零拷贝

零拷贝是指:应用程序在需要将内核中的一块区域中的内容转移到另外一个快内核中去,不需要经过先复制到用户空间,在转移到目标内核中区域中去,而直接实现转移,利用操作系统的transferTo()方法

image-20250303231744434

**优点:**省略了两次内存交换的时间,直接实现内核中的转移

3.Netty是什么?和Tomcat有什么区别?特点是什么

Netty是一个基于NIO的异步网络通讯框架,性能高,封装了原生的NIO编码的复杂度,开发者可以直接使用Netty来开发高效率的各种网络服务器,并且编码简单。

Tomcat是一个web服务器,是一个Servlet容器,基本上Tomcat内部只会运行Servlet程序并处理HTTP请求

而Netty封装的是底层的IO模型,关注的是网络数据的传输,并不关系具体的协议(http,https)可定制性更高

Netty的特点:

  1. 异步NIO的网络通讯框架
  2. 高性能
  3. 高扩展,高定制型
  4. 易用性(封装了复杂的NIO操作

4.Netty的高性能体现在哪方面

  1. NIO模型,用最少的资源做更多的事情
  2. 内存零拷贝,尽量减少不必要的内存拷贝信息,实现高效的传输协议
  3. 内存池的设计方式,申请的内存可以重用,主要指直接内存。内部实现是一个二叉查找树管理内存分配情况
  4. 串行化处理读写:避免使用锁带来的性能开销。即消息的处理尽可能在同一个线程内完成,期间不进行线程的切换,这样就避免了多线程竞争同步锁。表面上看,串行化设计似乎CPU利用率不高,并发程度不够,但是通过调整NIO线程池的线程参数,可以启动多个串行化线程并行运行,这种局部无锁话的串行线程相比于一个队列中多个工作线程模型性能更优
  5. 高性能序列化协议:protobuf等高性能序列话协议
  6. 高性能并发编程体现:volatile的大量,正确使用;CAS和原子类的广泛使用,线程安全容器的使用,通过读写锁提高并发性能

5.浏览器发出一个请求到收到相应经历了那些步骤

域名解析

在浏览器中输入一个网址的时候,浏览器首先要做的就是域名解析,先查本地的DNS缓存,查看一下是否有改域名对应的ip地址,如果有对应的ip地址,则直接使用缓存中的IP地址,如果没有,浏览器就会想本地域名服务器发送DNS查询请求

本地域名服务器在收到请求之后,会现在本地的数据库中查看是否有该域名的记录。如果有,就将对应的IP地址返回给浏览器,如果没有它会向域名根服务器发送查询请求,根域名服务器会根据域名的顶级域名,告诉本地域名服务器应该去那个顶级域名服务器中查找

本地域名服务器会再向顶级域名服务器发送请求,顶级域名服务器会根据域名的二级域名信息,告诉本地域名服务器应该去那个权威域名服务器查找,最后本地域名服务器获取到制定域名的IP地址,并返回给浏览器

建立连接

浏览器在获取到目标服务器的IP地址之后,会使用TCP协议与服务器建立连接,这个过程称为三次握手

  • 第一次握手:浏览器向服务器发送一个SYN(同步包),其中一个随机的序列号Seq=x,告诉服务器它向建立连接
  • 第二次握手:服务器收到浏览器发送的SYN包之后,会向浏览器发送一个SYN+ACK(同步确认包)其中包含服务器的随机序号Seq=y,以及确认号Ack=x+1,表示他已经收到浏览器的请求,同意建立连接
  • 第三次握手:浏览器收到服务器的SYN+ACK包之后,会向服务器发送一个ACK=y+1的确认包,序列号为x+1,表示它已经收到服务器的响应,建立连接成功

服务器处理请求

服务器接收到浏览器发送的请求之后,会根据请求中的内容进行处理,服务器首先会解析请求,获取请求方法,URL,请求头和请求体信息

然后服务器会根据请求的URL和业务逻辑,调用相应的处理程序来处理请求,静态文件请求服务器会直接从文件系统中进行读取,并将其分装为响应体内容返回,动态资源查询数据库等操作,服务器会执行相应的操作,获取数据生成相应的内容,然后封装称为响应体返回给浏览器

服务器发送相应

服务器处理完请求后,会向浏览器发送HTTP请求,相应中包含了相应状态码,响应头信息,已经相应体内容

状态码表示服务器的处理结果

响应头表示一些相应相关元数据

浏览器接受和处理相应

浏览器接收到相应之后会根据相应的结果做不同的事情

关闭连接

当请求完毕之后,如果此次连接是短连接,那么浏览器就会向服务器发送一个FIN包,请求关闭连接,服务器接收到FIN包之后会返回一个ACK确认包,表示双方同意关闭连接,然后双方就会关闭连接

如果服务器与浏览器之间的是长链接浏览器会根据一定的规则和策略(连接空闲时间,请求数量)来决定是否关闭连接

6.跨域请求是什么?有什么问题?怎么解决?

跨越:跨域域名访问,www.aaa.com 访问www.bbb.com,两个域名不同之间的相互调用就是跨域请求

问题:

解决方法:

  • JSONP:利用