問題提出:
相信大多數(shù)人都對(duì)我們?cè)跒g覽器的地址欄中輸入完成之后的一系列作用過程都很好奇,題主和大家一樣,一次瀏覽知乎無意間看見此問題,看完之后恍然大悟,接下來題主將根據(jù)自己的理解談?wù)劥藛栴}:
1:域名的解析?
其實(shí)我們?cè)跒g覽器中輸入的是一個(gè)網(wǎng)站(網(wǎng)頁)的域名,如果我們想要獲取該域名下的資源,我們必須知道該域名的地址;(一個(gè)ip地址可以對(duì)應(yīng)多個(gè)域名);所以我們要做的第一步就是解析我們的域名;將其翻譯成ip地址:具體的解析過程如圖:

關(guān)于DNS具體的解析過程這里再詳細(xì)解述以下:如上圖所示瀏覽器接收到你輸入的域名之后會(huì)現(xiàn)在瀏覽器本地的緩存里面查詢看是否有該域名,然后依次訪問系統(tǒng)緩存,路由緩存,由這里便開始我們的遞歸搜索;向DNS服務(wù)器發(fā)起查詢請(qǐng)求:
補(bǔ)充知識(shí)點(diǎn):服務(wù)器分類:

具體的遞歸過程如下圖:

拿到服務(wù)器ip地址之后我們便可以通過TCP/IP協(xié)議向服務(wù)端發(fā)起連接請(qǐng)求了并傳輸數(shù)據(jù)了:
2:建立連接
由于TCP協(xié)議是面向連接的,我們?cè)趥鬏敂?shù)據(jù)之前,我們首先要和服務(wù)器建立好連接;具體建立連接的過程如下:

首先,客戶端先發(fā)送一個(gè)創(chuàng)建連接的SYN請(qǐng)求,告訴服務(wù)器主機(jī)“我想和你創(chuàng)建一條TCP連接”。當(dāng)服務(wù)器主機(jī)收到SYN請(qǐng)求后,如果其所請(qǐng)求的端口號(hào)正在等待連接,則會(huì)為這一條TCP連接分配資源,并發(fā)送一個(gè)SYNACK報(bào)文段作為應(yīng)答??蛻糁鳈C(jī)收到SYNACK報(bào)文段后,客戶機(jī)也為該連接分配資源。此時(shí),連接已經(jīng)建立起來了。客戶主機(jī)還會(huì)向服務(wù)器主機(jī)發(fā)送另一個(gè)報(bào)文段,對(duì)允許連接的報(bào)文段進(jìn)行確認(rèn)。這就是有名的“三次握手”。
3:客戶端向服務(wù)器發(fā)送響應(yīng)的請(qǐng)求,
4:服務(wù)器處理請(qǐng)求,并返回一個(gè)HTML頁面
5:瀏覽器開始顯示HTML頁面
6:如果網(wǎng)頁中間包含其他資源:如圖片,CSS樣式,Javascript文件等,這些資源所在地址都要經(jīng)歷一個(gè)和HTML讀取類似的過程。所以瀏覽器會(huì)在DNS中查找這些域名,發(fā)送請(qǐng)求等等…
7:瀏覽器可以向服務(wù)器發(fā)送異步請(qǐng)求(ajax)
8:斷開連接:

(1)此時(shí)TCP連接兩端都還處于ESTABLISHED(established)狀態(tài),客戶端停止發(fā)送數(shù)據(jù),并發(fā)出一個(gè)FIN報(bào)文段。首部FIN=1,序號(hào)seq=u(u等于客戶端傳輸數(shù)據(jù)最后一字節(jié)的序號(hào)加1)客戶端進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)。
(2)服務(wù)端回復(fù)確認(rèn)報(bào)文段,確認(rèn)號(hào)ack=u+1,序號(hào)seq=v(v等于服務(wù)端傳輸數(shù)據(jù)最后一字節(jié)的序號(hào)加1),服務(wù)端進(jìn)入CLOSE-WAIT(關(guān)閉等待)狀態(tài)?,F(xiàn)在TCP連接處于半開半閉狀態(tài),服務(wù)端如果繼續(xù)發(fā)送數(shù)據(jù),客戶端依然接收。
(3)客戶端收到確認(rèn)報(bào)文,進(jìn)入FIN-WAIT-2狀態(tài),服務(wù)端發(fā)送完數(shù)據(jù)后,發(fā)出FIN報(bào)文段,F(xiàn)IN=1,確認(rèn)號(hào)ack=u+1,然后進(jìn)入LAST-ACK(最后確認(rèn))狀態(tài)。
(4)客戶端回復(fù)確認(rèn)確認(rèn)報(bào)文段,ACK=1,確認(rèn)號(hào)ack=w+1(w為半開半閉狀態(tài)時(shí),收到的最后一個(gè)字節(jié)數(shù)據(jù)的編號(hào)),序號(hào)seq=u+1,然后進(jìn)入TIME-WAIT(時(shí)間等待)狀態(tài)。
注意此時(shí)連接還沒有釋放,需要時(shí)間等待狀態(tài)結(jié)束后(4分鐘)連接兩端才會(huì)CLOSED。設(shè)置時(shí)間等待是因?yàn)?,有可能最后一個(gè)確認(rèn)報(bào)文丟失而需要重傳。