HTTP请求流程
hhtp請求流程
首先http是一個應用層的協議,在這個層的協議,只是一種通訊規范,也就是因為雙方要進行通訊,大家要事先約定一個規范。
http請求與響應的步驟如下:
URL解析、域名解析
輸入URL的時候,首先瀏覽器會去請求DNS服務器,通過DNS獲取相應的域名對應的IP。如果url里不包含端口號,則會使用協議的默認端口號。瀏覽器根據訪問的域名找到其IP地址。DNS查找過程如下:
1)瀏覽器緩存:瀏覽器會緩存DNS記錄一段時間。 但操作系統沒有告訴瀏覽器儲存DNS記錄的時間,這樣不同瀏覽器會儲存個自固定的一個時間(2分鐘到30分鐘不等)。
2)系統緩存:如果在瀏覽器緩存里沒有找到需要的域名,瀏覽器會做一個系統調用(windows里是gethostbyname),這樣便可獲得系統緩存中的記錄。
3)路由器緩存:如果系統緩存也沒找到需要的域名,則會向路由器發送查詢請求,它一般會有自己的DNS緩存。
4)ISP DNS緩存:如果依然沒找到需要的域名,則最后要查的就是ISP緩存DNS的服務器。在這里一般都能找到相應的緩存記錄。
產生請求數據
根據返回的IP和URL解析得到的參數,結合應用層的協議,確定發送的數據內容,將這些數據放到一個緩沖區內,然后形成了應用層的報文data。
此時,將應用層的報文data發送到傳輸層。經過傳輸層處理,如報文打上了傳輸頭的包頭(主要包含端口號,以及tcp的各種信息),得到tcp的數據傳送單位segment。
建立網絡連接并發送請求包
拿到域名對應的IP地址之后,User-Agent(一般是指瀏覽器)會以一個隨機端口(1024< 端口 < 65535)向服務器的WEB程序(常用的有httpd,nginx等)80端口發起TCP的連接請求。
采用ip地址+協議+端口號唯一標示網絡中的一個進程,利用socket進行通信。基于socket進行TCP三次握手,建立TCP連接。然后瀏覽器發起了http的請求。
將傳輸層的數據段送到網絡層,在網絡層被打包,這樣封裝上了網絡層的包頭,包頭內部含有源及目的的ip地址,該層數據發送單位被稱為packet。網絡層開始負責將這樣的數據包在網絡上傳輸,如何穿過路由器,最終到達目的地址。
返回響應數據
瀏覽器解析html代碼,并請求html代碼中的資源(如js、css、圖片等)
瀏覽器對頁面進行渲染呈現給用戶
斷開網絡連接
若connection 模式為close,則服務器主動關閉TCP 連接,客戶端被動關閉連接,釋放TCP 連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;
HTTP請求格式和返回格式
請求格式
HTTP請求格式主要有四部分組成,分別是:請求行、請求頭、空行、消息體,每部分內容占一行
1
2
3
4
5
6<request-line>
<general-headers>
<request-headers>
<entity-headers>
<empty-line> // (用于分割請求頭和消息體)
[<message-body>]請求行中包含的請求方法:
1
2
3
4
5GET: 完整請求一個資源 (常用)
HEAD: 僅請求響應首部
POST:提交表單 (常用)
PUT: 上傳
DELETE:刪除
響應格式
為了告知瀏覽器,Web服務器首先傳送一些HTTP頭信息,然后傳送具體內容(即HTTP體信息),HTTP頭信息和HTTP體信息之間用一個空行分開
HTTP響應格式
服務器接收處理完請求后返回一個HTTP相應消息給客戶端。HTTP響應消息的格式包括:狀態行、響應頭、空行、消息體。每部分內容占一行。1
2
3
4
5
6<status-line>
<general-headers>
<response-headers>
<entity-headers>
<empty-line>
[<message-body>]
Socket
WEB Server都是基于Socket編程,又稱之為網絡編程,網絡協議通過一個叫做socket的對象抽象出來,socket可以建立網絡連接,讀數據,寫數據。socket模塊定義了一些常量參數,用來指定socket的的地址族、socket的類型、以及支持的TCP/IP協議。
利用ip地址+協議+端口號唯一標示網絡中的進程,然后利用socket進行通信。
socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用已實現進程在網絡中通信。
通常傳輸層的服務通過系統調用的方式提供,以socket的方式。對于客戶端,要想建立一個socket連接,需要調用這樣一些函數socket() bind() connect(),然后就可以通過send()進行數據發送。
參考:
總結
- 上一篇: 银行卡登录密码忘了怎么找回 怎么找回忘了
- 下一篇: PHP执行外部程序的方法