【雜談】一個回車下去,瀏覽器做了什麼?

貓毛·波拿巴發表於2019-02-06

前言

  在使用PostMan之前,自己測試Rest介面都是直接在瀏覽器位址列輸入URL來測試的,但是這種方法發出的請求都是Get,如果要傳送POST請求只能用ajax等程式設計方式。有了PostMan就方便多了。某一天在輸URL的時候,突然想看看瀏覽器到底做了什麼,於是就有了下面這些內容。

概述

以下講述的是一個請求靜態網頁檔案的例子,該例子有以下幾個過程:

1.在瀏覽器位址列輸入一個URL,並回車

2.瀏覽器利用DNS,找到域名對應的IP地址

3.瀏覽器與服務端建立socket連線,如果已有則無需建立

4.瀏覽器利用socket連線傳送請求資料包

5.服務端返回響應資料包

6.瀏覽器渲染HTML

7.如果HTML中含有其他檔案的引用,如css,js檔案,那麼它還會重複步驟3~6

建立Socket

要與服務端建立socket連線,瀏覽器要知道哪些資訊呢?

  • 伺服器的IP地址
  • 應用程式佔用埠。

IP地址怎麼獲取?

首先你輸入要訪問一個網站必然有域名,有了域名必然就能找到IP地址。域名與IP地址是多對一的關係。值得一提的是,域名到IP地址的對映不一定要用到DNS,如果本地hosts檔案中有相關的對映,那就不必遠端查詢了。

位址列就不能直接輸IP地址嗎?

只要你記得住,當然可以輸,還省去了解析域名的麻煩。域名的出現就是為了不用去記IP地址。例如,baidu.com 總比 xxx.xxx.xxx.xxx好記吧。

那埠呢?

埠在URL中是直接跟在IP地址/域名後面,一般是這樣:

IP地址/域名:埠

比如tomcat專案就是,localost:8080/xxx

那為什麼很多網站訪問的時候不需要輸埠?

因為預設不輸入的話,會補上80埠。所以埠還是有的。

傳送請求資料包

請求資料包包含哪些內容?

那就要說到資料包的結構了,HTTP請求報文分三部分,請求行(request line)、請求頭(request headers)、請求實體(request body)。大概就是下面這樣:

Method Uri Protocol/version CRLF

Header1:Value1 CRLF
Header2:Value2 CRLF
....
CRLF

Body

這三大塊用CRLF分隔(CLRF就是回車+換行,即"\r\n")。

接收響應資料包

200、500等這些響應結果是怎麼回事?

你能收到這些響應結果,至少網路是通的。需要明確一點的是,這些狀態碼是服務端寫好,然後發給你的。請求正常就是200,請求引數導致服務程式出現異常就是500等等。這些狀態碼很多,有興趣的可以去看Http協議說明。

網頁資料在哪裡?

網頁檔案的內容都放在響應報文的body中,瀏覽器會把網頁內容渲染到頁面上。

提示下載檔案是怎麼回事?

這其實說的是響應報文對於body內容的處理方式,預設情況下是直接在網頁上展示的。這主要由響應頭中的Content-Disposition值決定,預設是inline,也就是直接在網頁上展示。如果是需要下載的話,那就是attachement;filename=xxx.如果瀏覽器接收到這樣的響應報文,會彈出下載提示框,讓使用者選擇儲存位置。

斷開Socket連線

什麼時候斷開連線?

實際上,Http協議到了1.1之後,預設維持的是長連線,也就是不會關閉。因為如果每個請求都建立新的連線的話,握手的開銷不可小覷。現在基本上使用的都是1.1版本。

怎麼斷開連線?

socket連線只要雙方任何一方關閉即可斷開連線,所以可以是瀏覽器或服務端任意一方關閉連線。

瀏覽器 => 關閉瀏覽器應用 Or 提示服務端,讓服務端關閉,具體方式為新增請求頭Connect:close

服務端 => 程式設計呼叫close方法

相關文章