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