阻塞IO和非阻塞IO

1 TCP协议

每个TCP通讯的的socket的内核里面都会有一个发送缓冲区和接收缓冲区linux

发送端 : send 报文 -- TCP发送缓冲区 --
接收端 :TCP接收缓冲区 -- receive TCP报文ajax

2 滑动窗口协议

1. “窗口”对应的是一段能够被发送者发送的字节序列,其连续的范围称之为“窗口”;

2. “滑动”则是指这段“容许发送的范围”是能够随着发送的过程而变化的,方式就是按顺序“滑动”。

-1. TCP协议的两端分别为发送者A和接收者B,因为是全双工协议,所以A和B应该分别维护着一个独立的发送缓冲区和接收缓冲区,因为对等性(A发B收和B发A收),咱们以A发送B接收的状况做为例子;
-2. 发送窗口是发送缓存中的一部分,是能够被TCP协议发送的那部分,其实应用层须要发送的全部数据都被放进了发送者的发送缓冲区;
-3. 发送窗口中相关的有四个概念:已发送并收到确认的数据(再也不发送窗口和发送缓冲区以内)、已发送但未收到确认的数据(位于发送窗口之中)、容许发送但还没有发送的数据以及发送窗口外发送缓冲区内暂时不容许发送的数据;
-4. 每次成功发送数据以后,发送窗口就会在发送缓冲区中按顺序移动,将新的数据包含到窗口中准备发送;
TCP创建链接的初始,B会告诉A本身的接收窗口大小,好比为‘20’缓存

3. 阻塞IO

发送一个消息,发送端必须准备好--发送缓冲区满,阻塞send操做,等缓冲区全部数据所有发出去后,send才能够继续发送
接收一个消息,接收端必须准备好 -- 接收缓冲区有一个大小,好比10,只有填满这个缓冲区,开始接收,接收完了,外面才能够再发送数据过来多线程

4. 非阻塞IO

解决IO线程和socket一个解耦问题,引入一个事件机制来达到解耦目的,进程底层存在一个IO的线程调度,它不断扫描每个socket缓冲区,当发现一个写缓冲区为空的时候,会产生一个socket可写事件通知一个线程去写数据,一次写不完 会等到下一次。 对于接收端,发现接收缓冲区可读,会发送一个可读事件给线程,若是不可读的话,这个线程就不会阻塞,能够去干其余事情。异步

5. IO的多路复用

这个事件机制,就是IO多路复用的模型,linux里面可使用select, 把线程扔到select里面
从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操做,效率更差。可是,使用select之后最大的优点是用户能够在一个线程内同时处理多个socket的IO请求。用户能够注册多个socket,而后不断地调用select读取被激活的socket,便可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中,必须经过多线程的方式才能达到这个目的。socket

6. 中间件设置缓冲区的大小,就是TCP缓冲区

同步和异步,表明当前请求,好比 ajax是异步tcp

针对当前请求的阻塞IO
同步阻塞,
同步非阻塞
异步阻塞
异步非阻塞函数

相关文章
相关标签/搜索