從輸入一個網(wǎng)址開始瓮顽,都調(diào)用了哪些服務县好,經(jīng)歷了哪些步驟,深度解析暖混。以輸入www.google.com為例缕贡。
1. Client端
一般來說,這里的Client指用戶,即browser瀏覽器晾咪。這里我們以輸入google.com為例收擦。
1.1 輸入提示
瀏覽器會根據(jù)歷史訪問,書簽等信息給出輸入建議谍倦。
還會根據(jù)默認搜索引擎的搜索記錄塞赂,去匹配最近的搜索記錄。
1.2 url解析
如果是不合法的地址昼蛀,會轉(zhuǎn)給默認的搜索引擎,例如如果你正在使用chrome宴猾,可以在url輸入框輸入你想要搜索的內(nèi)容,然后搜索引擎會根據(jù)關鍵字進行搜索叼旋。
HSTS列表 安全策略機制仇哆,強行使用https
1.3 DNS解析
域名通過DNS轉(zhuǎn)化為ip地址,這個轉(zhuǎn)化主要是為了人機交互的友好型夫植。沒有人喜歡記一堆數(shù)字來訪問一個網(wǎng)站讹剔。DNS做的事情就是把你輸入的www.google.com翻譯成計算機可以理解的IP地址,類似于192.188.1.1這種樣子详民。
1.3.1查詢過程
在解析的過程中辟拷,瀏覽器會由近及遠尋找是否有緩存信息,即存沒存從域名到地址的映射阐斜,整個查詢過程分為如下幾步衫冻,值得注意的是一旦查詢到,就會立刻返回谒出,不會再繼續(xù)執(zhí)行下去了隅俘。
- 查看瀏覽器內(nèi)部緩存
瀏覽器內(nèi)會會存有在一段時間內(nèi)你曾經(jīng)訪問過的網(wǎng)站的域名地址的映射。
- 系統(tǒng)緩存
操作系統(tǒng)的緩存笤喳。瀏覽器會發(fā)出system call为居, 去詢問操作系統(tǒng)是否存有相應的映射。
- 路由器緩存杀狡, ISP緩存
查詢路由器的緩存蒙畴。如果在路由器緩存中沒有找到映射,就會去ISP(Internet Service Provider)處去尋找
本地DNS服務器
域名服務器 根域服務器 -> 頂級域名服務器
尋找方式類似于一個樹狀結(jié)構呜象,從最底層的子葉開始向上遍歷膳凝,不停向更高級的域名服務器發(fā)出請求。這個過程會不停發(fā)送攜帶有請求和IP地址的數(shù)據(jù)包恭陡,會經(jīng)過在client和server之間的多個網(wǎng)路設備直到其到達正確的DNS服務器蹬音。
2 網(wǎng)絡
找到了正確的IP地址以后就要開始建立連接了,建立連接的過程一般會使用TCP協(xié)議休玩,通過三次握手建立連接著淆。
2.1 TCP連接
會用TCP劫狠,建立連接。并在Client和Server之間傳遞數(shù)據(jù)包永部。
2.1.1 IP封裝 socket
2.1.2 TCP 三次握手
- Client 發(fā)出建立連接的請求独泞。數(shù)據(jù)包攜帶有
SYN
。 - 如果Server有開放的端口苔埋,可以接受并建立連接懦砂,那么server會返回
SYN
+ACK
, 告訴Client我可以接受你的請求。 - Client收到Server的回應讲坎,發(fā)送
ACK
給Server孕惜。 連接建立。
給一個知乎連接晨炕,為什么是三次握手衫画,不是兩次或者四次? 非常有意思的例子瓮栗。
2.1.3 TCP 四次揮手
- Client發(fā)起中斷請求削罩,發(fā)送
FIN
到server - Server收到請求,可能數(shù)據(jù)還沒有發(fā)完费奸。這個時候不會關閉socket弥激,而是回復
ACK
,告訴Client知道了 - Client進入
Fin_Wait
狀態(tài)愿阐,繼續(xù)等待Server端的FIN
報文微服。Server端發(fā)送完畢后,會向Client發(fā)送FIN
- Client收到后就回復
ACK
缨历,并關閉連接
3 Server
這里主要描述TCP連接建立和斷開之間發(fā)生的一些事情以蕴。
TCP/IP是個協(xié)議組,是網(wǎng)絡層和傳輸層的協(xié)議辛孵。Client首先建立一條與服務器的TCP連接(上文中的三次握手)丛肮。而后Client發(fā)送HTTP請求,這里為了獲得頁面魄缚,會發(fā)送一個GET請求給服務器宝与。請求會包含瀏覽器ID,用戶數(shù)據(jù)頭冶匹,連接頭(包含額外信息习劫,比如是否需要保持TCP連接等),從cookie獲取的數(shù)據(jù)等徙硅。
Server收到Client的Request榜聂,會將請求傳遞給Request Handler,去處理請求(從數(shù)據(jù)庫查找數(shù)據(jù)嗓蘑,處理數(shù)據(jù)须肆,構建Response)。構建完畢后會返回一個Response桩皿。值得注意的是這個Response里會含有狀態(tài)信息:
- 1xx informational message only —— 包含信息
- 2xx success of some kind ——成功信息
- 3xx redirects the client to another URL ——將Client轉(zhuǎn)到其他URL
- 4xx indicates an error on the client's part ——Client端錯誤
- 5xx indicates an error on the server's part ——Server端錯誤
4 頁面渲染
瀏覽器根據(jù)Resonse返回數(shù)據(jù)豌汇,渲染出DOM樹,將返回的數(shù)據(jù)呈現(xiàn)在頁面上泄隔。