前言
HTTP(HyperText Transfer Protocol,超文字傳輸協議)是 TCP/IP 四層模型中的應用層的其中一種協議。
HTTP 的歷史
- HTTP 於 1990 年問世,被稱為 HTTP/0.9;
- HTTP/1.0 作為標準被公佈是在 1996 年的 5 月,該標準至今仍被廣泛使用在伺服器端,記載於 RFC19945;
- HTTP/1.1 是目前主流的 HTTP 協議版本,當初標準是 RFC2068 --> RFC2616;
網路基礎 TCP/IP
TCP/IP是網際網路相關的各類協議族的總稱。通常使用的網路是在 TCP/IP 協議族的基礎上面運作起來的,而 HTTP 是屬於它內部的一個子集。TCP/IP 協議族按層次分層,被約定分為四層:應用層、傳輸層、網路層、資料鏈路層;TCP/IP 這樣的分層是有好處的,試想如果網際網路只是又一個協議組成,當該協議的某部分的設計需要變動的時候,則是牽一髮而動全身,需要把整個協議變動,這樣對於實際而言,是比較低效率的;而當把協議按一定的條件分層以後,下一層只需要向上一層暴露介面,而具體的實現細節則是隱藏起來,而當需要改某部分的細節實現的時候,只需要改動被隱藏的細節,而對於其他的分層是沒有影響的。而且層次化以後,設計也變得相對簡單起來。
應用層
該層的服務協議主要包括 FTP(File Transfer Protocol,檔案傳輸協議)、DNS(domain Name System,域名系統),當然,HTTP 協議也是位於該層;
傳輸層
應用層的下一層是傳輸層,提供處於網路連線中的兩臺計算機之間的資料傳輸。該層代表的協議主要有兩個:TCP(Transmission Control Protocol,傳輸控制協議)和 UDP(User Data Protocol,使用者資料包協議)
網路層
網路層用來處理網路上面流動的資料包。資料包是網路傳輸的最小單位,該層規定了通過怎樣的路徑(所謂的傳輸路線)到達對方的計算機,並把資料包傳輸送給對方。(與對方計算機之間通過多臺計算機或網路裝置進行傳輸的時候,網路層所起的作用就是在眾多的傳輸選項中,選擇一條傳輸線路)
鏈路層
用來處理連線網路的硬體部分。包括各種作業系統、硬體的裝置驅動、NIC(Network Interface Card,網路介面卡),及光纖等物理裝置可見部分。
利用 TCP/IP 協議族進行網路通訊時,會通過分層順序與對方進行通訊,傳送端從應用層往下走,接受端則從鏈路層往上走。與此同時,在傳送端資料往下下發的時候,會被每一層封裝對應的頭部,在接受端則分拆每一層的頭部。
負責傳輸的 IP 協議
IP(Internet Protocol,網際協議)作用是把各種資料包傳輸給對方。而需要確實把資料包傳送給對方,則需要明確對方的 IP 地址和 MAC 地址。一般來說,IP 地址是可變的,而 MAC 地址基本不會改變。IP 間的通訊依賴 MAC 地址。
在網路上,通訊的雙方在同一區域網(LAN)內的情況是比較少的,通常需要經過多臺計算機和網路裝置中轉才可以連線到對方。而在經行中轉的時候,會利用下一站的 MAC 地址來搜尋下一個中轉站的 IP,這裡,會利用 ARP(Adress Resolution Protocol,地址解析協議),根據目的 IP 地址,反查出目計算機的 MAC 地址。當然,ARP 協議是解決同一個區域網的上的主機或者路由器的 IP 地址和硬體地址的對映問題,無法解析出另一個區域網的上的主機或者路由器的 MAC 地址。實際上,沒有人可以全面掌握網際網路中的傳輸情況,在到達通訊目標前的中轉過程中,計算機和路由器等網路只能獲取很粗略的傳輸路線。
確保可靠性的 TCP 協議
TCP 協議位於傳輸層,提供可靠的位元組流服務。所謂的位元組流服務,是指雖然應用程式和 TCP 的互動是一次一個資料塊(大小不等),但 TCP 把應用程式交下來的資料僅僅看成是一連串的無結構的位元組流(“流”是指流入到程式或者從程式流出的位元組序列
)。而可靠傳輸則是,TCP 能夠把資料準確可靠地傳給對方。簡而言之,TCP 協議為了把大容量的資料方便傳輸,就把資料分割看成無結構的位元組流,並且 TCP 協議能夠確認資料最終是否到達對方。
-
TCP 協議的三次握手
-
TCP 在雙方進行通訊前,首先需要確保已經建立連結,TCP 採用了三次握手策略。用 TCP 協議把資料包傳送出去以後,TCP 不會對傳送出去的情況置之不理,它一定會向對方確認是否成功到達。握手的過程中使用兩個標誌(flag):SYN(synchronize,同步)和 ACK(acknowledgement);
-
傳送端首先會傳送一個帶 SYN 標誌的資料包給對方。接收端收到該標誌以後,回傳一個帶 SYN/ACK 標誌的資料包給傳送方以表示確認資訊,最後,傳送端在回傳一個帶 ACK 的標誌表示握手結束;
-
如果該過程因異常中斷,TCP 還會再次以相同的順序傳送相同的資料包;
-
-
TCP 協議的四次揮手
-
TCP 在雙方通訊結束以後,傳送端和接收端都處於 ESTABLISHED 狀態。這時 TCP 會採用四次揮手策略,在揮手的過程中用到的兩個標誌:FIN(finish)和 ACK;
-
傳送端首先會傳送一個帶 FIN 標誌的資料包給對方,這是傳送端會處於一個 FIN-WAIT-1 的狀態。接收端收到該標誌以後,回傳一個 ACK 標誌的資料包給對方,並且這時接收端會處於 CLOSE-WAIT 的狀態,這時接收端還是可以往傳送端傳送資料。當傳送端接收到接收端回傳的 ACK 標誌的資料包的時候,這時傳送端會處於一個 FIN-WAIT-2 的狀態。當接收端沒有資料需要傳送給傳送端的時候,接收端會再次傳送一個 FIN 標誌的資料包給傳送端,這時接收端就會處於 LAST-ACK 的狀態。當傳送端收到接收端回傳的 FIN 標誌以後,傳送端必須對此進行確認應答,在確認報文段把帶 ACK 的報文傳送給接收端,然後接收端接收到該報文以後,便處於關閉的狀態,而傳送端則需要繼續保持一個監聽的狀態在一段時間內;
-
超文字傳送協議 HTTP
HTTP 使用了面向連線的 TCP 作為傳輸層協議,保證了資料的可靠傳輸。HTTP 不必考慮資料在傳輸的過程中被丟棄又怎樣重傳。但是,HTTP 協議本身是無連線的,也就是說,雖然 HTTP 使用了 TCP 連線,但是通訊的雙方在交換 HTTP 報文之前,是不需要先建立 HTTP 連線的。
-
HTTP 的報文結構(略)
-
HTTP 的狀態碼(狀態碼都是三位數字的,分為 5 大類,大概有 33 種。這五種型別的狀態碼可以歸納為以下)
-
1XX 表示通知資訊。如請求收到了或者正在處理;
-
2XX 表示成功。如接受或知道了;
-
3XX 表示重定向。如完成請求還需要採取進一步的行動;
-
4XX 表示客戶端的錯誤。例如請求的語法有誤或者不能完成;
-
5XX 表示伺服器的錯誤。如伺服器失效無法完成;
-
-
HTTP 的方法
-
GET 表示獲取資源;
-
POST 表示傳輸實體主體;
-
PUT 表示傳輸檔案;
-
HEAD 表示獲得報文首部;
-
DELETE 表示刪除檔案;
-
OPTIONS 表示詢問支援的方法;
-
TRACE 表示追蹤路徑;
-
CONNECT 表示要求用隧道協議連線代理;
-
HTTP 是不儲存狀態的協議
HTTP 是一種不儲存狀態,即無狀態的協議。HTTP 協議自身不對請求和響應之間的通訊狀態經行儲存。使用 HTTP 協議,每當有新的請求傳送的時候,就會有新的響應產生。協議本身不儲存之前一切的請求或者響應報文的資訊。而這樣子做的好處是為了更加快地處理大量的事務,確保協議的可伸縮性;HTTP/1.1 雖然是無狀態協議,但為了實現期望的保持狀態功能,於是引入了 Cookie 技術。
HTTP 持久化連線節省通訊量
在 HTTP 協議的初始化版本中,每進行一次 HTTP 通訊就要斷開一次 TCP 連線。一般來說,比如一張網頁往往會包含多中資源請求,例如文字、圖片、音視訊等...每一次請求都造成 TCP 的連線斷開,這樣就會增加通訊量的開銷;為了解決 HTTP 每一次請求都造成 TCP 的連線斷開的問題,HTTP/1.1 和部分的 HTTP/1.0 想出來持久化連線(HTTP Persistent Connections),也稱為 HTTP keep-alive。持久化連線的特點是,只要 HTTP 的兩端沒有明確提出斷開連線,則保持 TCP 連線狀態;
HTTP 的持久化連線的好處是,減少了 TCP 連線的重複建立和斷開所造成的額外開銷,減輕了伺服器的負載。也因為這樣,HTTP 的請求響應時間也為之減少,這樣頁面的顯示的速度也就相應提高;
管線化
持久化連線使得多數請求以管線化方式傳送得以實現。管線化是指,一個請求傳送以後,不用等該請求的響應報文,就可以直接傳送下一個請求報文。這樣的意義也是減少 HTTP 的請求響應時間。
使用 Cookie 的狀態管理
前面提到,HTTP 協議是不儲存狀態的,也就是不對請求和響應之間的通訊狀態經行儲存。但很多業務是需要 HTTP 有儲存狀態的,如需要登入的網站的訪問等。為了解決上述的矛盾,HTTP 引入了 Cookie 技術。Cookie 技術通過在請求和響應報文中寫入 Cookie 資訊來控制客戶端的狀態。
請求報文及響應報文的結構
壓縮傳輸的內容編碼
HTTP 協議中有一種被稱為內容編碼的功能。內容編碼指明應用在實體內容上的編碼格式,並保持實體資訊原樣壓縮。內容編碼後的實體由客戶端接收並負責解碼。
-
常用的內容編碼格式:
-
gzip(GUN zip)
-
compress(UNIX 系統的標準壓縮)
-
deflate(zlib)
-
identity(不進行編碼)
-
分割傳送的分塊傳輸編碼
在傳輸大容量的資料時,通過把資料分割成多塊能夠讓瀏覽器逐步顯示頁面,這種把實體分塊的功能稱為分塊傳輸編碼(Chunked Transfer Coding)
狀態碼告知從伺服器端返回的請求結果
-
2XX 響應結果表示請求被正常處理了。
-
200 OK 表示從客戶端發來的請求在服務端被正常處理了;
-
204 No Content 該狀態碼錶示伺服器接收的請求已經被成功處理,但在返回的響應報文中不含實體的主體部分;
-
206 Partial Content 表示客戶端要求服務端返回部分的資源資訊。響應報文包含 Content-Range 指定範圍的實體內容;
-
-
3XX 重定向
-
301 該狀態碼錶示請求的資源已被分配了新的 URI;
-
302 臨時性重定向;
-
303 See Other 該狀態碼錶示由於請求對應的資源存在著另一個 URl,應使用 GET 方法定向獲取請求的資源;
-
-
4XX 客戶端錯誤
-
400 Bad Request 該狀態碼錶示請求報文中存在語法錯誤;
-
403 ForBidden 該狀態碼錶明對請求資源的訪問被伺服器拒絕了;
-
404 Not Found 該狀態碼錶明伺服器上無法找到請求的資源;
-
-
5XX 伺服器錯誤
-
500 Internal Server Error 該狀態碼錶示伺服器端在執行請求時發生了錯誤;
-
503 Service Unavailable 該狀態碼錶明伺服器暫時處於超負荷或正在經行停機維護;
-
小結
這一篇筆記主要是從 HTTP 原理的巨集觀主體的描述,沒有更深細節去研究吧。emmmm....下一篇網路原理應該是關於 TCP/IP 的。