本文參照:極客時間-《深入拆解 Tomcat & Jetty》-02 | HTTP協議必知必會
HTTP協議
HTTP本質
HTTP協議是瀏覽器與服務器之間的數據傳送協議。作爲應用層協議,HTTP是基於TCP/IP協議來傳遞數據的(HTML文件、圖片、查詢結果等),HTTP協議不涉及數據包(Packet)傳輸,主要規定了客戶端和服務器之間的通信格式。
下面我通過一個例子來告訴你HTTP的本質是什麼。
假如瀏覽器需要從遠程HTTP服務器獲取一個HTML文本,在這個過程中,瀏覽器實際上要做兩件事情。
- 與服務器建立Socket連接。
- 生成請求數據並通過Socket發送出去。
第一步比較容易理解,瀏覽器從地址欄獲取用戶輸入的網址和端口,去連接遠端的服務器,這樣就能通信了。
我們重點來看第二步,這個請求數據到底長什麼樣呢?都請求些什麼內容呢?或者換句話說,瀏覽器需要告訴服務端什麼信息呢?
首先最基本的是,你要讓服務端知道你的意圖,你是想獲取內容還是提交內容;其次你需要告訴服務端你想要哪個內容。那麼要把這些信息以一種什麼樣的格式放到請求裏去呢?這就是HTTP協議要解決的問題。也就是說,HTTP協議的本質就是一種瀏覽器與服務器之間約定好的通信格式。
HTTP工作原理
- 用戶通過瀏覽器進行了一個操作,比如輸入網址並回車,或者是點擊鏈接,接着瀏覽器獲取了這個事件。
- 瀏覽器向服務端發出TCP連接請求。
- 服務程序接受瀏覽器的連接請求,並經過TCP三次握手建立連接。
- 瀏覽器將請求數據打包成一個HTTP協議格式的數據包。
- 瀏覽器將該數據包推入網絡,數據包經過網絡傳輸,最終達到端服務程序。
- 服務端程序拿到這個數據包後,同樣以HTTP協議格式解包,獲取到客戶端的意圖。
- 得知客戶端意圖後進行處理,比如提供靜態文件或者調用服務端程序獲得動態結果。
- 服務器將響應結果(可能是HTML或者圖片等)按照HTTP協議格式打包。
- 服務器將響應數據包推入網絡,數據包經過網絡傳輸最終達到到瀏覽器。
- 瀏覽器拿到數據包後,以HTTP協議的格式解包,然後解析數據,假設這裏的數據是HTML。
- 瀏覽器將HTML文件展示在頁面上。
如上,Tomcat和Jetty作爲一個HTTP服務器,主要承擔了接受連接、解析請求數據、處理請求和發送響應這幾個步驟。這裏請你注意,可能有成千上萬的瀏覽器同時請求同一個HTTP服務器,因此Tomcat和Jetty爲了提高服務的能力和併發度,往往會將自己要做的幾個事情並行化,具體來說就是使用多線程的技術。
HTTP請求響應實例
在瀏覽器和HTTP服務器之間通信的過程中,首先要將數據打包成HTTP協議的格式:
如上,HTTP請求數據由三部分組成,分別是請求行、請求報頭、請求正文。當這個HTTP請求數據到達Tomcat後,Tomcat會把HTTP請求數據字節流解析成一個Request對象,這個Request對象封裝了HTTP所有的請求信息。接着Tomcat把這個Request對象交給Web應用去處理,處理完後得到一個Response對象,Tomcat會把這個Response對象轉成HTTP格式的響應數據併發送給瀏覽器。
HTTP響應的格式,HTTP的響應也是由三部分組成,分別是狀態行、響應報頭、報文主體。