請(qǐng)求過程
一個(gè)HTTP請(qǐng)求,從瀏覽器中輸入網(wǎng)址到瀏覽器顯示內(nèi)容,一共會(huì)有這么幾個(gè)過程:
- DNS解析
- 建立連接
- 發(fā)送請(qǐng)求
- 接收請(qǐng)求
- 頁面渲染
DNS解析
主要是將URL翻譯為具體的IP地址的過程。
瀏覽器訪問DNS服務(wù)器(UDP:53),然后DNS服務(wù)器通過遞歸的方式調(diào)用根服務(wù)器,返回對(duì)應(yīng)的DNS解析結(jié)果。
建立連接
服務(wù)器端常駐一個(gè)服務(wù)用以監(jiān)聽80(443)端口,通過TCP的三次握手,可以在服務(wù)器和客戶端之間建立一個(gè)TCP/IP連接:
- 客戶端通過自己的某個(gè)端口發(fā)送TCP建立連接的請(qǐng)求{SYN:1,ACK:0,seq:x},
- 服務(wù)器端返回{SYN:1,ACK:1,seq:x+1}
- 客戶端回發(fā){ACK:1,seq:x+1,ack=y+1}
當(dāng)成功建立了連接之后,客戶端開始發(fā)送HTTP請(qǐng)求
發(fā)送請(qǐng)求
HTTP的請(qǐng)求包含了HTTP請(qǐng)求頭和body(GET類請(qǐng)求沒有body)
一個(gè)最簡(jiǎn)單的HTTP請(qǐng)求:
GET / HTTP/1.1
Host: www.baidu.com
- GET 代表請(qǐng)求方法 其他的例如POST DELETE UPDATE ...
- / 代表請(qǐng)求資源路徑(uri) 是相對(duì)于host主機(jī)的一個(gè)路徑
- HTTP/1.1 代表HTTP協(xié)議版本號(hào) 目前通用的是HTTP/1.1 HTTP/2實(shí)現(xiàn)了一些新的特性,能夠讓網(wǎng)頁加載速度更快
- Host: 請(qǐng)求主機(jī)
除此之外還有另一些常用的請(qǐng)求字段:
- User-Agent 代表請(qǐng)求客戶端標(biāo)識(shí) 通常以此區(qū)分客戶端的類型(Chrome|火狐|IE、桌面端|移動(dòng)端)
- Cache-Control 指定請(qǐng)求和響應(yīng)遵循的緩存機(jī)制
- Cookie 服務(wù)器端據(jù)此區(qū)分不同的客戶端(保存登陸信息)
接收請(qǐng)求
使用telnet模擬一次HTTP請(qǐng)求的結(jié)果:
banixc@ubuntu:~$ telnet www.baidu.com 80
Trying 14.215.177.38...
Connected to www.a.shifen.com.
Escape character is '^]'.
GET / HTTP/1.1
HOST:www.baidu.com
HTTP/1.1 200 OK
Date: Sat, 02 Sep 2017 14:32:09 GMT
Content-Type: text/html
Content-Length: 14613
Last-Modified: Thu, 31 Aug 2017 03:03:00 GMT
Connection: Keep-Alive
Vary: Accept-Encoding
Set-Cookie: BAIDUID=D04B686C680A1398ABD46F732D220667:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=D04B686C680A1398ABD46F732D220667; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1504362729; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
Pragma: no-cache
Cache-control: no-cache
Accept-Ranges: bytes
<!DOCTYPE html><!--STATUS OK-->
<html>
<head>
...
可以看到
返回的內(nèi)容中包含了一個(gè)很長(zhǎng)的頭部:
- HTTP/1.1 200 OK 協(xié)議版本 狀態(tài)碼 狀態(tài)描述
- Content-Type: text/html 正文類型 這里是html
- Set-Cookie: 告知瀏覽器需要為這個(gè)域設(shè)置一個(gè)Cookie
然后空一行后是返回體
頁面渲染
頁面渲染部分主要由瀏覽器來實(shí)現(xiàn):
- 解析HTML
- 請(qǐng)求本頁的其他資源
- 加載 CSS 圖片 以及其他內(nèi)容
- 執(zhí)行JavaScript
然后一次HTTP請(qǐng)求就算完成了。
關(guān)于長(zhǎng)連接
在HTTP/1.0中需要在請(qǐng)求頭設(shè)置 Connection: Keep-Alive 并設(shè)置超時(shí)時(shí)間 Keep-Alive: timeout=20 或超時(shí)次數(shù),在HTTP/1.1中則不需要。若要在HTTP/1.1中設(shè)置短連接則需要設(shè)置 Connection: close
然而在請(qǐng)求中聲明長(zhǎng)連接后只是起到通知服務(wù)器端的作用,具體是否為長(zhǎng)連接還需要服務(wù)器的支持。