自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

輕松應(yīng)對(duì)百萬(wàn)并發(fā)的Nginx,你知道它是怎么處理這些網(wǎng)絡(luò)事件的嗎?

運(yùn)維 系統(tǒng)運(yùn)維
在深入了解 Nginx 各種原理及在極端場(chǎng)景下的一些錯(cuò)誤場(chǎng)景處理時(shí),需要首先理解什么是網(wǎng)絡(luò)事件。

 [[312036]] 

Nginx 是一個(gè)事件驅(qū)動(dòng)的框架,所謂事件主要指的是網(wǎng)絡(luò)事件,Nginx 每個(gè)網(wǎng)絡(luò)連接會(huì)對(duì)應(yīng)兩個(gè)網(wǎng)絡(luò)事件,一個(gè)讀事件一個(gè)寫事件。在深入了解 Nginx 各種原理及在極端場(chǎng)景下的一些錯(cuò)誤場(chǎng)景處理時(shí),需要首先理解什么是網(wǎng)絡(luò)事件。

網(wǎng)絡(luò)傳輸

 

接下來(lái)看上面這張圖,比如主機(jī) A 就是一臺(tái)家里的筆記本電腦,那么主機(jī) B 就是一臺(tái)服務(wù)器,上面跑著 Nginx 服務(wù)。從主機(jī) A 發(fā)送一個(gè) HTTP 的 GET 請(qǐng)求到主機(jī) B,這樣的一個(gè)過(guò)程中主要經(jīng)歷了哪些事件?通過(guò)上圖數(shù)據(jù)流部分可以看出:

應(yīng)用層里發(fā)送了一個(gè) GET 請(qǐng)求 -> 到了傳輸層,這一步主要在做一件事,就是瀏覽器打開了一個(gè)端口,在 windows 的任務(wù)管理器中可以看到這一點(diǎn),他會(huì)把這個(gè)端口記下來(lái)以及把 Nginx 打開的端口比如 80 或者 443 也記到傳輸層 -> 然后在網(wǎng)絡(luò)層會(huì)記下我們主機(jī)所在的 IP 和目標(biāo)主機(jī),也就是 Nginx 所在服務(wù)器公網(wǎng) IP -> 到鏈路層以后 -> 經(jīng)過(guò)以太網(wǎng) -> 到達(dá)家里的路由器(網(wǎng)絡(luò)層),家中的路由器會(huì)記錄下所在運(yùn)營(yíng)商的一些下一段的 IP -> 通過(guò)廣域網(wǎng) -> 跳轉(zhuǎn)到主機(jī) B 所在的機(jī)器中 -> 報(bào)文會(huì)經(jīng)過(guò)鏈路層 -> 網(wǎng)絡(luò)層 -> 到傳輸層,在傳輸層操作系統(tǒng)就知道是給那個(gè)打開了 80 或者 443 的進(jìn)程,這個(gè)進(jìn)程自然就是 Nginx -> 那么 Nginx 在他的 HTTP 狀態(tài)處理機(jī)里面(應(yīng)用層)就會(huì)處理這個(gè)請(qǐng)求。

在上述過(guò)程中網(wǎng)絡(luò)報(bào)文扮演了一個(gè)怎樣的角色呢?

TCP流與報(bào)文

 

數(shù)據(jù)鏈路層會(huì)在數(shù)據(jù)的前面 Header 部分和 Footer 部分添加上源 MAC 地址和源目的地址 -> 到了網(wǎng)絡(luò)層則是 Nginx 的公網(wǎng)地址(目的 IP 地址)和瀏覽器的公網(wǎng)地址(源 IP 地址)-> 到了 TCP 層(傳輸層),指定了 Nginx 打開的端口(目的端口)和瀏覽器打開的端口(源端口)-> 然后應(yīng)用層就是 HTTP 協(xié)議了。

這就是一個(gè)報(bào)文,也就是說(shuō)我們發(fā)送的 HTTP 協(xié)議會(huì)被切割成很多小的報(bào)文,在網(wǎng)絡(luò)層會(huì)切割叫 MTU,以太網(wǎng)的每個(gè) MTU 是 1500 字節(jié);在 TCP 層(傳輸層)呢會(huì)考慮中間每個(gè)環(huán)節(jié)中最大的一個(gè) MTU 值,這個(gè)時(shí)候往往每個(gè)報(bào)文只有幾百字節(jié),這個(gè)報(bào)文大小我們稱為叫 MSS ,所以每收到一個(gè) MSS 小于這么大小的一個(gè)報(bào)文時(shí)其實(shí)就是一個(gè)網(wǎng)絡(luò)事件。

這個(gè)時(shí)候,我們來(lái)看下 TCP 協(xié)議中許多事件是怎樣和我們?nèi)粘U{(diào)用的一些接口(比如Accept、Read、Write、Close)是怎樣關(guān)聯(lián)在一起的?

TCP 協(xié)議與非阻塞接口

 

請(qǐng)求建立 TCP 連接事件實(shí)際上是發(fā)送了一個(gè) TCP 報(bào)文,通過(guò)上面第二部分講解的那樣的一個(gè)流程到達(dá)了 Nginx,對(duì)應(yīng)的是讀事件。因?yàn)閷?duì)于 Nginx 來(lái)說(shuō),我讀取到了一個(gè)報(bào)文,所以就是 Accept 建立鏈接事件。

如果是 TCP 連接可讀事件,就是發(fā)送了一個(gè)消息,對(duì)于 Nginx 也是一個(gè)讀事件,就是 Read 讀消息。

如果是對(duì)端(也就是瀏覽器)主動(dòng)地關(guān)掉了,相當(dāng)于 windows 操作系統(tǒng)會(huì)去發(fā)送一個(gè)要求關(guān)閉鏈接的一個(gè)事件,對(duì)于 Nginx 來(lái)說(shuō)還是一個(gè)讀事件,因?yàn)樗皇侨プx取一個(gè)報(bào)文。

那什么是寫事件呢?當(dāng)我們的瀏覽器需要向?yàn)g覽器發(fā)送響應(yīng)的時(shí)候,需要把消息寫到操作系統(tǒng)中,要求操作系統(tǒng)發(fā)送到網(wǎng)絡(luò)中,這就是一個(gè)寫事件。

像這樣的一些網(wǎng)絡(luò)讀寫事件,通常在 Nginx 中或者任何一個(gè)異步事件的處理框架中,他會(huì)有個(gè)東西叫事件收集、分發(fā)器。會(huì)定義每類事件處理的消費(fèi)者,也就是說(shuō)事件是一個(gè)生產(chǎn)者,是通過(guò)網(wǎng)絡(luò)中自動(dòng)的生產(chǎn)到我們的 Nginx 中的,我們要對(duì)每種事件建立一個(gè)消費(fèi)者。比如連接建立事件消費(fèi)者,就是對(duì) Accept 調(diào)用,HTTP 模塊就會(huì)去建立一個(gè)新的連接。還有很多讀消息或者寫消息,在 HTTP 狀態(tài)機(jī)中不同的時(shí)間段會(huì)調(diào)用不同的方法也就是每個(gè)消費(fèi)者處理。

以上就是一個(gè)事件分發(fā)、消費(fèi)器,包括 AIO 像異步讀寫磁盤事件,還有定時(shí)器事件,比如是否超時(shí)(worker_shutdown_timeout)。

Nginx 網(wǎng)絡(luò)事件實(shí)例

上面介紹了網(wǎng)絡(luò)報(bào)文的發(fā)送以及對(duì)應(yīng)的 Nginx 中的網(wǎng)絡(luò)事件,比如 Accept 建立一條新連接其實(shí)是收到一條讀事件,接下來(lái)我們通過(guò)抓包來(lái)分析建立三次握手時(shí)時(shí)怎么樣讓 Nginx 收到讀事件,使用的抓包工具是 Wireshark。

 

首先我們安裝 Wireshark 軟件,并對(duì) Nginx 所在 IP 和端口進(jìn)行抓包,然后訪問(wèn)頁(yè)面,在 TCP 層主要說(shuō)兩件事情:

•瀏覽器首先會(huì)打開這個(gè)頁(yè)面,本地打開了一個(gè) 1875 端口,而 Nginx 啟動(dòng)的是 8080 端口。

•TCP 層主要做的是進(jìn)程與進(jìn)程之間通訊這件事。

 

IP 層主要解決機(jī)器與機(jī)器之間怎樣互相找到的問(wèn)題。

 

三次握手也就是 windows 先向 Nginx 發(fā)送了一次 [SYN],那么相反的 Nginx 所在的服務(wù)器也會(huì)向 windows 發(fā)送一個(gè) [SYN],這個(gè)時(shí)候 Nginx 是沒(méi)有感知到的,因?yàn)檫@個(gè)連接還是處于半打開的狀態(tài)。直到這臺(tái) windows 服務(wù)器再次發(fā)送 [ACK] 到 Nginx 所在的服務(wù)器之上時(shí),Nginx 所在的操作系統(tǒng)才會(huì)去通知 Nginx 我們收到了一個(gè)讀事件,這個(gè)讀事件對(duì)應(yīng)是建立一個(gè)新連接,所以此時(shí) Nginx 應(yīng)該調(diào)用 Accept 方法去建立一個(gè)新的連接。

以上我們通過(guò) Wireshark 抓包演示了正常的三次握手是怎么樣引發(fā)一個(gè)讀事件來(lái)使得 Nginx 去處理這樣一個(gè)讀事件來(lái)建立新的連接的。

總結(jié)

這篇文章主要講解了網(wǎng)絡(luò)事件,并通過(guò)抓包來(lái)分析 Nginx 網(wǎng)絡(luò)事件,這對(duì)我們理解 Nginx 異步處理框架是非常有幫助的,包括 OpenResty 也是強(qiáng)依賴于網(wǎng)絡(luò)事件以及事件分發(fā)的。

 

責(zé)任編輯:龐桂玉 來(lái)源: 運(yùn)維之美
相關(guān)推薦

2023-01-28 10:27:04

2022-10-14 18:19:41

YouTube

2023-01-16 08:09:51

SpringMVC句柄

2020-12-04 08:32:12

Linux特殊名字

2023-10-23 09:44:00

并發(fā)管理線程

2019-09-23 08:46:04

零拷貝 CPU內(nèi)存

2018-06-27 09:51:17

2024-01-31 08:50:41

Guava并發(fā)工具

2020-07-06 12:09:24

DNS域名系統(tǒng)IP地址

2021-08-05 18:21:29

Autowired代碼spring

2018-05-11 15:53:59

2019-07-03 14:34:39

Docker云計(jì)算技術(shù)

2017-01-17 10:09:22

Linux操作系統(tǒng)應(yīng)用程序

2019-09-19 17:38:10

5G技術(shù)人生第一份工作

2023-12-07 08:13:58

Java開發(fā)

2016-05-30 10:06:12

用友iUAP壓力測(cè)試

2016-03-18 19:03:35

認(rèn)知計(jì)算IBM

2018-08-07 09:29:35

數(shù)據(jù)庫(kù)MySQL優(yōu)化方法

2021-11-10 15:37:49

Go源碼指令

2020-12-08 09:28:26

Chrome函數(shù)代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)