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.pswp.cn/news/394939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394939.shtml
英文地址,請注明出處:http://en.pswp.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…