一、HTTP協議和Nginx
1.套接字Socket
套接字Socket是進程間通信IPC的一種實現,允許位于不同主機(或同一主機)上不同進程之間進行通信和數據交換,SocketAPI出現于1983年BSD4.2實現在建立通信連接的每一端,進程間的傳輸要有兩個標志:IP地址和端口號,合稱為套接字地址 socket address
1.客戶機套接字地址定義了一個唯一的客戶進程
2.服務器套接字地址定義了一個唯一的服務器進程
套接字的系統調用:
socket() | 創建一個套接字 |
bind() | 綁定IP和端口 |
listen() | 監聽 |
accept() | 接收請求 |
connect() | 請求連接建立 |
write() | 發送 |
read() | 接收 |
close() | 關閉連接 |
2.URI
URI(Uniform Resource Identifier ):統一資源標識,分為URL和URN
1.URL
URL是統一資源定位符,用于描述某服務器某特定資源位置
2.URN
URN是統一資源命名
3.URL和URN的區別
URN如同一個人的名稱,而URL代表一個人的住址。URN定義某事物的身份,而URL提供查找該事物的方法,URN僅用于命名而不指定地址
4.URL的組成
scheme | 方案,訪問服務器以獲取資源時要使用哪種協議 |
user | 用戶,某些方案訪問資源時需要的用戶名 |
password | 密碼,用戶對應的密碼,中間用:分隔 |
Host | 主機,資源宿主服務器的主機名或IP地址 |
port | 端口,資源宿主服務器正在監聽的端口號,很多方案有默認端口號 |
path | 路徑,服務器資源的本地名,由一個/將其與前面的URL組件分隔 |
params | 參數,指定輸入的參數,參數為名/值對,多個參數,用;分隔 |
query | 查詢,傳遞參數給程序,如數據庫,用?分隔,多個查詢用&分隔 |
frag | 片段,一小片或一部分資源的名字,此組件在客戶端使用,用#分隔 |
3.請求訪問的完整過程
當用戶發起http請求 需要請求index.html網頁文件
客戶端請求和服務器端建立連接,建立連接后,客戶端發送請求報文
服務端網卡收到請求報文,將該報文復制到內核空間(操作系統),內核空間分析報文后交給對應的程序
nginx分析該報文,對比報文和自己的配置文件,按照配置文件完成請求,分析完成后,發現客戶需要index.html文件
由于程序的權限問題,沒有資格直接調用磁盤上的文件,程序會再將這個請求,再次轉發給內核
內核得到請求后,去磁盤中尋找目標文件,找到文件后,復制給程序
程序構建響應報文,構建好后交給內核空間內核空間得到響應報文后,再交給網卡,發給客戶
二、I/O模型處理高并發的時候用
1.I/O模型
同步/異步(消息反饋機制):關注的是消息通信機制,即調用者在等待一件事情的處理結果時,被調用者是否提供完成狀態的通知
同步:synchronous,被調用者并不提供事件的處理結果相關的通知消息,需要調用者主動詢問事情是否處理完成
異步:asynchronous,被調用者通過狀態、通知或回調機制主動通知調用者被調用者的運行狀態
阻塞/非阻塞:關注調用者在等待結果返回之前所處的狀態
同步阻塞:nginx需要自己去問內核是否完成了我交代的任務,而且在接待了一個請求后只有等這個請求結束后才能繼續下一個請求
同步非阻塞:指IO操作被調用后立刻告訴內核是否完成了我交代的任務,無需等待IO操作徹底完成,在最終的結果返回前,調用者不會被掛起,可以去做別的事情
2.多路復用I/O型
多路復用I/O模型是一種基于事件驅動的 I/O 處理模式,它利用操作系統提供的多路復用機制(如select、poll、epoll等)來同時監聽多個 I/O 事件,當某個事件就緒時,通知應用程序進行處理,通過多路復用I/O模型,可以在一個線程中同時處理多個客戶端連接的 I/O 操作,而不需要為每個連接創建一個線程或進程,避免了資源開銷和上下文切換的成本。
常見的多路復用I/O模型有:
1.select:適用于連接數不太多的情況,輪詢監聽多個文件描述符上的 I/O 事件。
2.poll:與select類似,但沒有連接數的限制,并且不會修改傳入的描述符集合。
3.epoll:適用于連接數非常多的情況,通過事件驅動機制來處理 I/O 事件,可以在大并發情況下具有較高的性能優勢。
3.異步I/O模型
異步?I/O 模型是一種非阻塞的 I/O 處理模式,通過回調函數或事件通知的方式來處理已完成的 I/O 操作,能夠提高系統的并發性和處理效率
4.事件模型select poll epoll
1.Nginx服務使用異步非阻塞模式:請求不需要排隊,會反饋任務的完成結果
2.Apache服務使用同步阻塞模式:請求需要排隊,且不會主動返回結果
模型 | 描述 | 優點 | 缺點 |
select | 最古老的模型 | 可以同時監視多個文件描述符 | 效率較低,不適用于大規模并發連接 |
poll | 類似于select | 效率相對更高,可以處理大量并發連接 | 隨著文件描述符數量的增加,性能下降較明顯 |
epoll | Linux特有模型 | 在高并發場景下性能表現更好,使用邊緣觸發方式,只在狀態變化時通知 | 在非Linux系統上不可用,涉及到一些操作系統特定的細節和配置 |
模型區別 | select | poll | epoll |
操作方式 | 遍歷 | 遍歷 | 回調 |
底層實現 | 數組 | 鏈表 | hash表 |
IO效率 | 每次調用都進行線性遍歷,時間復雜度為0(n) | 每次調用都進行線性遍歷,時間復雜度為0(n) | 事件通知方式,每當fd就緒,系統注冊的回調函數就會被調用,將就緒的fd放到rdlllist里,時間復雜度O(1) |
IO效率 | 1024(x86)2048(x64) | 無上限 | 無上限 |
fd拷貝 | 每次調用select都需要把fd集合從用戶拷貝到內核態 | 每次調用poll,都需要把fd集合從用戶態拷貝到內核態 | 調用epoll ctl時拷貝進內核并保存,之后每次epoll wait不拷貝 |