1. 程式人生 > >【雜談】一個回車下去,瀏覽器做了什麽?

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

長連接 cat 解析 編程 至少 -c 獲取 connect 異常

前言

  在使用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 CLRF 

Header1:Value1 CLRF
Header2:Value2 CLRF
....
CLRF

Body

這三大塊用CLRF分隔(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方法

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