Netty基础
概念
netty是一个网络编程框架,可以自定义通信协议,自定义编码、解码字节流。
三大特性
并发高:基于nio的网络通信框架,对比bio,性能得到了很大的提高。
传输快:0拷贝,堆内存外开辟一块内存,提高传输速度
封装好:优良的api设计和灵活的代码调用
I/O基础
输入流: InputStream和Reader输出流: OutputStream和Writer
字节流 字符流
计算机最小的二进制单位bit 比特代表0和1字节1 byte = 8bit计算机处理的最小单位
字符1 char= 2byte = 16bit人处理的最小单位
所以,字节流处理文件、图片、 视频等二进制数据,而字符流处理文本数据。
Socket
原意是‘插座",在计算机领域中,翻译为"套接字”。
2、Socket
原意是"插座",在计算机领域中,翻译为"套接字"。
本质上,是计算机之间进行通信的一种方式。
Linux“- 切皆文件", 给每个文件映射一个ID,叫做"文件描述符"。
当处理网络连接时,也会看成一个文件, read/write变成和远程计算机的交互。
OSI七层模型= Open System Interconnection开放式系统互联
从下到上分别为:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
实际应用的是优化后的TCP/IP模型(四层)
网络接口层/链路层、网络层、传输层 、应用层
应用层协议: HTTP、FTP、 SMTP (邮件协议)
传输层协议: TCP、UDP
Socket其实是应用层与传输层之间的抽象层,是一组接口。
在设计模式中,是门面模式。
NIO
BIO- BlockinglO同步阻塞
NIO- New 10/ Non-Blocking 10同步非阻塞AlO- Asynchronous I0异步非阻塞
同步和异步,关注的是消息通知的机制
阻塞和非阻塞,关注的是等待消息过程中的状态
三大元素:channel、buffer、selector
1) Channel
FileChannel文件管道的数据
Pipe.SinkChannel
Pipe.SourceChannel线程间通信的管道ServerSocketChannel
SocketChannel用于TCP网络通信的管道DatagramChannel用于UDP网络通信的管道
2) Buffer
capacity总体容量大小
limit存储容量的大小,是可读写和不可读写的界线
position已读容量的大小,已读和未读区域的界线
[使用原理]
a).初始化,给定总容量,position=0, limit=capacity
b)当使用put方法存入数据是,通过position来记录存储的容量变化,position不断后移,直到存储结束(写完成)
c)写完成需要调用flip方法刷新,limit=position, position=0
保障limit记录的是可读写区域的大小,position已读部分重置为空
d)读数据直到读完成,需要调用clear方法, position=0, limit=capacity
3)Selector
三个元素:selector 选择器 selectableChannel可选择的通道 selectionkey选择键
本质上,selector是监听器,监听的是通道是否有我们关系的操作产生,操作对应的事件(链接、接受、读/写)
使用selectionkey所代表的具体操作,在确保通道是可选择的情况下,将通道注册到选择器中,此时selector维护的是,通道和事件的对应关系
Selector,管理被注册的通道集合,以及他们的状态
SelectableChannel,是一个抽象类 ,提供了通道可被选择需要实现的api。FileChannel就不是可选择的,Socket相关的通道都是 可选择的
一个通道可以被注册到多个选择器上吗?可以的
多个通道可以注册到一个选择器上,但一个通道只能在一个选择器中注册一次
SelectionKey,封装了要监听的事件,连接、接收、读、写。一方面,Selector关心通道要处理哪些事件
另一方面,当事件触发时,通道要处理哪些事件
[使用方式]
1、首先通过open方法, 获取通道,将通道设置为非阻塞的
2、通过open方法,获取选择器,将通道注册进选择器中 ,伴随设置通道要处理的事件(OP ACCEPT)
3、轮询选择器,当前是否有要处理的操作select() > 0
如果有,要获取,待处理操作的集合Set<SelectionKey>,进行遍历
遍历到SelectionKey时,判断对应哪种操作,不同的操作设置不同的处理方式
如OP ACCEPT, 接收客户端通道并进行注册,监听后续处理的事件,如OP_WRITE如OP WRITE,通过key的方法获取通道本身,读取数据并继续监听事件,如OP READ
4.零拷贝
零拷贝是基于操作系统层面的优化方式(以下基于linux系统)
在操作系统中的拷贝(如第二次和第三次)叫做CPU拷贝
连接磁盘或网卡等硬件的拷贝(1,4)叫做DMA拷贝
零拷贝的概念:减少CPU的拷贝次数
需求:将磁盘中的文件读取出来,通过socket发送出去
传统的拷贝方式(4次) socket网络缓冲区,也属于操作系统的内核缓冲区。
磁盘-》操作系统内核缓冲区-》应用程序缓存buffer中-》socket网络缓冲区-》网卡
1.mmap=memory mapping 内存映射
磁盘-》操作系统内核缓冲区(内存映射:应用程序缓存buffer中)-》socket网络缓冲区-》网卡
2.sendfile(linux内核2.1支持)
磁盘-》操作系统内核缓冲区-》(不拷贝全部数据,只记录数据的位置和长度)socket网络缓冲区-》网卡
3.sendfile with scatter/gather copy(批量sendfile)
从单个文件的处理,上升到多个物理地址的处理,提高处理速度
4.splice(拼接,linux2.6支持)
磁盘-》操作系统内核缓冲区《--》(建立管道)(不拷贝全部数据,只记录数据的位置和长度)socket网络缓冲区-》网卡
5.线程模型
单线程reactor模型:reactor、acceptor、handler
多线程reactor模型:提高了handler的处理 效率,不再负责具体的业务逻辑,当读出数据后,分发给子线程处理
主从reactor模型:mainreactor用来接收时间,分发给acceptor,acceptor在处理过程中,直接将后续的读写事件,注册到slaveReactor中,达到分流