网络IO
1. 概述
1.1什么是三次握手
- 客户端向服务器发送sny报文
- 服务器收到报文后,返回sny报文+ack
- 客服端向服务器发送ack
1.2什么是四次挥手
- 客服端发送关闭请求
- 服务器响应客服端关闭请求
- 服务器发送关闭请求
- 客服端发送确认关闭请求
2.IO
2.1 BIO
是一种阻塞io,在服务器等待客户端连接时和服务器读取客户端发送的数据时,线程都会等待阻塞,直到接收到客户端的信息。
2.2NIO
是一种非阻塞io,在读数据和连接客户端的时候都不会阻塞线程。
select:
jdk1.5以前的版本才有,就是底层用的数组,然后去轮询遍历,创建的连接是有数量限制的,有一个缺点就是有10w个连接,只有一个读事件,拿到这个读事件需要把10w个连接都便利一遍。
poll:
也是jdk1.5之前才有,底层是链表,也是轮询,连接数量无限制。
epool:
jdk1.5出现的,采用了多路复用,会调用linux的内核函数创建一个epool,然后监听事件,如果有读事件或者连接事件,就会以回调的方式拿到来处理响应逻辑,里面有个专门的事件list和连接list;没有的话就会阻塞等待在哪里,其实有点像队列监听事件一样,只不过换成了linux内核函数来做,因为网络连接这一块还是偏底层的。
3.netty
底层使用了nio,Netty 使用零拷贝技术和内存池来减少内存复制和垃圾回收的压力,提高数据处理速度;使用线程池异步io操作,有两个线程组,一个专门负责连接事件,一个负责读写事件, 有一个渠道处理器,是专门用来实现业务逻辑。