I/O系列

作者: Austin_Brant | 来源:发表于2019-07-04 17:11 被阅读0次

NIO系列

【NIO系列】——之TCP探秘

OSI的网络分层 数据包格式

网络的中的数据,最终通过多个路由器连接传送的。最底层的以太网协议规定了电子信号如何组成数据包,解决了局域网的点对点通信问题,但无法解决多个局域网的的互通问题。

而网络层采用的IP协议,就是定义了一套自己的地址规则,主要解决寻址和路由的功能,根据对方的IP地址,寻找最佳路径传输信息。局域网通过路由器连接,路由器基于IP协议,指导数据包向某个路由借口转发。但IP协议不保证包一定到达以及完整性,特别是网络拥堵的时候,会丢弃一些数据包,保证数据的传送效率

而保证数据包的完整、有序以及可靠,这就是TCP 协议要来做的事情了。

TCP包组成

很多网络有一个最大传送单元,它是链路层中的网络对数据帧的一个限制,以以太网为例,MTU为1500个字节。一个IP数据报在以太网中 传输,如果它的长度大于该MTU值,就要进行分片传输,使得每片数据报的长度小于MTU。 一个tcp包的在500字节左右(默认MSS大小为563byte),其大小小于MUT,以防止在网络层被分片处理。

其次增加SEQ和ACK,同时采用超时重发的机制来保证包的可靠性。

TCP连接

SYN (synchronous建立联机)
ACK (acknowledgement 确认)
PSH (push传送)
FIN (finish结束)
RST (reset重置)
URG (urgent紧急)
SEQ (Sequence number顺序号码)
ACK (Acknowledge number确认号码)

三次握手过程:
1.C->S: syn=1 seq=x ack=0
2.S->C: syn=1 seq=y ack=x+1
3.C->S: seq=x+1 ack=y+1

【NIO系列】——之IO模型

select、poll、epoll的不同

总结
针对这5中IO模型,我采用一张图来总结一下。

java IO

Unix中的五种I/O模型,除信号驱动I/O外,Java对其它四种I/O模型都有所支持。其中Java最早提供的blocking I/O即是同步阻塞I/O,而NIO即是同步非阻塞I/O,同时通过NIO实现的Reactor模式即是I/O复用模型的实现,通过AIO实现的Proactor模式即是异步I/O模型的实现。

所以说严格意义上来说,通过Reactor模式实现的NIO,和unix中的I/O多路复用是相同的概念,但这是一种编程模型,而不是原生支持。这也是我们下面所要进行的netty讲解的主要思想。

【NIO系列】——之Reactor模型

单Reactor单线程模型

其中Reactor线程,负责多路分离套接字,有新连接到来触发connect 事件之后,交由Acceptor进行处理,有IO读写事件之后交给hanlder 处理。

Acceptor主要任务就是构建handler ,在获取到和client相关的SocketChannel之后 ,绑定到相应的hanlder上,对应的SocketChannel有读写事件之后,基于racotor 分发,hanlder就可以处理了(所有的IO事件都绑定到selector上,有Reactor分发)。

该模型 适用于处理器链中业务处理组件能快速完成的场景。不过,这种单线程模型不能充分利用多核资源,所以实际使用的不多。

单Reactor多线程模型

相对于第一种单线程的模式来说,在处理业务逻辑,也就是获取到IO的读写事件之后,交由线程池来处理,这样可以减小主reactor的性能开销,从而更专注的做事件分发工作了,从而提升整个应用的吞吐。

多Reactor多线程模型

第三种模型比起第二种模型,是将Reactor分成两部分,

  1. mainReactor负责监听server socket,用来处理新连接的建立,将建立的socketChannel指定注册给subReactor。

  2. subReactor维护自己的selector, 基于mainReactor 注册的socketChannel多路分离IO读写事件,读写网络数据,对业务处理的功能,另其扔给worker线程池来完成。

我们可以看到,mainReactor 主要是用来处理网络IO 连接建立操作,通常一个线程就可以处理,而subReactor主要做和建立起来的socket做数据交互和事件业务处理操作,它的个数上一般是和CPU个数等同,每个subReactor一个线程来处理。
此种模型中,每个模块的工作更加专一,耦合度更低,性能和稳定性也大量的提升,支持的可并发客户端数量可达到上百万级别。关于此种模型的应用,目前有很多优秀的矿建已经在应用了,比如mina 和netty 等。上述中去掉线程池的第三种形式的变种,也 是Netty NIO的默认模式。

【NIO系列】——之Netty

采用官方的话来说:

Netty是一个高性能、异步事件驱动的网络应用框架。 基于Netty,可以快速的开发和部署高性能、 高可用的网络服务端和客户端应用。

Netty

Netty 是什么?
最透彻的Netty原理架构解析

相关文章

  • I/O系列

    NIO系列 【NIO系列】——之TCP探秘 网络的中的数据,最终通过多个路由器连接传送的。最底层的以太网协议规定了...

  • Java 基础(九)字符流

    终于结束了集合的学习,今天我们就开始学习 I/O的操作了。 I/O 系列的内容分为 I/O概述、字符流、字节流。今...

  • Linux文件描述符

    玩转Linux旧群已满,请加新群:278378501。 在Linux通用I/O模型中,I/O操作系列函数(系统调用...

  • I/O系列篇(二)伪异步I/O

    一、模型说明 1、伪异步I/O模型的模型图 2、相对于BIO的改进点 伪异步I/O模型采用线程池和队列技术,解决了...

  • Java开罐头——字符编码最全解析

    收纳进此专辑:I/O流官方中文指南系列概述及索引 内容参考: 知乎 @胖胖 ,深入分析 Java I/O 的工作机...

  • 。o゜。゜O。°゜O。°o°o゜o。O

    信仰……゜o。[!+!=I我]。!+!=I我]。!+!=I我]。!+!=I我]。°o°o゜o。[!+!=I我]。!...

  • 2021-04-19

    信仰……゜o。[!+!=I我]。!+!=I我]。!+!=I我]。!+!=I我]。°o°o゜o。[!+!=I我]。!...

  • 没有刘雯的同款身材,但我们可以get刘雯同款穿搭啊!

    - c o o l i n u - 原 创 时 尚 自 媒 体 + × MaxMara 2019春夏系列时装登陆米...

  • Linux I/O模型的前世今生

    Linux I/O模型 阻塞式I/O模型 非阻塞式I/O模型 I/O复用式模型 信号驱动式I/O模型 异步I/O模...

  • Socket

    一、I/O 模型阻塞式 I/O非阻塞式 I/OI/O 复用信号驱动 I/O异步 I/O五大 I/O 模型比较 二、...

网友评论

    本文标题:I/O系列

    本文链接:https://www.haomeiwen.com/subject/morchctx.html