淺談HTTP協議

noViC4發表於2020-11-29

前言

HTTP協議,全稱Hyper Text Transfer Protocol(超文字傳輸協議)。HTTP協議是基於TCP/IP協議的應用層協議,規定了客戶端與伺服器之間的通訊格式,預設使用80埠。HTTP採用了經典的客戶端-伺服器模型,客戶端與伺服器連線併發出請求,然後等待伺服器響應。除此之外,HTTP是一個無狀態協議,伺服器並不會保留連線所傳輸的資訊。

HTTP發展歷程

HTTP從最初的HTTP/0.9到現在最常用的HTTP/1.1,歷經了幾個版本,功能也越來越強大。

HTTP/0.9

這個版本的HTTP只支援GET請求,且規定伺服器只能回應HTML格式的字串,所以我們通過此協議只能訪問靜態頁面。

HTTP/1.0

HTTP/1.0廢除了0.9中伺服器只允許回應HTML格式字串的規定,可以傳送任何格式的內容,這代表著除了文字還可以傳輸圖片,視訊等,且該版本協議還支援POST,HEAD請求。除此之外,HTTP請求和回應的格式也變了,除了資料部分,還必須包括頭部資訊。

HTTP/1.1

HTTP/1.1是現在最常用的HTTP協議,相較於HTTP/1.0,其引入了許多新的特性。

持續連線

在HTTP/1.1中,TCP連線預設不關閉,可以被多個請求使用。這個連線會持續下去,直到客戶端或伺服器端中的一個認為會話已經結束,就可以關閉連線。

HTTP pipelining(流水線)

此特性實現了讓客戶端一次性傳送多個請求的操作,無需再一個個等待伺服器的響應。在HTTP/1.1以前,客戶端要請求兩個資源,就需要先傳送第一個請求,然後等待伺服器響應,伺服器響應後再傳送第二個請求。而在HTTP/1.1中,客戶端能夠直接傳送這兩個請求,不過伺服器端還是按照順序一個一個處理請求的。

分塊傳輸

Content-length

在說分塊傳輸之前,先得說說Content-length欄位。我們知道,Content-length欄位是用來標識伺服器響應的長度的,所以在伺服器響應之前,伺服器必須計算出回應的資料長度。當我們去請求一個很大的資源時,這無疑是很耗費時間得,所以就有了分塊傳輸的出現。

Transfer-Encoding

HTTP/1.1中規定了一個新欄位Transfer-Encoding,請求包或響應包中有該欄位時,就表明包中的資料有數量未知的資料塊組成。在非空的資料塊前,有一個十六進位制的數,表明該資料塊的長度,最後會有一個長度為0的塊,表名資料傳送完畢。


URL

URL,翻譯成中文就是統一資源定位符,我們大多數人一般叫網址。URL其實就是資源在WEB上的地址,我們可以通過這個地址獲取到對應的資源。我們先來看看URL的一般格式:

協議://伺服器ip地址:埠/檔案路徑

以百度的網址為
https://www.baidu.com/

從URL中我們可以看出來,使用的是https協議,不是說要用伺服器ip及埠嗎,為什麼這裡是一串字母呢。其實這個字串叫做域名,域名經過DNS的處理,就會解析到對應ip。至於DNS就需要自己去了解了,我這裡就不多說了。那為什麼埠也沒有呢,這又是一個知識點了,如果web伺服器使用HTTP協議的標準埠(HTTP是80,HTTPS是443)來授予其資源的訪問許可權,那麼埠就可以被忽略,也就是說寫https://www.baidu.com:443也是可以的。埠一定要寫對,比如使用的是HTTPS協議,你寫80埠就會導致無法連線。

HTTP請求報文

http請求包由三部分構成,請求行,請求頭,請求資料,格式如下圖
在這裡插入圖片描述
圖片來自 here
在這裡插入圖片描述
這就是一個標準的HTTP請求報文,第一行是請求行,表示出了請求方法,路徑,協議版本。下面是請求頭,想深入瞭解HTTP頭可以看這篇文章 HTTP Headers

HTTP響應報文

響應報文跟請求報文的格式基本一樣,也由三部分構成,狀態行,訊息報頭,響應正文。
在這裡插入圖片描述

相關文章