請求過程
一個HTTP請求淮捆,從瀏覽器中輸入網(wǎng)址到瀏覽器顯示內(nèi)容戒悠,一共會有這么幾個過程:
- DNS解析
- 建立連接
- 發(fā)送請求
- 接收請求
- 頁面渲染
DNS解析
主要是將URL翻譯為具體的IP地址的過程随常。
瀏覽器訪問DNS服務(wù)器(UDP:53),然后DNS服務(wù)器通過遞歸的方式調(diào)用根服務(wù)器洪乍,返回對應(yīng)的DNS解析結(jié)果狂塘。
建立連接
服務(wù)器端常駐一個服務(wù)用以監(jiān)聽80(443)端口,通過TCP的三次握手捞稿,可以在服務(wù)器和客戶端之間建立一個TCP/IP連接:
- 客戶端通過自己的某個端口發(fā)送TCP建立連接的請求{SYN:1,ACK:0,seq:x}又谋,
- 服務(wù)器端返回{SYN:1,ACK:1,seq:x+1}
- 客戶端回發(fā){ACK:1,seq:x+1,ack=y+1}
當成功建立了連接之后,客戶端開始發(fā)送HTTP請求
發(fā)送請求
HTTP的請求包含了HTTP請求頭和body(GET類請求沒有body)
一個最簡單的HTTP請求:
GET / HTTP/1.1
Host: www.baidu.com
- GET 代表請求方法 其他的例如POST DELETE UPDATE ...
- / 代表請求資源路徑(uri) 是相對于host主機的一個路徑
- HTTP/1.1 代表HTTP協(xié)議版本號 目前通用的是HTTP/1.1 HTTP/2實現(xiàn)了一些新的特性娱局,能夠讓網(wǎng)頁加載速度更快
- Host: 請求主機
除此之外還有另一些常用的請求字段:
- User-Agent 代表請求客戶端標識 通常以此區(qū)分客戶端的類型(Chrome|火狐|IE彰亥、桌面端|移動端)
- Cache-Control 指定請求和響應(yīng)遵循的緩存機制
- Cookie 服務(wù)器端據(jù)此區(qū)分不同的客戶端(保存登陸信息)
接收請求
使用telnet模擬一次HTTP請求的結(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)容中包含了一個很長的頭部:
- HTTP/1.1 200 OK 協(xié)議版本 狀態(tài)碼 狀態(tài)描述
- Content-Type: text/html 正文類型 這里是html
- Set-Cookie: 告知瀏覽器需要為這個域設(shè)置一個Cookie
然后空一行后是返回體
頁面渲染
頁面渲染部分主要由瀏覽器來實現(xiàn):
- 解析HTML
- 請求本頁的其他資源
- 加載 CSS 圖片 以及其他內(nèi)容
- 執(zhí)行JavaScript
然后一次HTTP請求就算完成了。
關(guān)于長連接
在HTTP/1.0中需要在請求頭設(shè)置 Connection: Keep-Alive 并設(shè)置超時時間 Keep-Alive: timeout=20 或超時次數(shù)任斋,在HTTP/1.1中則不需要。若要在HTTP/1.1中設(shè)置短連接則需要設(shè)置 Connection: close
然而在請求中聲明長連接后只是起到通知服務(wù)器端的作用废酷,具體是否為長連接還需要服務(wù)器的支持抹缕。