HTTP-web伺服器接收到client請求後的處理過程(很詳細)
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
版權宣告:本文為博主原創文章,轉載請附上博文連結!