引言: 轉前端一年了,期間工做較忙,也沒時間整理一些知識體系,此係列文章是對前端基礎的一些回顧與總結。
咱們知道,HTTP是基於TCP/IP協議的。屬於TCP/IP 協議的一個子集,TCP/IP是互聯網通訊相關聯的協議族的總稱。瞭解TCP/IP協議族有助於咱們更好的理解HTTP協議。html
TCP/IP協議族主要分爲:前端
盜用《圖解HTTP》中的一張圖:程序員
舉個栗子,客戶端在應用層按規範發起了一個HTTP請求,而後由傳輸層(TCP)負責將報文分片,編序發給網絡層,再由網絡層增長目標服務器的mac地址,最終由鏈路層將請求發往目標機器。服務器在鏈路層接收到數據,按序往上層發送,一直到應用層。當傳輸到應用層,才能算真正接收到由客戶端發送過來的 HTTP請求。web
URI是一個用於標識互聯網資源名稱的字符串,最多見的形式是統一資源定位符(URL),常常指定爲非正式的網址。更罕見的用法是統一資源名稱(URN),其目的是經過提供一種途徑。用於在特定的命名空間資源的標識,以補充網址。
即URL和URN 都是 URI的子集,URI是一種抽象的概念,URL是URI的一種常見的具象表達形式。算法
簡介sql
代理是一種有轉發功能的應用程序,它扮演了位於服務器和客戶端「中間人」的角色,接收由客戶端發送的請求並轉發給服務器,同時
也接收服務器返回的響應並轉發給客戶端。每次經過代理服務器轉發請求或響應時,會追加寫入 Via 首部信息。數據庫
代理的分類:瀏覽器
代理的方式:緩存
使用代理的好處:安全
網關的工做機制和代理十分類似,可是它可使用非http協議與服務器、數據庫進行通訊,便是說,網關在收到來自客戶端的http請求以後,能夠直接與數據庫鏈接,使用sql查詢數據庫。
隧道的目的是確保客戶端能與服務器進行安全的通訊,自己不會去解析 HTTP 請求,也就是說,請求保持原樣中轉給以後的服務器,隧道會在通訊雙方斷開鏈接時結束。隧道多用於相隔較遠的兩臺服務器的安全通訊。
HTTP是一種屬於應用層通訊協議,它容許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器。
HTTP請求的報文通常是由 協議行、可選的請求頭部、請求體組成
請求:
Request line
包括:請求方法、請求的資源、HTTP協議的版本號
Request header
包括:Cache頭域、Client頭域、Cookie/Login頭域、Entity頭域、Miscellaneous頭域、Transport頭域等
空行
Request body
Response響應
回包:
Response line
包括:HTTP協議的版本號、狀態碼、消息
Response header
包括:Cache頭域、Cookie/Login頭域、Entity頭域、Miscellaneous頭域、Transport頭域、Location頭域等
空行
Response body
一個完整的HTTP請求過程以下:
常見狀態碼:
200 OK
302 Found 暫時重定向
301 Move Permanently永久重定向
304 Not Modified 沒有內容更新,使用緩存
400 Bad Request 客戶端請求與語法錯誤
403 Forbidden 服務器拒絕提供服務
404 Not Found 請求資源不存在
500 Internal Server Error服務器發生了不可預期的錯誤
503 Server Unavailable 服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
首部字段通常分爲4類:
HTTP被設計之初,就以簡易、靈活爲目的。它的主要特性就是簡易、靈活 、 無狀態 、無鏈接、支持B/S模式。
無鏈接是指每一次請求結束後都會斷開TCP鏈接。在web技術高速發展的今天,每一個頁面須要請求的資源都日益增多,而每次請求都須要從新創建TCP鏈接,這顯然極大的增長了無心義的通訊開銷。因而,Keep-Alive 被提出,以解決TCP沒法複用的問題。
Keep-Alive 其實就是在協議頭裏面設置 Connection: Keep-Alive , 表示當前鏈接是持久化的,持續時間有服務器控制,在沒有接收到關閉信號時,TCP鏈接不會斷開,這樣避免了重複創建TCP請求的無用耗時。
keep-Alive 對應PC端的幫助很大,但在APP端,請求比較分散,且時間跨度大,將keep-Alive的時間設置爲很大顯然是不合理的。因此,通常會尋求其餘的長鏈接方案和僞長鏈接方案。這個下文會詳細介紹。
HTTP是一個優秀的協議,可是仍然存在着一些缺陷:
可是,程序員的智慧是無窮的,既然不安全,那就讓它安全,因而,HTTPS就誕生了。
HTTPS是 HTTP+ SSL +TLS 的產物,用於對通訊的加密、認證、完整性保護。它並非一種新的協議,而是HTTP的某些部分由SSL和TLS代理。
咱們先來了解一下經常使用的兩種加密方式:
HTTPS 使用混合加密機制,即先經過非對稱加密交換通訊密鑰,拿到密鑰後再使用對稱加密的方式進行後續的通訊。可是如何保證第一步中,客戶端獲取到的公共密鑰是正確的呢?這時候,就須要用到咱們的數字證書了。
證書是由第三方機構提供認證的,服務器先去第三方機構申請公共密鑰,而後會得到公共密鑰和使用第三方數字簽名,在非對稱加密的過程當中,將數字證簽名和包含的公共密鑰一塊兒發給客戶端,客戶端經過第三方機構的公共密鑰對證書上的簽名進行驗證,一旦經過,則說明公共密鑰是正確的。
下面看看具體的安全通訊創建過程:
secret加密隨機串(對稱密鑰)。
通常APP會基於TCP造一個長鏈接的通訊協議,門檻較高,可是一旦完成,帶來的回報也是很是大的。信息的推送和更新變得及時,且在一些請求爆發點,相較於傳統HTTP重複創建請求的耗時,也能減輕服務器的壓力。如今業界的成熟方案如:google的protobuf。
long-polling請求就是在客戶端初始化的時候發起一個polling請求到服務器,而後請求一直等待中,當服務器有資源更新的時候,再返回數據,數據放回時,再次發起一個polling請求繼續監聽。固然,polling請求也有一些缺陷,好比 長時間的鏈接會增長服務器壓力,複雜的業務場景下須要考慮如何才能創建健康的請求通道等。此外,這種方式有個致命的缺陷是:數據通訊是單向的,主動權在服務端這邊,客戶端只能根據服務端被動的接受數據,有新的業務請求的時候沒法及時傳送。
與http-polling 不一樣的是, http-streaming 在初始化的的時候就發起一個不會斷開的請求,持續監聽服務器的回包,服務器有數據更新時就經過這個請求通道返回數據。此種方式跟http-polling同樣是單向的,streaming是經過在server response的頭部裏增長」Transfer Encoding: chunked」來告訴客戶端後續還會有新的數據到來。固然,streaming 也有缺陷: 業務數據沒法按照請求來作分割,因此客戶端沒收到一塊數據都須要本身作協議解析,也就是說要作本身的協議定製。
WebSocket和傳統的tcp socket鏈接類似,也是基於tcp協議,提供雙向的數據通道。WebSocket優點在於提供了message的概念,比基於字節流的tcp socket使用更簡單,同時又提供了傳統的http所缺乏的長鏈接功能。websocket 通常在數據須要實時更新的場景中使用。
管線化的前提是長鏈接的創建,keep-alive的多個請求使用同一個tcp鏈接使請求並行成爲可能,pipelining與傳統的請求能夠形象的比喻爲 串行和並行 , 多個請求同時發起,無需等待上一個請求的回包。可是它並非救世主,也存在着缺陷:
HTTP1.0和1.1的普及程度使得HTTP2必須得在不改變原有方式的狀況下解決上述問題,即HTTP2 並不能像angular2那樣放飛自我。因此,HTTP2的使用方式和原來的差很少,HTTP2的改變至關之多,這裏主要講一下對咱們影響較大的幾點:
http2.0的協議解析決定採用二進制格式,實現方便且健壯。每個請求都有這些公共字段:Type, Length, Flags, Steam Identifier和frame payload。http2.0的格式定義更接近tcp層的方式,length定義了整個frame的開始到結束,type定義frame的類型(一共10種),flags用bit位定義一些重要的參數,stream id用做流控制,剩下的payload就是request的正文了。
多路複用是HTTP2.0主要解決的一個問題,一個request對應一個stream並分配一個id,這樣一個鏈接上能夠有多個stream,每一個stream的frame能夠隨機的混雜在一塊兒,接收方能夠根據stream id將frame再歸屬到各自不一樣的request裏面。
無狀態的HTTP致使每次請求都須要攜帶服務器所須要的參數,而一些頭部信息基本上是固定的,這部分重複的信息恰好能夠用於壓縮,減小報文體積。
HTTP 1.1的有一個缺點是:當一個含有確切值的Content-Length的HTTP消息被送出以後,你就很難中斷它了。固然,一般你能夠斷開整個TCP連接(但也不老是能夠這樣),但這樣致使的代價就是須要從新經過三次握手創建一個新的TCP鏈接。一個更好的方案是隻終止當前傳輸的消息並從新發送一個新的。在http2裏面,咱們能夠經過發送RST_STREAM幀來實現這種需求,從而避免浪費帶寬和中斷已有的鏈接。
每一個流都包含一個優先級,優先級被用來告訴對端哪一個流更重要。從而實現資源的有效分配。
當一個客戶端請求資源X,而服務器知道它極可能也須要資源Z的狀況下,服務器能夠在客戶端發送請求前,主動將資源Z推送給客戶端。這個功能幫助客戶端將Z放進緩存以備未來之需。
http2上面每一個流都擁有本身的公示的流量窗口,它能夠限制另外一端發送數據。
HTTP 雖然只有2個版本,可是每一個版本所包含的改動是很是之大的。所作出的突破和嘗試也是很是多的,固然,HTTP也有競爭者,好比在HTTP2還未提出時,由google提出並推行的SPDY協議,它的優點在於解決了HTTP1.0的不能多路複用的問題,對資源請求速度有極大的提高,目前在市場上仍然有許多的使用量,HTTP2也是借鑑了不少SPDY的特性。再好比quic協議,是號稱比HTTP2更快的協議。這個在下一篇文章中會重點介紹~ 哈!主要是這篇有點長了。
https://www.zhihu.com/questio...
http://wiki.jikexueyuan.com/p...