一、阻塞/非阻塞i,同步/异步(网络IO)
典型的一次IO的两个阶段,数据就绪和数据读写
数据就绪:根据系统IO操作的就绪状态分为阻塞和非阻塞,表现得结果就是,阻塞当前线程或是直接返回。
数据读写:根据应用程序和内核的交互方式分为同步和异步。
在处理IO的时候,阻塞和非阻塞都是同步IO,只有在使用了特殊的API才是异步IO
同步表示A向B请求调用一个网络IO接口时,其数据的读写都是由请求方A自己来完成的(不管阻塞还非阻塞);
异步表示A向B请求调用一个网络IO接口的时候,向B传入请求的事件以及事件发生时通知的方式,A就可以处理其他逻辑了,当B监听到事件处理完成后,会用事先与欸的那个好的通知方式,通知A处理结果。
二、Unix/Linux上的五种IO模型
1、阻塞blocking
调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停地去检查这个函数有没有返回,必须等待这个函数返回了才能进行下一步动作。
2、非阻塞non-blocking
非阻塞等待,每隔一段时间就去检测IO事件是否就绪,没有就绪就可以做其他事情。非阻塞IO执行系统调用总是立即返回,不管事件是否已经发生,弱事件没有发生就返回-1,此时可以根据errno区分这两种情况,对于accept,recv和send,事件未发生时errno通常被设置成EAGAIN。
3、IO复用
Linux用select/poll/epoll函数实现IO复用模型,这些函数也会使进程阻塞,但是和阻塞IO所不同的是这些函数可以同时阻塞多个IO操作,而且可以同时对多个读操作、写操作的IO函数进行检测。直到有数据可读或可写才真正调用IO操作函数。
4、信号驱动
Linux用一套接口进行信号驱动,安装一个信号处理函数,进程继续运行并不阻塞,当IO事件就绪,进程收到SIGIO信号然后处理IO事件。
内核在第一个阶段是异步,在第二个阶段是同步,与阻塞IO的区别在于它提供了消息通知机制,不需要用户进程不断地轮询检查,减少了系统API地调用次数,提高了效率。
5、异步
Linux中,可以调用aio_read函数告诉内核描述字缓冲区指针和缓冲区大小、文件偏移及通知方式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序。
三、WebServer
通常用户使用Web浏览器与相应的服务器进行通讯,在浏览器中键入“域名”或者“IP地址:端口号”浏览器则 先将你的域名解析成相应的 IP 地址或者直接根据你的IP地址向对应的 Web 服务器发送一个 HTTP 请 求。这一过程首先要通过 TCP 协议的三次握手建立与目标 Web 服务器的连接,然后 HTTP 协议生成针 对目标 Web 服务器的 HTTP 请求报文,通过 TCP、IP 等协议发送到目标 Web 服务器上。
四、HTTP协议
超文本传输协议(HTTP)是一个简单的请求-相应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的相应响应。请求和响应消息的头以ASCll形式给出;而消息内容则具有一个类似MIME的格式,HTTP协议是万维网的数据通信的基础。
通常由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的 TCP 连接。HTTP 服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比 如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。