Netty

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中,达到分流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值