本文是作者从面试题角度出发,将《Netty 4核心原理与手写RPC框架实战_谭勇德》这本书的内容进行总结并且结合自己的面试经验进行分析,方便急于应付面试的同学直接获得这方面的知识。
TCP的建立连接的过程是怎样的?
TCP的传输包括3个阶段:建立连接、数据传输和释放连接。其中主要问的是建立TCP连接的三次握手。
三次握手分析:
1. 第一次握手:客户端发送,服务端收到了,此时服务端就知道,客户端的发送能力和自己的接收能力是正常的。
2. 第二次握手:服务端发送,客户端收到了,此时客户端就知道,客户端的发送能力和接收能力是正常的,服务端的发送和接收能力也是正常的。但是服务端不知道自己的发送能力是否正常。所以需要第三次握手。
3. 第三次握手:客户端发送,服务端收到了。这一次的目的是最终确认服务端对自己的发送能力和客户端的接收能力。
因此我们也知道了三次握手不能减少为两次握手的原因了,其实就是进行一次最终确认,让服务端知道自己的发送能力和客户端的接收能力。如果是建立连接失败,第三次握手也能让服务端及时关闭连接资源,不会一直卡在那里空耗资源。
一次HTTP请求的网络通信过程是怎样的?
下面我们分析一下当我们在浏览器输入一个网址后,一次完整的网络请求是怎样实现的?
1. 首先假设我们设置了本地IP:192.168.1.101,子网掩码:255.255.255.0,网关:192.168.1.1,DNS地址:8.8.8.8。
2. 浏览器输入:www.baidu.com。
3. 基于UDP协议访问DNS域名服务器获取具体的远程IP地址,假设是183.232.231.174,找到后一般会缓存在本地,下次就直接从缓存获取。
4. 向目标IP发起HTTP请求,请求包括HTTP请求头和请求体。
5. 将HTTP请求包装成新的TCP包,如果超过TCP包限制会拆为多个包。发送方采用随机端口,百度则默认80端口,将这些端口信息放入TCP包头。
6. 将TCP包和包头继续包装成新的IP包,同样如果超过阈值会拆分多个包,并且将双方的IP写入IP包头。
7. 将IP包和包头继续包装成新的以太网包,同样如果超过阈值会拆分多个包,并且将双方的MAC地址写入以太网包头。
- 以太网包和包头经过多个网关的转发,最终百度服务器接收到请求后,会层层拆包,最终还原为HTTP包,解析该HTTP请求、处理业务后返回响应。
9. 响应也是一个HTTP请求,会经历一样的过程:HTTP包 -> TCP包 -> IP包 -> 以太网包,最终返回浏览器解析后展示。
HTTP请求最终的包装结果如下:

零拷贝的原理是什么?
首先看一下磁盘IO和网络IO的交互过程:

这里可以看到IO交互一般都是两个步骤:
1. 等待网络数据到达网卡,然后将数据读取到内核缓冲区。如果是从磁盘读取文件数据,那么就是由磁盘控制器读取数据到内核缓冲区。
2. 从内核缓冲区复制数据,然后拷贝到用户空间。
因此零拷贝的意思就是应用程序直接在内核空间操作IO数据,不需要将数据拷贝到用户空间再处理,减少了一次数据拷贝的过程。
Netty对于零拷贝的实现就是通过DirectBuffer,直接使用堆外内存进行数据读写,不需要将网络字节二次拷贝到用户空间。
Java BIO、NIO、AIO的原理和区别是什么?同步、异步、阻塞、非阻塞和多路复用这些概念又是怎么理解?
完整的文章请从下面链接下载: