1. 程式人生 > >HTTP-web服務器接收到client請求後的處理過程(很詳細)

HTTP-web服務器接收到client請求後的處理過程(很詳細)

dns解析 版權 如果能 結束 它的 配置網絡 cin 規範 路徑


1. 客戶發起情況到服務器網卡;

2. 服務器網卡接受到請求後轉交給內核處理;

3. 內核根據請求對應的套接字,將請求交給工作在用戶空間的Web服務器進程

4. Web服務器進程根據用戶請求,向內核進行系統調用,申請獲取相應資源(如index.html)

5. 內核發現web服務器進程請求的是一個存放在硬盤上的資源,因此通過驅動程序連接磁盤

6. 內核調度磁盤,獲取需要的資源

7. 內核將資源存放在自己的緩沖區中,並通知Web服務器進程

8. Web服務器進程通過系統調用取得資源,並將其復制到進程自己的緩沖區中

9. Web服務器進程形成響應,通過系統調用再次發給內核以響應用戶請求

10. 內核將響應發送至網卡

11. 網卡發送響應給用戶

通過這樣的一個復雜過程,一次請求就完成了。

簡單來說就是:用戶請求-->送達到用戶空間-->系統調用-->內核空間-->內核到磁盤上讀取網頁資源->返回到用戶空間->響應給用戶。上述簡單的說明了一下,客戶端向Web服務請求過程,在這個過程中,有兩個I/O過程,一個就是客戶端請求的網絡I/O,另一個就是Web服務器請求頁面的磁盤I/O。

我們來看當我們在瀏覽器輸入http://www.mycompany.com:8080/mydir/index.html,幕後所發生的一切。

首先http是一個應用層的協議,在這個層的協議,只是一種通訊規範,也就是因為雙方要進行通訊,大家要事先約定一個規範。

1.連接 當我們輸入這樣一個請求時,首先要建立一個socket連接,因為socket是通過ip和端口建立的(tcp鏈接),所以之前還有一個DNS解析過程,把www.mycompany.com變成ip,如果url裏不包含端口號,則會使用該協議的默認端口號。

DNS的過程是這樣的:首先我們知道我們本地的機器上在配置網絡時都會填寫DNS,這樣本機就會把這個url發給這個配置的DNS服務器,如果能夠找到相應的url則返回其ip,否則該DNS將繼續將該解析請求發送給上級DNS,整個DNS可以看做是一個樹狀結構,該請求將一直發送到根直到得到結果。現在已經擁有了目標ip和端口號,這樣我們就可以打開socket連接了。

2.請求 連接成功建立後,開始向web服務器發送請求,這個請求一般是GET或POST命令(POST用於FORM參數的傳遞)。GET命令的格式為:  GET 路徑/文件名 HTTP/1.0
文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。現在可以發送GET命令:

GET /mydir/index.html HTTP/1.0,

3.應答 web服務器收到這個請求,進行處理。從它的文檔空間中搜索子目錄mydir的文件index.html。如果找到該文件,Web服務器把該文件內容傳送給相應的Web瀏覽器。

為了告知瀏覽器,,Web服務器首先傳送一些HTTP頭信息,然後傳送具體內容(即HTTP體信息),HTTP頭信息和HTTP體信息之間用一個空行分開。
常用的HTTP頭信息有:
  ① HTTP 1.0 200 OK  這是Web服務器應答的第一行,列出服務器正在運行的HTTP版本號和應答代碼。代碼"200 OK"表示請求完成。
  ② MIME_Version:1.0 它指示MIME類型的版本。
  ③ content_type:類型 這個頭信息非常重要,它指示HTTP體信息的MIME類型。如:content_type:text/html指示傳送的數據是HTML文檔。
  ④ content_length:長度值 它指示HTTP體信息的長度(字節)。

4.關閉連接:當應答結束後,Web瀏覽器與Web服務器必須斷開,以保證其它Web瀏覽器能夠與Web服務器建立連接。

瀏覽器一般是圖形界面的,因此我們並不了解在這華麗表面後面所發生的一切。當你點擊一個連接時,瀏覽器首先找到站點的IP地址,這是通過DNS來實現的。在找到IP地址後可以建立TCP連接了,連接建立後我們就可以發送請求了,但這個請求是什麽樣子呢?我們現在假設點擊了一個從WWW.WEBMONKEY.COM/HTML/96/47/INDEX2A.HTML點擊了WWW.GRIPY.ORG/MATTMARG/,這時瀏覽器會發出下面的請求:

Get /mattmarg/ HTTP/1.0
User-Agent: Mozilla/2.0 (Macintosh; I; PPC)
Accept: text/html; */*
Cookie: name = value
Referer: http://www.webmonkey.com/html/96/47/index2a.html
Host: www.grippy.org

第一行稱為請求,它告訴服務器從MATTMARG取得文件,這裏的目錄一般是要加/的。下面幾行通知服務器你所使用的瀏覽器是什麽類型,你所接收的數據是什麽類型。如果你以前訪問過這個站點,站點可能向你發送了cookie,如果你已經有了一個這樣的cookie,瀏覽器會將這個cookie返回給服務器。referer行通知服務器用戶從哪一頁到達此頁的。

下面服務器就要返回文件了,每次服務器返回文件時,都要返回一個http/1.0響應,同時帶有狀態碼,在此之後是一些描述內部的頭信息。下面就是一個響應:

HTTP/1.0 200 Found
Date: Mon, 10 Feb 1997 23:48:22 GMT
Server: Apache/1.1.1 HotWired/1.0
Content-type: text/html
Last-Modified: Tues, 11 Feb 1997 22:45:55 GMT

不同數據可能返回不同的content-type,因此不同的內容需要不同的content-type,因此有時候這個過程是很慢的。
---------------------
作者:哎呦、不錯哦
來源:CSDN
原文:https://blog.csdn.net/l1394049664/article/details/82313414
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

HTTP-web服務器接收到client請求後的處理過程(很詳細)