重识Nginx - 18 网络收发与Nginx事件间的对应关系

news/2024/5/1 4:59:02/文章来源:https://blog.csdn.net/yangshangwei/article/details/127168442

文章目录

  • 概述
  • 网络传输
  • TCP流与报文
  • TCP 协议与非阻塞接口
    • 读事件
    • 写事件
  • WireShark抓包分析
    • WireShark设置
    • 抓包分析

在这里插入图片描述

概述

Nginx是一个事件驱动的框架, 所谓事件即网络事件。 Nginx每个连接自然对应两个网络事件,即 读事件和写事件。

要想理解Nginx的原理,以及Nginx再各种极端场景下的处理时,就必须要先了解网络事件。


网络传输

在这里插入图片描述

假定主机 A 就是自己的电脑,主机 B 就是一台运行Nginx的服务器。

从主机 A 发送一个 HTTP 的 GET 请求到主机 B,这样的一个过程中主要经历了哪些事件?

通过上图数据流部分可以看出:

  • 应用层里发送了一个 GET 请求 -> 到了传输层

    ,这一步主要在做一件事,就是浏览器打开了一个端口,在 windows 的任务管理器中可以看到这一点,它会把这个端口记下来以及把 Nginx 打开的端口比如 80 或者 443 也记到传输层

  • 然后在网络层会记下我们主机所在的 IP 和目标主机,也就是 Nginx 所在服务器公网 IP

  • 到链路层以后 -> 经过以太网 -> 到达家里的路由器(网络层),家中的路由器会记录下所在运营商的一些下一段的 IP

  • 通过广域网 -> 跳转到主机 B 所在的机器中 -> 报文会经过链路层 -> 网络层 -> 到传输层,在传输层操作系统就知道是给那个打开了 80 或者 443 的进程,这个进程自然就是 Nginx

  • 那么 Nginx 在它的 HTTP 状态处理机里面(应用层)就会处理这个请求。

在这里插入图片描述


TCP流与报文

在上述过程中网络报文扮演了一个怎样的角色呢?

在这里插入图片描述

  • 数据链路层会在数据的前面 Header 部分和 Footer 部分添加上源 MAC 地址和源目的地址
  • 到了网络层则是 Nginx 的公网地址(目的 IP 地址)和浏览器的公网地址(源 IP 地址)
  • 到了 TCP 层(传输层),指定了 Nginx 打开的端口(目的端口)和浏览器打开的端口(源端口)
  • 然后应用层就是 HTTP 协议了。

这就是一个报文,也就是说我们发送的 HTTP 协议会被切割成很多小的报文,在网络层会切割叫 MTU,以太网的每个 MTU 是 1500 字节;

在 TCP 层(传输层) 会考虑中间每个环节中最大的一个 MTU 值,这个时候往往每个报文只有几百字节,这个报文大小我们称为叫 MSS ,所以每收到一个 MSS 小于这么大小的一个报文时其实就是一个网络事件。

MTU: Maximum Transmit Unit,最大传输单元,即物理接口(数据链路层)提供给其上层(通常是网络层)最大一次传输数据的大小;每个以太网帧都有最小的大小64bytes,最大不能超过1518bytes,对于小于或者大于这个限制都视为错误的数据帧。一般的以太网转发设备会丢弃这些数据帧。
由于以太网帧的帧头的14字节和帧尾 CRC 校验4字节共占了18字节,剩下的承载上层协议的地方也就是 Data 域最大就只剩1500字节

MSS:Maximum Segment Size ,传输层概念,TCP 数据包每次能够传输的最大量。为了达到最佳的传输效能,TCP 协议在建立连接的时候通常要协商双方的 MSS 值,这个值TCP协议在实现的时候往往用 MTU 值代替(需要减去 IP 数据包包头的大小20Bytes和 TCP 数据段的包头20Bytes)所以往往 MSS 为1460。通讯双方会根据双方提供的 MSS 值得最小值确定为这次连接的最大 MSS 值。

MTU,最大传输单元是指一种通信协议在某一层上面所能通过的最大数据报大小(以字节为单位),它通常与链路层协议有密切的关系。

以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes,最大不能超过1518bytes,对于小于或者大于这个限制都视为错误的数据帧。一般的以太网转发设备会丢弃这些数据帧。

以太网EthernetII最大的数据帧是1518Bytes,除去以太网帧的帧头14Bytes和帧尾CRC校验部分4Bytes,那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes,这个值我们就把它称之为MTU。

此MTU就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里面一样的道理。当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 )通过这段水管最大水量就要由中间最细的水管决定。

在这里插入图片描述


TCP 协议与非阻塞接口

我们来看下 TCP 协议中许多事件是怎样和我们日常调用的一些接口(比如 Accept、Read、Write、Close)是怎样关联在一起的?

在这里插入图片描述

读事件

  • 请求建立 TCP 连接事件实际上是发送了一个 TCP 报文,一个流程到达了 Nginx,对应的是读事件。因为对于 Nginx 来说,读取到了一个报文,所以就是 Accept 建立链接事件。

  • 如果是 TCP 连接可读事件,就是发送了一个消息,对于 Nginx 也是一个读事件,就是 Read 读消息。

  • 如果是对端(也就是浏览器)主动地关掉了,相当于 操作系统会去发送一个要求关闭链接的一个事件,对于 Nginx 来说还是一个读事件,因为它只是去读取一个报文。

写事件

那什么是写事件呢?

当需要向浏览器发送响应的时候,需要把消息写到操作系统中,要求操作系统发送到网络中,这就是一个写事件。

像这样的一些网络读写事件,通常在 Nginx 中或者任何一个异步事件的处理框架中,有个东西叫事件收集、分发器

它会定义每类事件处理的消费者,也就是说事件是一个生产者,是通过网络中自动的生产到我们的 Nginx 中的,我们要对每种事件建立一个消费者。

比如连接建立事件消费者,就是对 Accept 调用,HTTP 模块就会去建立一个新的连接。还有很多读消息或者写消息,在 HTTP 状态机中不同的时间段会调用不同的方法也就是每个消费者处理。

以上就是一个事件分发、消费器,包括 AIO 像异步读写磁盘事件,还有定时器事件,比如是否超时(worker_shutdown_timeout)。
在这里插入图片描述


WireShark抓包分析

WireShark设置

首先下载一个WireShark ,设置好要抓取的 目标IP和端口,如下 。
在这里插入图片描述

点击开始

在这里插入图片描述

在这里插入图片描述
此时还没有流量,接下来我们访问下 nginx

在这里插入图片描述

查看下wireshark
在这里插入图片描述

然后
在这里插入图片描述

进行分析


抓包分析

本机IP
在这里插入图片描述

  • 浏览器首先会打开这个页面,本地打开了一个 50283端口,而 Nginx 启动的是 8888 端口。
  • TCP 层主要做的是进程与进程之间通讯这件事。

在这里插入图片描述

  • IP 层主要解决机器与机器之间怎样互相找到的问题。

在这里插入图片描述

三次握手也就是 windows 先向 Nginx 发送了一次 [SYN],那么相反的 Nginx 所在的服务器也会向 windows 发送一个 [SYN].

这个时候 Nginx 是没有感知到的,因为这个连接还是处于半打开的状态。直到这台 windows 服务器再次发送 [ACK] 到 Nginx 所在的服务器之上时,Nginx 所在的操作系统才会去通知 Nginx 我们收到了一个读事件,这个读事件对应是建立一个新连接,所以此时 Nginx 应该调用 Accept 方法去建立一个新的连接。

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_18677.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【牛客刷题--SQL篇】SQL9查找除复旦大学的用户信息SQL10用where过滤空值练习

个人主页:与自己作战 大数据领域创作者 牛客刷题系列篇:【SQL篇】【Python篇】【Java篇】 推荐刷题网站注册地址:【牛客网–SQL篇】 推荐理由:从0-1起步,循序渐进 网址注册地址:【牛客网–注册地址】 文章目录一、条件…

算法得到3次(2次、3次、4次、5次、n次)B样条曲线公式( Matlab)

Matlab得到2次B样条曲线公式 Matlab得到3次B样条曲线公式 Matlab得到4次B样条曲线公式 Matlab得到5次B样条曲线公式 Matlab得到6次B样条曲线公式 Matlab得到。。。。曲线公式 Matlab得到n次B样条曲线公式 B样条曲线公式 %% %%%%%%%%%%%%%%%%%%%%%%%B样条曲线测试%%%%%%%…

grep练习题

找出有关root的行 grep root pwd.txt找出root用户的行 grep ^root /etc/passwd匹配以root开头的行或者以dwj开头的行 grep ^(root|dwj) /etc/passwd过滤出bin开头的行,且显示行号 grep -n ^bin /etc/passwd过滤掉root开头的行 grep -v ^root /etc/passwd统计dwj用户…

【问题解决】大佬亲授的姿势——PlatformIO生成bin文件方法

微信关注公众号 “DLGG创客DIY”设为“星标”,重磅干货,第一时间送达。最近写创客项目程序基本都用PlatformIO(以后简称PIO),PIO在很多方面都优于arduino IDE,今天就不展开了啊,回头专门起一篇文…

Probabilistic Case-based Reasoning forOpen-World Knowledge Graph Completion

摘要 基于案例的推理(CBR)系统通过检索与给定问题相似的“案例”来解决新问题。如果这样一个系统能够达到很高的精度,它就会因为它的简单性、可解释性和可扩展性而具有吸引力。 在本文中,我们证明了这样一个系统是可实现的推理知识库(KBs)。我们的方法…

大数据讲课笔记4.2 HDFS架构和原理

文章目录零、学习目标一、导入新课二、新课讲解(一)HDFS存储架构(二)HDFS文件读写原理1、HDFS写数据原理2、HDFS读数据原理三、归纳总结四、上机操作零、学习目标 了解HDFS存储架构理解HDFS文件读写原理 一、导入新课 通过上次…

[Linux-文件I/O] 文件函数系统文件接口缓冲区文件描述符dup2inode软硬链接动静态库

[Linux-文件I/O] 文件函数&系统文件接口&缓冲区&文件描述符&dup2&inode&软硬链接&动静态库文件IOC语言文件操作系统接口文件操作文件描述符文件描述符分配进程和文件之间的对应关系是如何建立的?打开用openmode关闭用close读用read写用…

TEE OS中断篇(一):系统的中断处理

前面我学习了线程方面的东西,这个假期,空闲了来看看《手机安全和可信应用开发指南》这本书的中断篇。 中断处理一个完整的系统都会存在中断,ARMv7架构扩展出了Monitor模式而ARMv8使用EL的方式对ARM异常运行模式进行了重新定义,分为…

Spring 测试运行的时候提示 Unable to find a @SpringBootConfiguration 错误

Spring 进行测试的时候提示的错误信息如下: SEVERE: Caught exception while closing extension context: org.junit.jupiter.engine.descriptor.JupiterEngineExtensionContext@c63c11ed java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you n…

Flink学习笔记(4)——Flink运行架构

目录 一、Flink运行时架构 1.1 系统架构 1.1.1 整体构成 1.1.2 作业管理器(JobManager) 1.1.3 任务管理器(TaskManager) 1.2 作业提交流程 1.2.1 高层级抽象视角 1.2.2 独立模式(Standalone) 1.2.…

SpringCloud 使用 Turbine 聚合监控 Hystrix 健康状态

Hystrix 的降级熔断,只是被迫的折中方案,并不是我们所期望的结果,我们还是期望系统能够永远健康运行。绝大多数情况下,一个系统有很多微服务组成,在高峰期很可能个别微服务会发生降级熔断,我们必须能够通过监控才行,这样才能快速发现并解决问题。 Hystrix 是 Netflix 的…

soc的核间通信机制-->mailbox

对于mailbox,这个东西其实看到了很多次,但是一直不知道是啥。这里大概看了一下,知道了为甚有这个玩意儿,以及这个玩意相关的有啥,至于具体怎么使用,以及详细的工作原因等着以后再说吧。 正文 目前很多芯片…

微信小程序开发实战(SM周期及WXS脚本)

作者 : SYFStrive 博客首页 : HomePage 📜: 微信小程序 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &#x1f4…

webshell 提权

在我们使用cve或者其他方式获取shell 后 python -c import pty;pty.spawn("/bin/bash") 获取一个交互式的bash shell 使用id 命令可以查看当前的用户权限 查看当前的linux 系统版本 利用kali自带的漏洞检索库检索漏洞 searchsploit privilege | grep -i linux |…

【MySQL】数据库介绍以及MySQL数据库

目录 数据库介绍 数据库概述 数据表 MySql数据库 MySql安装 登录MySQL数据库 ​​​​​​​SQLyog(MySQL图形化开发工具) 数据库介绍 数据库概述 什么是数据库(DB:DataBase) 数据库就是存储数据的仓库,其本质是一个文件系统&#…

实训任务1:Linux基本操作

文章目录一、实训目的二、实训要求三、实训任务1、创建并配置三个虚拟机2、创建SSH连接3、实现IP地址与主机名的映射4、关闭和禁用防火墙5、创建目录结构6、压缩打包7、安装软件包8、创建脚本文件9、直接运行脚本10、虚拟机相互免密登录11、远程拷贝文件一、实训目的 通过实训…

代谢组学和宏基因组学研究不同添加剂对青贮品质的影响

​ 发表期刊:Bioresource Technology 影响因子:9.642 百趣生物提供服务:代谢组学宏基因组 研究背景 人口增长促进了全球肉类和牛奶消费量增加,养殖所需饲料用量也逐年上升,发酵后的饲料是进行农副产品处理更好的选…

大数据技术Spark3.0详解

一、Spark3.0 简介 Spark3.0版本包含了3400多个补丁程序,是开源社区做出巨大贡献的最高峰,带来了Python和SQL功能的重大进步,并着眼于探索和生产的易用性。 1、Spark3.0新功能 (1)通过自适应查询执行,动…

基于物联网的智能厨房安全监测系统-上位机程序

CSDN话题挑战赛第2期 参赛话题:学习笔记 博客写作背景----项目中解决的问题 最近遇到一个基于TCP/IP网络的远程智能物联网系统,采用Arduino Uno控制器作为下位机,采用LabVIEW作为远程监控软件,两者通过网络实现通信。初步定为使…

2022/10/4——基于stm32mp157a的M4核的中断实验

本次实验采用STM32CubeMX软件进行元器件的初始化 本次实验采用的中断源为三个按键和光电开关、火焰传感器、人体红外。其实验接口分别为: key1------>PF9 key2------>PF7 key3------>PF8(检测方式:下降沿) 光电开…