Grape
所有視頻:https://segmentfault.com/a/11...算法
HTTP是基於客戶端/服務端(C/S)的架構模型,經過一個可靠的連接來交換信息,是一個無狀態的請求/響應協議。
咱們目前用到最多的是http1.x協議,header和body咱們都不陌生,那麼startline是什麼呢?startline是咱們所說的request_line或status_line,也就是
GET /HTTP/1.1或者HTTP/1.1 200 OK這種字段。
在敘述http的各類工做方式以前,咱們先熟悉一下TCP/IP模型:segmentfault
Http1.0:http1.0是默認沒有keep-alive的,在數據請求的時候會先進性應用層如下的處理過程纔會到應用層,在這裏咱們只說傳輸層和應用層,在http1.0中,每一次的請求都會進行創建tcp鏈接(三次握手),而後進行http請求,這樣每次與服務器交互,都須要新開一個鏈接!咱們的每一個連接的請求鏈路都以下圖所示:瀏覽器
想象一下,每發起一個請求就通過上述如此長的一個流程,這將耗去多少資源。緩存
基於這個問題,咱們的http迎來了http1.1版本,1.1版本相對於1.0版本有什麼改動呢?安全
HTTP 1.1管線化(pipelining)理論,客戶端能夠同時發出多個HTTP請求,而不用一個個等待響應以後再請求服務器
Http1.1基於上述耗費資源的問題給予了根本的處理,默認長連接,什麼意思呢? 不去在每個http請求的時候都去進行http鏈接,只創建一個tcp連接去處理多個請求,固然,這裏的每一個請求是串行的,即只是不用去進行tcp鏈接,仍是得排隊,而且這樣子可能會引發線頭阻塞(例如發送100個請求,第一個被阻塞致使後邊99個也不能請求)問題。對於http1.1默認的工做模式以下圖所示:網絡
到這咱們想象一下這種模式好麼,有什麼缺點?能夠優化嗎?
在此之上咱們已經拋出了兩個問題1.須要排隊 2.可能引發線頭阻塞。對於第一個問題,http1.1已經給出瞭解決方案,即pipline,而第二個問題剛開始有一種過渡的方案,即spdy協議(google推出的一項加強http的協議,功能包括數據流的多路複用、請求優先級以及HTTP報頭壓縮,有興趣的能夠研究一下),而後再到如今的http2.0。
首先咱們先說一下什麼是pipline,pipline是一項實現了多個http請求但不須要等待響應就可以寫進同一個socket的技術,僅有http1.1規範支持http管線化,1.0並不支持。什麼意思呢?咱們看上圖是在一個tcp鏈接的串行的去處理,那麼開啓了pipline以後就會變成下邊這個樣子:架構
咱們能夠看到發送http請求再也不是先發送而後等待response再發送下個請求了,這樣子咱們能夠當作是全部的請求統一開始,可是這有一個問題,HTTP Pipelining實際上是把多個HTTP請求放到一個TCP鏈接中一一發送,而在發送過程當中不須要等待服務器對前一個請求的響應;只不過,客戶端仍是要按照發送請求的順序來接收響應!這就致使了它雖然解決了排隊問題,可是他也僅僅是解決了單方排隊的問題,最後接受數據仍是按照請求的順序來接受相應,爲何呢?由於他們不知道哪一個是第一個哪一個是第二個。這樣一樣會存在線頭阻塞的問題。
總結一下就是在http1.0的時候咱們是流水線,一個接一個的完成任務,http1.1的時候呢咱們工人的能力提高了,能夠一次發出多個工做需求了,可是尚未掌握技巧,仍是得按照條例等待工做所有到來的時候一個一個按順序處理。socket
接下來就是咱們的http2.0,看他如何解決了以前的問題。解決線頭阻塞,在http2.0中實際上是用了一個stream的結構,給每個stream分配一個標示即streamId就能夠來解決線頭阻塞的問題。那麼http2到底是何方神聖呢?
首先,提及http2,咱們不得不提一下https,http2是基於https的一個協議,對於https我找了一篇寫的比較好的文章,Wireshark 抓包理解 HTTPS 請求流程。
文章開頭咱們對比了http1和http2的結構,看起來好像徹底不同,可是實際上並不是如此,http2以幀做爲最小單位,看了下邊的圖咱們會發現原來http2只是作了層封裝,其實本質仍是headers和body,只不過http2是以更高級功能更多的方式進行了展現。tcp
關於http2好在哪裏,那咱們得從http1壞出發,由於有對比才會有傷害。
關於http咱們就說這麼多,若是想了解的更多讀者能夠自行用wireshark抓包看一下。推薦兩個比較好的抓包工具:wireshark和charles。
參考文章: