目錄
瀏覽器端發起 http 請求流程
1. 構建請求
2. 查詢快取
3. 準備 ip 位址和埠
4. 等待 tcp 佇列
5. 建立 tcp 連線
6. 傳送 http 請求
伺服器端處理 http 請求流程
1. 返回請求
2. 斷開連線
3. 重定向 總結
那麼接下來,瀏覽器會完成哪些動作呢?下面我們就一步一步詳細「追蹤」下。
首先,瀏覽器構建請求行資訊(如下所示),構建好後,瀏覽器準備發起網路請求。
在真正發起網路請求之前,瀏覽器會先在瀏覽器快取中查詢是否有要請求的檔案。其中,瀏覽器快取是一種在本地儲存資源副本,以供下次請求時直接使用的技術。當然,如果快取查詢失敗,就會進入網路請求過程了。
不過,先不急,在了解網路請求之前,我們需要先看看 http 和 tcp 的關係。因為瀏覽器使用http 協議作為應用層協議,用來封裝請求的文字資訊;並使用tcp/ip 作傳輸層協議將它發到網路上,所以在 http 工作開始之前,瀏覽器需要通過 tcp 與伺服器建立連線。也就是說http 的內容是通過 tcp 的傳輸資料階段來實現的,你可以結合下圖更好地理解這二者的關係。
那接下來你可以思考這麼「一連串」問題:
所以,這樣一路推導下來,你會發現在第一步瀏覽器會請求 dns 返回網域名稱對應的 ip。當然瀏覽器還提供了dns 資料快取服務,如果某個網域名稱已經解析過了,那麼瀏覽器會快取解析的結果,以供下次查詢時直接使用,這樣也會減少一次網路請求。
拿到 ip 之後,接下來就需要獲取埠號了。通常情況下,如果 url 沒有特別指明埠號,那麼 http 協議預設是 80 埠。
答案依然是「不行」。chrome 有個機制,同乙個網域名稱同時最多只能建立 6 個 tcp 連線,如果在同乙個網域名稱下同時有 10 個請求發生,那麼其中 4 個請求會進入排隊等待狀態,直至進行中的請求完成。
當然,如果當前請求數量少於 6,會直接進入下一步,建立 tcp 連線。
一旦建立了 tcp 連線,瀏覽器就可以和伺服器進行通訊了。而 http 中的資料正是在這個通訊過程中傳輸的。
可以結合下圖來理解,瀏覽器是如何傳送請求資訊給伺服器的。
首先瀏覽器會向伺服器傳送請求行,它包括了請求方法、請求 uri(uniform resource identifier)和http 版本協議。
傳送請求行,就是告訴伺服器瀏覽器需要什麼資源,最常用的請求方法是get。比如,直接在瀏覽器位址列鍵入極客時間的網域名稱(time.geekbang.org),這就是告訴伺服器要 get 它的首頁資源。
另外乙個常用的請求方法是post,它用於傳送一些資料給伺服器,比如登入乙個**,就需要通過 post 方法把使用者資訊傳送給伺服器。如果使用 post 方法,那麼瀏覽器還要準備資料給伺服器,這裡準備的資料是通過請求體來傳送。
一旦伺服器處理結束,便可以返回資料給瀏覽器了。你可以通過工具軟體 curl 來檢視返回請求資料,具體使用方法是在命令列中輸入以下命令:
url -i注意這裡加上了-i是為了返回響應行、響應頭和響應體的資料,返回的結果如下圖所示,你可以結合這些資料來理解伺服器是如何響應瀏覽器的。
首先伺服器會返回響應行,包括協議版本和狀態碼。
但並不是所有的請求都可以被伺服器處理的,那麼一些無法處理或者處理出錯的資訊,怎麼辦呢?伺服器會通過請求行的狀態碼來告訴瀏覽器它的處理結果,比如:
狀態碼型別很多,這裡我就不過多介紹了,網上有很多資料,你可以自行查詢和學習。
隨後,正如瀏覽器會隨同請求傳送請求頭一樣,伺服器也會隨同響應向瀏覽器傳送響應頭。響應頭包含了伺服器自身的一些資訊,比如伺服器生成返回資料的時間、返回的資料型別(json、html、流**等型別),以及伺服器要在客戶端儲存的 cookie 等資訊。
傳送完響應頭後,伺服器就可以繼續傳送響應體的資料,通常,響應體就包含了 html 的實際內容。
通常情況下,一旦伺服器向客戶端返回了請求資料,它就要關閉 tcp 連線。不過如果瀏覽器或者伺服器在其頭資訊中加入了:
connection:keep-alive那麼 tcp 連線在傳送後將仍然保持開啟狀態,這樣瀏覽器就可以繼續通過同乙個 tcp 連線傳送請求。保持 tcp 連線可以省去下次請求時需要建立連線的時間,提公升資源載入速度。比如,乙個 web 頁面中內嵌的就都來自同乙個 web 站點,如果初始化了乙個持久連線,你就可以復用該連線,以請求其他資源,而不需要重新再建立新的 tcp 連線。
到這裡似乎請求流程快結束了,不過還有一種情況你需要了解下,比如當你在瀏覽器中開啟 geekbang.org 後,你會發現最終開啟的頁面位址是
這兩個 url 之所以不一樣,是因為涉及到了乙個重定向操作。跟前面一樣,你依然可以使用 curl 來檢視下請求 geekbang.org 會返回什麼內容?
在控制台輸入如下命令:
curl -i geekbang.org注意這裡輸入的引數是-i,和-i不一樣,-i表示只需要獲取響應頭和響應行資料,而不需要獲取響應體的資料,最終返回的資料如下圖所示:
從圖中你可以看到,響應行返回的狀態碼是 301,狀態 301 就是告訴瀏覽器,我需要重定向到另外乙個**,而需要重定向的**正是包含在響應頭的 location 欄位中,接下來,瀏覽器獲取 location 欄位中的位址,並使用該位址重新導航,這就是乙個完整重定向的執行流程。這也就解釋了為什麼輸入的是 geekbang.org,最終開啟的卻是 了。
不過也不要認為這種跳轉是必然的。如果你開啟 你會發現這個站點是打不開的。這是因為 12306 的伺服器並沒有處理跳轉,所以必須要手動輸入完整的 才能開啟頁面。
「http 請求示意圖」,用來展現瀏覽器中的 http 請求所經歷的各個階段。
從圖中可以看到,瀏覽器中的 http 請求從發起到結束一共經歷了如下八個階段:構建請求、查詢快取、準備 ip 和埠、等待 tcp 佇列、建立 tcp 連線、發起 http 請求、伺服器處理請求、伺服器返回請求和斷開連線。
HTTP協議1 HTTP簡介
http協議是hyper text transfer protocol 超文字傳輸協議 的縮寫,是用於從全球資訊網 www world wide web 伺服器傳輸超文字到本地瀏覽器的傳送協議。http是乙個基於tcp ip通訊協議來傳遞資料 html 檔案,檔案,查詢結果等 http協議工作於客戶...
HTTP協議基礎 1 HTTP簡介
進行介面測試的前提就是要熟悉http協議 何為http協議 hypertext transfer protocol,超文字傳輸協議 所謂協議,就是指雙方遵循的規範。http協議,就是瀏覽器和伺服器之間進行 溝通 的一種規範。我們在看空間,刷微博 都是在使用http協議,當然,遠遠不止這些應用。筆者一...
1 HTTP監控工具httpry
httpry捕獲http資料報,並且將http協議層的資料內容以可讀形式列舉出來。注意需要libpcap devel安裝包 使用 httpry基本用法 儲存到二進位制檔案中 重放 httpry r output.dump httpry高階用法 如果你要捕獲特定的http方法,如get post pu...