理解http協議

weixin_34249678發表於2019-01-18

一、HTTP協議的演進

Http(HyperText Transfer Protocol)協議是基於TCP的應用層協議,它不關心資料傳輸的細節,主要用來規定客戶端和服務端的資料傳輸格式,最初是用來向客戶端傳輸HTML頁面內容。預設埠是80。

1.HTTP 0.9版本 1991年

這個版本最初用來向客戶端傳輸HTML頁面的,所以只有一個GET命令,伺服器返回客戶端一個HTML頁面,不能是其它格式。利用這個版本完全可以構建一個簡單的靜態網站了。

2.HTTP 1.0版本 1996年

1.0版本改變是比較大的,奠定了現在HTTP協議的基礎,這個版本的協議不僅可以傳輸HTML的文字頁面,還可以傳輸其它二進位制檔案,例如圖片、視訊。而且還增加了現在常用的POST和HEAD命令,請求訊息和響應訊息也不是單一的,規定了一些後設資料欄位,例如:字符集、編碼、狀態碼等

3.HTTP 1.1版本 1997年

實際上是在1.0版本之後半年時間又釋出了一個版本,這個版本在1.0版本的基礎上更加完善了。這個版本增加了持久連線,就是說之前版本的協議一次請求就是一次TCP連線,請求完成後這個連線就關閉掉了。眾所周知TCP協議是可靠的,建立連線需要3次握手,斷開連線需要4次揮手,並且TCP有流量控制和擁塞控制,有慢開始機制,剛建立連線時傳輸比較慢,這是比較耗費資源的。一個豐富的頁面會有許多圖片、表單和超連結。這樣的話就會有多次的HTTP請求,所以在這個版本上預設不關閉TCP連線也不用宣告Connection: keep-alive欄位。如果確實要關閉可以指定Connection: close欄位。還引入了管道機制,就是說在一個TCP連線裡可以同時傳送多個HTTP請求,而不必等待上一個請求響應成功再傳送。還增加了PUT、PATCH、HEAD、 OPTIONS、DELETE等命令,豐富了客戶端和服務端互動動作。還增加了Host欄位。

4.HTTP 2版本 2015年

這個版本也是隨著網際網路的發展,有了新的需求制定了新的功能還有對上一個版本的完善。1.1版本有了管道機制,但是正在服務端還是要對請求進行排隊處理。這個版本可以多工的處理。還有了頭資訊壓縮和伺服器的主動推送。

5.HTTPS

HTTPS是HTTP協議的安全版本,HTTP協議的資料傳輸是明文的,是不安全的,HTTPS使用了SSL/TLS協議進行了加密處理。

二、HTTP協議的特點

1.HTTP協議是無狀態的

就是說每次HTTP請求都是獨立的,任何倆個請求之間沒有必然聯絡。但是在實際應用中並不是這樣的,引入了Cookie和Session機制來關聯請求

2.多次HTTP請求

在客戶端請求網頁時多數情況下並不是一次請求就能成功的,服務端首先是響應HTML頁面,然後瀏覽器收到響應之後發現HTML頁面還引用了其他的資源,例如:CSS,JS檔案,圖片等等,還會自動傳送HTTP請求這些需要的資源

3.基於TCP協議

HTTP協議的目的是規定客戶端和服務端資料傳輸的格式和資料互動行為,並不負責資料傳輸的細節。底層是基於TCP實現的。現在使用的版本當中是預設持久連線的,也就是多次HTTP請求使用一個TCP連線。

三、HTTP報文

1.請求報文

HTTP的請求報文結構

請求行 方法 URL 版本 CRLF
請求頭 -- -- -- --
請求體 -- -- -- --

報文由三部分組成,即請求行請求頭請求體。其中請求行指定的是方法、URL、協議版本、CRLF(回車和換行);請求頭是鍵值對形式存在的,類似Accept-Languag:zh-CN;請求體就是要傳輸的資料。
舉例:

Accept:text/html,application/xhtml+xml,application/xml;image/webp
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN
Cache-Control:max-age=0
Connection:keep-alive
Host:xiaojiadian.gome.com.cn
User-Agent:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebkit/537.36(KHTML,like Gecko)Chrome/49.0.6.423
2.響應報文

HTTP的響應報文結構

狀態行 版本 狀態碼 解釋狀態碼短語 CRLF
響應頭 -- -- -- --
響應體 -- -- -- --

報文由三部分組成,即狀態行響應頭響應體。其中狀態行指定的是版本、狀態碼、解釋狀態碼短語、CRLF(回車和換行);響應頭是鍵值對形式存在的,類似Connection:keep-alive;響應體就是要傳輸的資料。
舉例:

Connection:keep-alive
Date:Thu,17 Jan 2019 06:36:01 GMT
ETag:B82D6841000
Server:GOMEWS

四、HTTP請求方法

請求方法是客戶端用來告知伺服器其動作意圖的方法。需要注意方法名區分大小寫,下面詳細說明:

1.GET:獲取資源
2.POST:傳輸實體主體
3.PUT:傳輸檔案
4.HEAD:獲得報文首部(請求頭和響應頭)
5.DELETE:刪除檔案

五、HTTP響應狀態碼

200:OK

請求正常處理成功了

304:Not Modified

已經快取檔案了

400:Bad Request

請求報文中存在語法錯誤

403:Forbidden

請求訪問的資源被拒絕,沒有獲得伺服器的訪問許可權,IP被禁止等

404:Not Found

請求的資源在伺服器找不到

500:Internal Server Error

服務端在執行請求時發生了錯誤,很有可能是服務端程式的bug

504:Getaway Timeout

網管超時

302:Found

代表重定向


六、HTTP請求頭/響應頭/首部欄位

HTTP首部欄位是構成HTTP報文最重要的元素之一。在客戶端與服務端之前進行資訊傳遞的時候請求和響應都會使用首部欄位,會傳遞一些重要的資訊。首部欄位是以鍵值對的形式存在的。包含報文的主體大小、語言、認證資訊等。HTTP首部欄位包含4種型別:

通用首部欄位:代表請求頭和響應頭都會使用的欄位
請求首部欄位:是客戶端向伺服器傳送請求使用的首部欄位
響應首部欄位:是服務端向客服端返回響應時使用的首部欄位
實體首部欄位:是針對請求體和響應體的實體部分使用的部首

1.通用首部欄位
首部欄位名 說明
Cache-Control 控制快取的行為
Connection 連線的管理
Date 建立報文的日期時間
Pragma 報文指令
2.請求首部欄位
首部欄位名 說明
Accept 客戶端可接受處理的媒體型別
Accept-Charset 客戶端可接受的字符集
Accept-Encoding 客戶端可接受的內容編碼
Accept-Language 客戶端可接受的語言
Host 請求資源所在伺服器
if-Match 比較實體(ETag)
if-Modified-Since 比較資源的更新時間
if-None-Match 比較實體標記
Referer 對請求中URI的原始獲取方
User-Agent HTTP客戶端瀏覽器、系統資訊
3.響應首部欄位
首部欄位名 說明
ETag 資源的匹配資訊
Location 令客戶端重定向到指定URI
Server HTTP伺服器的安裝資訊
Proxy-Authenticate 代理伺服器對客戶端的認證資訊
4.實體首部欄位
首部欄位名 說明
Allow 資源可支援的HTTP方法
Context-Encoding 實體主體的編碼格式
Context-Language 實體主體的大小(位元組)
Context-Length 實體主體的媒體型別
Context-Location 替代對應資源的URI
Context-Type 實體主體的媒體型別
Expires 實體主體過期的日期時間
Last-Modified 資源的最後修改時間

七、關於HTTP常見問題以及解答

1.GET和POST的區別
  • GET用於獲取資源資訊,而POST用於更新資源資訊
  • GET提交請求的資料實體會放在URL後面,用?來分割,例如://higo.gome.com.cn?name=lucy&age=18
  • GET提交的資料長度是有限制,而POST沒有
  • GET提交的資料不安全,因為引數都會暴露在URL上面
2.408 Request Timeout和504 Gateway Timeout區別

408是請求超時,504是響應超時;408一般是客戶端或者網路擁塞,504是服務端響應過慢,也有可能是網路問題

3.Cookie和Session區別

Cookie和Session都是為了儲存客戶端和服務端的互動狀態。Cookie是儲存在客戶端,Session是儲存在服務端;Cookie是客戶端請求服務端時伺服器會將一些資訊以鍵值對形式返回給客戶端,儲存在瀏覽器中。Cookie的缺點是大小和數量都有限制(瀏覽器標準不一致,建議cookie個數小於20個,總大小小於4KB);Cookie如果很大,每次請求都要帶上,這樣就影響了傳輸效率。Session是基於Cookie來實現的,Session存在於服務端,但是每次傳輸的時候不會傳輸資料,只是把代表一個客戶端的唯一ID(SessionID)寫在客戶端。Session優勢傳輸資料量小,比較安全。

相關文章