windows nginx c++读取请求数据_轻松应对百万并发的Nginx,搞懂LinuxC/C++这些技术栈升职加薪...

在深入了解 Nginx 各种原理及在极端场景下的一些错误场景处理时,需要首先理解什么是网络事件。

Nginx 是一个事件驱动的框架,所谓事件主要指的是网络事件,Nginx 每个网络连接会对应两个网络事件,一个读事件一个写事件。在深入了解 Nginx 各种原理及在极端场景下的一些错误场景处理时,需要首先理解什么是网络事件。

网络传输

fb9d85fb938c97872b6f452b1ed2b47c.png

接下来看上面这张图,比如主机 A 就是一台家里的笔记本电脑,那么主机 B 就是一台服务器,上面跑着 Nginx 服务。从主机 A 发送一个 HTTP 的 GET 请求到主机 B,这样的一个过程中主要经历了哪些事件?通过上图数据流部分可以看出:

应用层里发送了一个 GET 请求 -> 到了传输层,这一步主要在做一件事,就是浏览器打开了一个端口,在 windows 的任务管理器中可以看到这一点,他会把这个端口记下来以及把 Nginx 打开的端口比如 80 或者 443 也记到传输层 -> 然后在网络层会记下我们主机所在的 IP 和目标主机,也就是 Nginx 所在服务器公网 IP -> 到链路层以后 -> 经过以太网 -> 到达家里的路由器(网络层),家中的路由器会记录下所在运营商的一些下一段的 IP -> 通过广域网 -> 跳转到主机 B 所在的机器中 -> 报文会经过链路层 -> 网络层 -> 到传输层,在传输层操作系统就知道是给那个打开了 80 或者 443 的进程,这个进程自然就是 Nginx -> 那么 Nginx 在他的 HTTP 状态处理机里面(应用层)就会处理这个请求。

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

TCP流与报文 (文末有福利)

6323e7231ee28e645592ed4b5a401857.png

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

这就是一个报文,也就是说我们发送的 HTTP 协议会被切割成很多小的报文,在网络层会切割叫 MTU,以太网的每个 MTU 是 1500 字节;在 TCP 层(传输层)呢 , 会考虑中间每个环节中最大的一个 MTU 值,这个时候往往每个报文只有几百字节,这个报文大小我们称为叫 MSS ,所以每收到一个 MSS 小于这么大小的一个报文时其实就是一个网络事件。

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

TCP 协议与非阻塞接口(文末有福利)

4c00e147169b4af4630f92dc7270ebee.png

请求建立 TCP 连接事件实际上是发送了一个 TCP 报文,通过上面第二部分讲解的那样的一个流程到达了 Nginx,对应的是读事件。因为对于 Nginx 来说,我读取到了一个报文,所以就是 Accept 建立链接事件。

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

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

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

像这样的一些网络读写事件,通常在 Nginx 中或者任何一个异步事件的处理框架中,他会有个东西叫事件收集、分发器。会定义每类事件处理的消费者,也就是说事件是一个生产者,是通过网络中自动的生产到我们的 Nginx 中的,我们要对每种事件建立一个消费者。比如连接建立事件消费者,就是对 Accept 调用,HTTP 模块就会去建立一个新的连接。还有很多读消息或者写消息,在 HTTP 状态机中不同的时间段会调用不同的方法也就是每个消费者处理。

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

Nginx 网络事件实例

上面介绍了网络报文的发送以及对应的 Nginx 中的网络事件,比如 Accept 建立一条新连接其实是收到一条读事件,接下来我们通过抓包来分析建立三次握手时时怎么样让 Nginx 收到读事件,使用的抓包工具是 Wireshark。

f8f3881c2ed307249aa98141adbb218b.png

首先我们安装 Wireshark 软件,并对 Nginx 所在 IP 和端口进行抓包,然后访问页面,在 TCP 层主要说两件事情:

•浏览器首先会打开这个页面,本地打开了一个 1875 端口,而 Nginx 启动的是 8080 端口。

•TCP 层主要做的是进程与进程之间通讯这件事。

bcf7190bed3dfc319752d81d0d9f998b.png

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

4a52a93e148d21a65b4efe1c3a45d6a5.png

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

以上我们通过 Wireshark 抓包演示了正常的三次握手是怎么样引发一个读事件来使得 Nginx 去处理这样一个读事件来建立新的连接的。

总结

这篇文章主要讲解了网络事件,并通过抓包来分析 Nginx 网络事件,这对我们理解 Nginx 异步处理框架是非常有帮助的,包括 OpenResty 也是强依赖于网络事件以及事件分发的。

ec8b36a6ce29ae8ef74f6525c1e5fe60.png

感谢支持!关注小编,后台私信《Linux》获取更多C++/Linux后台开发进阶视频资料,BAT面试题总结!

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

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

相关文章

github 6月开源项目_我的开源项目如何在短短5天内在GitHub上赢得6,000颗星

github 6月开源项目Last month I launched two open source projects on GitHub. A few days later, my Front-End Checklist was showing more than 6,000 stars (17,000 as of writing). And I got 600 stars for my Resources-Front-End-Beginner project!上个月&#xff0c…

如何成为一位牛逼的高手

郑昀 演讲稿 创建于2016/9/15 最后更新于2016/9/21 很多人都在思考一个问题: 怎样才能想出来一个牛逼的 idea? 有一位喜欢抽烟喝酒烫头的大师 给出了答案: 这事儿吧,简单,一共分两步。 第一步先让自己成为一个牛逼的人…

thinkphp html php文件,ThinkPHP生成静态HTML文件

View.class.php/*** 加载模板和页面输出 可以返回输出内容* access public* param string $templateFile 模板文件名* param string $charset 模板输出字符集* param string $contentType 输出类型* param string $content 模板输出内容* param string $prefix 模板缓存前缀* r…

day01语法python入门_2

十:while循环 1.基本循环 while条件#循环体#如果条件为真,那么循环体则执行#如果条件为假,那么循环体不执行。2.break break 用于退出所有循环 while True:print "123"breakprint "456"3.continue while True:print &quo…

Python dict() 函数

Python dict() 函数 Python 内置函数 描述 dict() 函数用于创建一个字典。 语法 dict 语法: class dict(**kwarg) class dict(mapping, **kwarg) class dict(iterable, **kwarg) 参数说明: **kwargs -- 关键字mapping -- 元素的容器。iterable -- 可迭代…

贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!

一、原理 转自:http://www.2cto.com/kf/201401/275838.html Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation Property Animation中最重要,最基础的一个类就是ValueAnimator了。Property Animation利用ValueAnimator来跟踪记录对象属性已…

ios pusher使用_如何使用JavaScript和Pusher构建实时图

ios pusher使用by Rahat Khanna通过拉哈特汉娜 如何使用JavaScript和Pusher构建实时图 (How to build a Realtime Graph using JavaScript and Pusher) The world needs everything uber-fast now. There are plenty of data streams being generated by different systems ev…

python数据分析与基础实战_《python数据分析与挖掘实战》基础概念

数据建模.png 数据挖掘的基本任务:利用分类与预测、聚类分析、关联规则、时序模式、偏差检测、智能推荐等方法,帮助企业提取数据中蕴含的商业价值,提高企业竞争力。 数据探索:异常值分析、缺失值分析、相关分析和周期性分析。 数据预处理:数据…

简述JAVA线程调度的原理,Rxjava原理(二)--线程调度

1. 创建线程池和线程管理策略分析// 在开发中使用Rxjava来完成线程切换会调用到以下方法(还有几个就不一一列举了,原理一样的),那么就从这里开始分析Schedulers.io()Schedulers.computation()Schedulers.newThread()AndroidSchedulers.mainThread()当我们…

[前端随笔][css] 弹性布局

说在前面 弹性布局&#xff0c;顾名思义就是有弹性&#xff0c;能够根据屏幕/当前空间大小自由伸缩的。使用弹性布局可以很好的适应各种尺寸的客户端。 关键代码 display:flex;    设定元素为弹性布局  <文档传送门> box-flex: 参数;   设定元素为弹性布局  &…

不同的模块中定义同样的宏为不同的值合法吗_如何创建自定义的建模规范

本文摘要&#xff1a;主要介绍如何创建自定义的建模规范检查&#xff0c;以及在建模规范检查中&#xff0c;如何增加自动修正模型使之符合规范。比如我们想创建一个自定义的规则&#xff0c;对于constant模块&#xff0c;1. 如果value是参数的话&#xff0c;则输出数据类型必须…

DBCP连接池配置常用参数说明

参数默认值说明username\传递给JDBC驱动的用于建立连接的用户名password\传递给JDBC驱动的用于建立连接的密码url\传递给JDBC驱动的用于建立连接的URLdriverClassName\使用的JDBC驱动的完整有效的Java 类名initialSize 0初始化连接:连接池启动时创建的初始化连接数量,1.2版本后…

科大讯飞 ai算法挑战赛_为井字游戏挑战构建AI算法

科大讯飞 ai算法挑战赛by Ben Carp通过本卡尔普 为井字游戏挑战构建AI算法 (Building an AI algorithm for the Tic-Tac-Toe challenge) As part of the freeCodeCamp curriculum, I was challenged build a Tic-Tac-Toe web app. It was a real pleasure.作为freeCodeCamp课程…

js serialize php 解,[转]JavaScript 版本的 PHP serialize/unserialize 完整实现

下载: phpserializer.js/* phpserializer.js - JavaScript to PHP serialize / unserialize class.** This class is designed to convert php variables to javascript* and javascript variables to php with a php serialize unserialize* compatible way.** Copyright (C) …

Git 的 .gitignore 配置

.gitignore 配置文件用于配置不需要加入版本管理的文件&#xff0c;配置好该文件可以为我们的版本管理带来很大的便利&#xff0c;以下是个人对于配置 .gitignore 的一些心得。 1、配置语法&#xff1a; 以斜杠“/”开头表示目录&#xff1b; 以星号“*”通配多个字符&#xff…

wsdl文件是怎么生成的_C++ 动态库.dll的生成---超级详细!!!

怎么将建好的工程生成.dll工程&#xff1f;1、在C中打开工程2、运行结果&#xff1a;输出Print修改开始&#xff1a;1、打开属性。2、修改以下内容&#xff1a;目标文件扩展名&#xff0c;由.exe--》.dll,直接删除修改即可配置类型&#xff0c;由.exe--》.dll,下拉菜单可选择最…

时钟设置

date --set"05/31/16 18:16" 时钟设置 设置系统时间# date --set“07/07/06 10:19" &#xff08;月/日/年 时:分:秒&#xff09;2、hwclock/clock查看硬件时# hwclock --show# clock --show设置硬件时间# hwclock --set --date"07/07/06 10:19" &…

《成为一名机器学习工程师》_成为机器学习的拉斐尔·纳达尔

《成为一名机器学习工程师》by Sudharsan Asaithambi通过Sudharsan Asaithambi 成为机器学习的拉斐尔纳达尔 (Become the Rafael Nadal of Machine Learning) One year back, I was a newbie to the world of Machine Learning. I used to get overwhelmed by small decisions…

HTTP基本认证(Basic Authentication)的JAVA示例

大家在登录网站的时候&#xff0c;大部分时候是通过一个表单提交登录信息。但是有时候浏览器会弹出一个登录验证的对话框&#xff0c;如下图&#xff0c;这就是使用HTTP基本认证。下面来看看一看这个认证的工作过程:第一步: 客户端发送http request 给服务器,服务器验证该用户…

php-fpm 内存 facebook,【百家号】脸书百科,安装php-fpm-5.4.16-42.遇到的小问题 Web程序 - 贪吃蛇学院-专业IT技术平台...

环境&#xff1a;redhat 7.2版本 yum源也是7.2的iso[[email protected] lnmp_soft]# yum -y install php-fpm-5.4.16-42.el7.x86_64.rpm已加载插件&#xff1a;langpacks, product-id, search-disabled-repos, subscription-managerThis system is not registered to Red Hat S…