該題是一道特別經(jīng)典的面試題了,涉及到前端人員應(yīng)該掌握的基礎(chǔ)網(wǎng)絡(luò)知識(shí),相信很多前端同學(xué)都了解。但是如果問(wèn)深了,也能問(wèn)出很多子問(wèn)題來(lái),也更能考驗(yàn)出面試者的知識(shí)深度和靈活運(yùn)用程度。
瀏覽器輸入U(xiǎn)RL之后大致有這么幾個(gè)階段:
DNS域名解析建立TCP鏈接發(fā)送HTTP請(qǐng)求服務(wù)端處理請(qǐng)求服務(wù)端返回響應(yīng)結(jié)果關(guān)閉TCP連接瀏覽器解析html并渲染布局
1. DNS域名解析
- 我們?cè)L問(wèn)一個(gè)網(wǎng)站的時(shí)候,可以通過(guò)主機(jī)名或者域名來(lái)訪問(wèn)。但是絕大多數(shù)的時(shí)候是使用域名來(lái)訪問(wèn)網(wǎng)站。因?yàn)橄鄬?duì)于主機(jī)名的ip地址,域名更能讓人記住。
- 但是TCP/IP協(xié)議是通過(guò)IP地址來(lái)訪問(wèn)的,所以就需要一個(gè)機(jī)制,將域名轉(zhuǎn)換為IP地址
- 而DNS服務(wù)就是做這件事情,它提供了域名到IP地址之間的解析服務(wù)
DNS解析過(guò)程1 . 訪問(wèn)www.baidu.com到DNS服務(wù)器2 . DNS服務(wù)器返回www.baidu.com的IP地址115.182.4X.18X3 . 接著請(qǐng)求IP地址為115.182.4X.18X的服務(wù)器4 . 成功訪問(wèn)到www.baidu.com的真正服務(wù)器DNS的優(yōu)先級(jí)
本地電腦會(huì)將一些經(jīng)常使用的域名和對(duì)應(yīng)的IP地址建立一個(gè)映射關(guān)系,并保存到本地host文件中。當(dāng)DNS解析的時(shí)候,會(huì)優(yōu)先從本地host文件中查找映射的IP地址映射
1 . 如果在本地host文件中找到了域名對(duì)應(yīng)的IP地址映射,會(huì)直接使用host文件中的IP地址2 . 如果在本地host文件中沒(méi)有找到域名對(duì)應(yīng)的IP地址映射,會(huì)從本地DNS服務(wù)器中查找3 . 如果在本地DNS服務(wù)器中也沒(méi)有找到域名對(duì)應(yīng)的IP地址映射,會(huì)繼續(xù)向上一級(jí)的DNS服務(wù)器發(fā)送請(qǐng)求,直到DNS根服務(wù)器。如果找到,就進(jìn)行回傳,返回給瀏覽器。
2. 建立TCP鏈接
先了解一個(gè)知識(shí)點(diǎn): TCP/IP協(xié)議族TCP/IP協(xié)議族是由四層協(xié)議組成的系統(tǒng)。分別是:
- 1 . 應(yīng)用層(http)
- 2 . 傳輸層(tcp)
- 3 . 網(wǎng)絡(luò)層(ip)
- 4 . 鏈路層(網(wǎng)絡(luò)硬件)
我的理解是:我們?cè)L問(wèn)一個(gè)網(wǎng)站之前,首先要保證有網(wǎng)絡(luò)對(duì)吧?那么此時(shí),鏈路層就是ok的。經(jīng)過(guò)上面第一步,已經(jīng)知道了該域名映射的IP地址,并且可以訪問(wèn),那么此時(shí)網(wǎng)絡(luò)層也是ok的。那么接下來(lái),就是傳輸層,也就是TCP。其實(shí)這里說(shuō)的也不是很嚴(yán)謹(jǐn),傳輸層不僅僅是TCP一種協(xié)議,還有UDP協(xié)議。UDP協(xié)議是無(wú)連接的,因?yàn)槠洳恍枰B接,所以效率比較高,但是也是因?yàn)椴恍枰B接驗(yàn)證 所以安全性和可靠性得不到保障。而TCP是面向連接的,有校驗(yàn)機(jī)制。所以用的較廣泛。但是也有缺點(diǎn): 因?yàn)樘崆敖⒘诉B接,所以效率就較低。本文說(shuō)的傳輸層指的是TCP協(xié)議。為了確保連接雙方的可靠性,在雙方建立連接時(shí),TCP采用了三次握手策略
TCP三次握手建立連接1 . 第一次握手
客戶端發(fā)送帶有SYN標(biāo)志的連接請(qǐng)求報(bào)文段,然后客戶端就進(jìn)入了SYN_SEND狀態(tài) 等待服務(wù)器確認(rèn)
2 . 第二次握手
服務(wù)端接收到了客戶端瀏覽器發(fā)送的SYN標(biāo)志報(bào)文段后,需要發(fā)送ACK確認(rèn)報(bào)文段對(duì)這個(gè)SYN報(bào)文段進(jìn)行確認(rèn)。同時(shí)又會(huì)向客戶端發(fā)生自己的SYN請(qǐng)求信息。服務(wù)端會(huì)將上述信息放到一個(gè)報(bào)文段(SYN+ACK報(bào)文段)中 一同發(fā)送給客戶端。此時(shí)服務(wù)端進(jìn)入SYN_RECV階段
第三次握手
客戶端瀏覽器接收到了服務(wù)端返回的SYN+ACK報(bào)文段(請(qǐng)求+返回)后,會(huì)向服務(wù)器發(fā)送新的ACK確認(rèn)報(bào)文段。該報(bào)文段發(fā)送完畢后,客戶端和服務(wù)端都進(jìn)入到了ESTABLISHED狀態(tài),此時(shí) 就完成了三次握手
知其然更要知其所以然,為什么要進(jìn)行三次握手才能建立TCP連接?
根本原因就是為了確??蛻舳撕头?wù)端雙方的接收和發(fā)送能力都是ok的。經(jīng)過(guò)第一次握手后,服務(wù)端收到了客戶端的SYN請(qǐng)求標(biāo)志,那么此時(shí)服務(wù)端就可以知道:客戶端的發(fā)送能力是ok的,服務(wù)端本身自己的接收能力是ok的。經(jīng)過(guò)第二次握手后,客戶端收到了服務(wù)端的SYN+ACK請(qǐng)求+返回標(biāo)志,那么此時(shí),客戶端就可以知道:客戶端本身的發(fā)送和接收能力是ok的,服務(wù)端的發(fā)送和接收能力有是ok的。經(jīng)過(guò)第三次握手后,服務(wù)端接收到了客戶端的ACK返回標(biāo)志,那么此時(shí),服務(wù)端就可以知道:服務(wù)端本身自己的接收和發(fā)送能力是ok的。
原文:https://segmentfault.com/a/1190000021756651






