以下內(nèi)容均轉(zhuǎn)自我的博客 YuanBLQ
當(dāng)我們在瀏覽器的地址欄輸入訪問的 URL,然后回車,到瀏覽器顯示對應(yīng)的頁面。這期間,到底發(fā)生了什么?
以下,我大概按如這幾部分來探索關(guān)于瀏覽器是怎么呈現(xiàn)出我們想要的頁面:
- 輸入 url
- 解析域名
- 建立連接
- 發(fā)起請求
- 響應(yīng)請求
- 渲染頁面
- 斷開連接
輸入 url
在一個(gè)網(wǎng)絡(luò)中,不同計(jì)算機(jī)擁有的 ip 地址都是唯一的。提供網(wǎng)頁的服務(wù)器也是一臺計(jì)算機(jī),所以同樣擁有唯一的一個(gè) ip。
比如百度的某一臺服務(wù)器 ip 為 111.13.101.208,你完全可以通過 111.13.101.208:80 去訪問百度的首頁。但如果你還想訪問騰訊、淘寶等其他網(wǎng)站呢?
顯然以 ip 方式去訪問一個(gè)網(wǎng)站是很費(fèi)勁的。就像我們說天安門在哪的時(shí)候不會說天安門在經(jīng)緯多少多少度一樣,而是以人話說在北京哪哪哪。
所以,我們同樣以別名的方式去記住每一個(gè)網(wǎng)站。而這就是 DNS 服務(wù)器干的活。
我們在瀏覽器輸入的是一個(gè),人能夠輕松記住的域名網(wǎng)址。當(dāng)我們回車的時(shí)候 DNS 服務(wù)器就會去找該域名網(wǎng)址在網(wǎng)絡(luò)中對應(yīng)的 ip 地址,稱之為解析域名。
解析域名
一般來說,瀏覽器會先從本地的 hosts 文件中查找該域名對應(yīng)的 ip 地址。
沒有的話再從網(wǎng)絡(luò)運(yùn)營商的 DNS 服務(wù)器中請求解析,如果沒有就再以遞歸的方式往下不斷請求 DNS 解析。找到之后,再一層層返回到你的電腦。
建立連接
瀏覽器拿到 ip 地址之后,會以一個(gè)隨機(jī)端口(1024-65535)向服務(wù)器 web 程序的 80/443 端口發(fā)起 TCP 連接請求,即所謂的三次握手,如下圖所示:
發(fā)起請求
TCP 連接建立完成之后,瀏覽器就會向服務(wù)器發(fā)起 http request header 請求。
一般為 GET 和 POST 兩種請求。
一個(gè)簡單的 GET 請求的 request header 包含:
- 請求行:HTTP/1.1 / GET
- 請求頭:'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0', ...
- 請求體:?key1=value1&key2=value2...
請求頭和請求體的最后一行之間有兩個(gè) '\r\n',用于告訴服務(wù)器沒有其他請求頭了。(POST 方式的請求信息一般不放在請求體,而是通過表單提交)
響應(yīng)請求
服務(wù)器接收到瀏覽器的請求之后,根據(jù)其響應(yīng)內(nèi)容會給瀏覽器相應(yīng)的響應(yīng),服務(wù)器的 HTTP 響應(yīng)同樣也分為,響應(yīng)行、響應(yīng)頭、響應(yīng)體。
渲染頁面
瀏覽器拿到服務(wù)器返回的響應(yīng)數(shù)據(jù)后,根據(jù)其內(nèi)容在把它渲染出來。
斷開連接
當(dāng)我們在瀏覽器關(guān)閉正在訪問的頁面的時(shí)候,瀏覽器會發(fā)送斷開連接的請求,及四次揮手過程,如下圖所示:

以上基本就是一個(gè)簡單的從輸入 url 到瀏覽器顯示最終頁面,期間所發(fā)生的一些事。