网络收发与Nginx事件间的对应关系
请求建立TCP事件其实是发送的TCP报文到达了Nginx,所以其实是一个读事件,对于Nginx来说读取到了报文就是Accept建立连接的事件。TCP可读事件也就是对于Nginx发送了消息其实也是一个读事件,也就是Read读消息。如果浏览器主动关闭了,那么windows操作系统会去发送一个关闭连接的事件对于Nginx来说还是一个读事件,因为只是读取一个报文。
当Nginx要向浏览器发送响应的时候,需要将消息写到操作系统当中,然后发送到网络当中这就是一个写事件。
Nginx中的事件驱动模型
Nginx服务器响应和处理Web请求的过程,就是基于事件驱动模型的,它也包含事件收集器、事件发送器和事件处理器等三部分基本单元。Nginx的“事件收集器”和“事件发送器”的实现没有太大的特点,重点介绍一下它的“事件处理器”。
通常,我们在编写服务器处理模型的程序时,基于事件驱动模型,“目标对象”中的“事件处理器”可以有以下几种实现办法:
- “事件发送器”每传递过来一个请求,“目标对象”就创建一个新的进程,调用“事件处理器”来处理该请求。
- “事件发送器”每传递过来一个请求,“目标对象”就创建一个新的线程,调用“事件处理器”来处理该请求。
- “事件发送器”每传递过来一个请求,“目标对象”就将其放入一个待处理事件的列表,使用非阻塞I/O方式调用“事件处理器”来处理该请求。
以上的三种处理方式,各有特点:
第一种方式,由于创建新的进程的开销比较大,会导致服务器性能比较差,但其实现相对来说比较简单。
第二种方式,由于要涉及到线程的同步,故可能会面临死锁、同步等一系列问题,编码比较复杂。
第三种方式,在编写程序代码时,逻辑比前面两种都复杂。大多数网络服务器采用了第三种方式,逐渐形成了所谓的“事件驱动处理库”。
事件驱动处理库又被称为多路IO复用方法,最常见的包括以下三种:select模型,poll模型和epoll模型。Nginx服务器还支持rtsig模型、kqueue模型、dev/poll模型和eventport模型等。通过Nginx配置可以使得Nginx服务器支持这几种事件驱动处理模型。
Nginx网络事件实例演示
1、TCP层:本地打开了53842,Nginx打开的是8080端口 进程与进程通信这件事情
2、IP层:本机IP地址:192.168.0.109 nginx服务器的IP地址:192.168.0.123(机器和机器之前怎么互相找到的问题)
3、三次握手
- windows先向nginx发送一个SYN
- 相反的nginx所在的linux也会向windos发送一个SYN,这个时候nginx是没有感知到的、因为这是一个半打开的状态
- 直到widows再向nginx所在的linux服务器发送一个ACK时,linux操作系统才会通知nginx这时有一个读事件需要处理,这个读事件是建立新的连接。此时nginx调用accept方法去建立一个新的连接
上面就是通过抓包描述了三次握手是怎么引发一个读事件,以及根据这个读事件来建立连接的