面试必问系列之在浏览器中输入URL后到网页显示 其间发生了什么?
文章目錄
- @[TOC](文章目錄)
- 1:解析URL網(wǎng)址,從而生成發(fā)送給Web服務(wù)器的Http請求信息
- 2:真實(shí)地址查詢-----(DNS域名解析)
- 3:調(diào)用協(xié)議棧
- 4:可靠的傳輸 TCP
- 5:遠(yuǎn)程定位--IP地址
- 6:兩點(diǎn)傳輸--獲取MAC地址
- 7:網(wǎng)卡--出口
- 8:送別者--交換機(jī)
- 9:出境大門--路由器
- 10:相互扒皮--服務(wù)端與客戶端
- @[TOC](文章目錄)
- 1:解析URL網(wǎng)址,從而生成發(fā)送給Web服務(wù)器的Http請求信息
- 2:真實(shí)地址查詢-----(DNS域名解析)
- 3:調(diào)用協(xié)議棧
- 4:可靠的傳輸 TCP
- 5:遠(yuǎn)程定位--IP地址
- 6:兩點(diǎn)傳輸--獲取MAC地址
- 7:網(wǎng)卡--出口
- 8:送別者--交換機(jī)
- 9:出境大門--路由器
- 10:相互扒皮--服務(wù)端與客戶端
1:解析URL網(wǎng)址,從而生成發(fā)送給Web服務(wù)器的Http請求信息
URL 進(jìn)行解析之后,瀏覽器確定了 Web 服務(wù)器和文件名,接下來就是根據(jù)這些信息來生成 HTTP 請求消息了。這里的文件指的就是我們要訪問服務(wù)器中某個目標(biāo)文件。
2:真實(shí)地址查詢-----(DNS域名解析)
通過瀏覽器解析 URL 并生成 HTTP 消息后,需要委托操作系統(tǒng)將消息發(fā)送給 Web 服務(wù)器。但在發(fā)送之前,還有一項(xiàng)工作需要完成,那就是查詢服務(wù)器域名對于的 IP 地址,因?yàn)槲胁僮飨到y(tǒng)發(fā)送消息時,必須提供通信對象的 IP 地址。
比如我們打電話的時候,必須要知道對方的電話號碼,但由于電話號碼難以記憶,所以通常我們會將對方電話號 + 姓名保存在通訊錄里。
所以,== 有一種服務(wù)器就專門保存了 Web 服務(wù)器域名與 IP 的對應(yīng)關(guān)系,它就是 DNS 服務(wù)器==。
域名解析的過程:
其實(shí)就是先訪問== 本地的DNS服務(wù)器==,看是否解析過該域名,解析過那就直接取過來;如果沒有的話那就去請求== 根域名服務(wù)器==,根域名服務(wù)器給一個方向后去== 頂級域名服務(wù)器中查找IP;然后頂級域名服務(wù)器然你去權(quán)威域名服務(wù)器==找對應(yīng)的IP,找到為止。
3:調(diào)用協(xié)議棧
- 通過 DNS 獲取到 IP 后,就可以把 HTTP 的傳輸工作交給操作系統(tǒng)中的協(xié)議棧;
- 應(yīng)用程序(瀏覽器)通過調(diào)用 Socket 庫,來委托協(xié)議棧工作。
- 協(xié)議棧的上半部分有兩塊,分別是負(fù)責(zé)收發(fā)數(shù)據(jù)的 TCP 和 UDP 協(xié)議,它們兩會接受應(yīng)用層的委托執(zhí)行收發(fā)數(shù)據(jù)的操作。-- 協(xié)議棧的下面一半是用 IP 協(xié)議控制網(wǎng)絡(luò)包收發(fā)操作,在互聯(lián)網(wǎng)上傳數(shù)據(jù)時,數(shù)據(jù)劊被切分成一塊塊的網(wǎng)絡(luò)包,而將網(wǎng)絡(luò)包發(fā)送給對方的操作就是由 IP 負(fù)責(zé)的。
4:可靠的傳輸 TCP
- 在 HTTP 傳輸數(shù)據(jù)之前,首先需要 TCP 建立連接,TCP 連接的建立,通常稱為三次握手,三次握手目的是保證雙方都有發(fā)送和接收的能力。這里需要注意的是我們?nèi)挝帐值倪^程的中發(fā)送的TCP報(bào)文,也是需要經(jīng)過經(jīng)過網(wǎng)絡(luò)層和鏈路層的封裝的,要不這條TCP報(bào)文如何傳輸啊,都不知道路
- 如果Http請求消息過長,這時 TCP 就需要把 HTTP 的數(shù)據(jù)拆解一塊塊的數(shù)據(jù)發(fā)送,而不是一次性發(fā)送所有數(shù)據(jù)。
- TCP報(bào)文的生成: TCP 協(xié)議里面會有兩個端口,一個是瀏覽器監(jiān)聽的端口(通常是隨機(jī)生成的),一個是 Web 服務(wù)器監(jiān)聽的端口(HTTP 默認(rèn)端口號是 80, HTTPS 默認(rèn)端口號是 443)。
- 在雙方建立了連接后,TCP 報(bào)文中的數(shù)據(jù)部分就是存放 HTTP 頭部 + 數(shù)據(jù),組裝好 TCP 報(bào)文之后,就需交給下面的網(wǎng)絡(luò)層處理。
5:遠(yuǎn)程定位–IP地址
- TCP 模塊在執(zhí)行連接、收發(fā)、斷開等各階段操作時,都需要委托 IP 模塊將數(shù)據(jù)封裝成網(wǎng)絡(luò)包發(fā)送給通信對象。
- 在 IP 協(xié)議里面需要有源地址 IP 和 目標(biāo)地址 IP:
- 源地址IP,即是客戶端輸出的 IP 地址;
- 目標(biāo)地址,即通過 DNS 域名解析得到的 Web 服務(wù)器 IP。
- HTTP 是經(jīng)過 TCP 傳輸?shù)?#xff0c;所以在 IP 包頭的協(xié)議號,要填寫為 06(十六進(jìn)制),表示協(xié)議為 TCP。
- IP報(bào)文的生成:(IP的協(xié)議里是TCP協(xié)議,TCP協(xié)議中的數(shù)據(jù)部分包含HTTP請求消息)。
6:兩點(diǎn)傳輸–獲取MAC地址
- 每臺設(shè)備都有一個MAC地址,我們在交換機(jī)中傳輸信息的過程中,需要知道交換機(jī)MAC地址。
- 如何獲取發(fā)送方的MAC,和接收方的MAC呢?
- 發(fā)送方MAC 地址是在網(wǎng)卡生產(chǎn)時寫入到 ROM 里的,只要將這個值讀取出來寫入到 MAC 頭部就可以了。
- 接收方的MAC地址 是先查詢ARP緩存,如果有記錄該IP地址對應(yīng)的MAC地址那就直接獲取,如果沒有的話,那就喊唄(廣播)
7:網(wǎng)卡–出口
- IP 生成的網(wǎng)絡(luò)包只是存放在內(nèi)存中的一串二進(jìn)制數(shù)字信息,沒有辦法直接發(fā)送給對方。因此,我們需要將數(shù)字信息轉(zhuǎn)換為電信號,才能在網(wǎng)線上傳輸,也就是說,這才是真正的數(shù)據(jù)發(fā)送過程。
- 負(fù)責(zé)執(zhí)行這一操作的是網(wǎng)卡,要控制網(wǎng)卡還需要靠網(wǎng)卡驅(qū)動程序。這樣將數(shù)字信號轉(zhuǎn)換成電信號才能傳輸出去。
8:送別者–交換機(jī)
- 交換機(jī)的設(shè)計(jì)是將網(wǎng)絡(luò)包原樣轉(zhuǎn)發(fā)到目的地。交換機(jī)工作在 MAC 層,也稱為二層網(wǎng)絡(luò)設(shè)備。
- 交換機(jī)根據(jù)自身的MAC表,將這個數(shù)據(jù)包轉(zhuǎn)發(fā)到路由器。
9:出境大門–路由器
- 經(jīng)過路由器的話,那么我們就可以進(jìn)入其他網(wǎng)絡(luò)了
- 路由器和交換機(jī)的區(qū)別
網(wǎng)絡(luò)包經(jīng)過交換機(jī)之后,現(xiàn)在到達(dá)了路由器,并在此被轉(zhuǎn)發(fā)到下一個路由器或目標(biāo)設(shè)備。
這一步轉(zhuǎn)發(fā)的工作原理和交換機(jī)類似,也是通過查表判斷包轉(zhuǎn)發(fā)的目標(biāo)。
不過在具體的操作過程上,路由器和交換機(jī)是有區(qū)別的。
因?yàn)槁酚善魇腔?IP 設(shè)計(jì)的,俗稱三層網(wǎng)絡(luò)設(shè)備,== 路由器的各個端口都具有 MAC 地址和 IP 地址==;
而交換機(jī)是基于以太網(wǎng)設(shè)計(jì)的,俗稱二層網(wǎng)絡(luò)設(shè)備,交換機(jī)的端口不具有 MAC 地址。 - 路由器的基本原理:
路由器的端口具有 MAC 地址,因此它就能夠成為以太網(wǎng)的發(fā)送方和接收方;同時還具有 IP 地址,從這個意義上來說,它和計(jì)算機(jī)的網(wǎng)卡是一樣的。
當(dāng)轉(zhuǎn)發(fā)包時,首先路由器端口會接收發(fā)給自己的以太網(wǎng)包,然后路由表查詢轉(zhuǎn)發(fā)目標(biāo),再由相應(yīng)的端口作為發(fā)送方將以太網(wǎng)包發(fā)送出去。 - 路由器的包接收操作:
檢查 MAC 頭部中的接收方 MAC 地址,看看是不是發(fā)給自己的包,如果是就放到接收緩沖區(qū)中,否則就丟棄這個包。
總的來說,路由器的端口都具有 MAC 地址,只接收與自身地址匹配的包,遇到不匹配的包則直接丟棄。 - 查詢路由表確定輸出端口
完成包接收操作之后,路由器就會去掉包開頭的 MAC 頭部。
MAC 頭部的作用就是將包送達(dá)路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,當(dāng)包到達(dá)路由器 之后,MAC 頭部的任務(wù)就完成了,于是 MAC 頭部就會被丟棄。
接下來,路由器會根據(jù) MAC 頭部后方的 IP 頭部中的內(nèi)容進(jìn)行包的轉(zhuǎn)發(fā)操作。 - 路由器的發(fā)送操作
- 首先,我們需要根據(jù)路由表的網(wǎng)關(guān)列判斷對方的地址。
- 如果網(wǎng)關(guān)是一個 IP 地址,則這個IP 地址就是我們要轉(zhuǎn)發(fā)到的目標(biāo)地址,還未抵達(dá)終點(diǎn),還需繼續(xù)需要路由器轉(zhuǎn)發(fā)。-
- 如果網(wǎng)關(guān)為空,則 IP 頭部中的接收方 IP 地址就是要轉(zhuǎn)發(fā)到的目標(biāo)地址,也是就終于找到 IP 包頭里的目標(biāo)地址了,說
明已抵達(dá)終點(diǎn)。
- 知道對方的 IP 地址之后,接下來需要通過 ARP 協(xié)議根據(jù) IP 地址查詢 MAC 地址,并將查詢的結(jié)果作為接收方 MAC 地
址。路由器也有 ARP 緩存,因此首先會在 ARP 緩存中查詢,如果找不到則發(fā)送 ARP 查詢請求。獲取到MAC地址后
再將MAC地址封裝到數(shù)據(jù)包上。 - 網(wǎng)絡(luò)包完成后,接下來會將其轉(zhuǎn)換成電信號并通過端口發(fā)送出去。這一步的工作過程和計(jì)算機(jī)也是相同的。
- 發(fā)送出去的網(wǎng)絡(luò)包會通過交換機(jī)到達(dá)下一個路由器。由于接收方 MAC 地址就是下一個路由器的地址,所以交換機(jī)會根據(jù)
這一地址將包傳輸?shù)较乱粋€路由器。接下來,下一個路由器會將包轉(zhuǎn)發(fā)給再下一個路由器,經(jīng)過層層轉(zhuǎn)發(fā)之后,網(wǎng)絡(luò)包
就到達(dá)了最終的目的地。 - == 在網(wǎng)絡(luò)包傳輸?shù)倪^程中,源 IP 和目標(biāo) IP 始終是不會變的,一直變化的是 MAC 地址,因?yàn)樾枰?MAC 地址在以太網(wǎng)內(nèi)進(jìn)行兩個設(shè)備之間的包傳輸。==
- 首先,我們需要根據(jù)路由表的網(wǎng)關(guān)列判斷對方的地址。
10:相互扒皮–服務(wù)端與客戶端
- 數(shù)據(jù)包抵達(dá)服務(wù)器后,服務(wù)器會先扒開數(shù)據(jù)包的 MAC 頭部,查看是否和服務(wù)器自己的 MAC 地址符合,符合就將包收起來。
- 接著繼續(xù)扒開數(shù)據(jù)包的 IP 頭,發(fā)現(xiàn) IP 地址符合,根據(jù) IP 頭中協(xié)議項(xiàng),知道自己上層是 TCP 協(xié)議。
- 于是,扒開 TCP 的頭,里面有序列號,需要看一看這個序列包是不是我想要的,如果是就放入緩存中然后返回一個 ACK,如果不是就丟棄。TCP頭部里面還有端口號, HTTP 的服務(wù)器正在監(jiān)聽這個端口號。
- 于是,服務(wù)器自然就知道是 HTTP 進(jìn)程想要這個包,于是就將包發(fā)給 HTTP 進(jìn)程
- 服務(wù)器的 HTTP 進(jìn)程看到,原來這個請求是要訪問一個頁面,于是就把這個網(wǎng)頁封裝在 HTTP 響應(yīng)報(bào)文里。
- HTTP 響應(yīng)報(bào)文也需要穿上 TCP、IP、MAC 頭部,不過這次是源地址是服務(wù)器 IP 地址,目的地址是客戶端 IP 地址。
- 穿好頭部衣服后,從網(wǎng)卡出去,交由交換機(jī)轉(zhuǎn)發(fā)到出城的路由器,路由器就把響應(yīng)數(shù)據(jù)包發(fā)到了下一個路由器,就這樣跳啊跳
- 最后跳到了客戶端的城門把手的路由器,路由器扒開 IP 頭部發(fā)現(xiàn)是要找城內(nèi)的人,于是把包發(fā)給了城內(nèi)的交換機(jī),再由交換機(jī)轉(zhuǎn)發(fā)到客戶端。
- 客戶端收到了服務(wù)器的響應(yīng)數(shù)據(jù)包后,同樣也非常的高興,客戶能拆快遞了!
- 于是,客戶端開始扒皮,把收到的數(shù)據(jù)包的皮扒剩 HTTP 響應(yīng)報(bào)文后,交給瀏覽器去渲染頁面,一份特別的數(shù)據(jù)包快遞,就這樣顯示出來了
- 最后,客戶端要離開了,向服務(wù)器發(fā)起了 TCP 四次揮手,至此雙方的連接就斷開了。
總結(jié)
以上是生活随笔為你收集整理的面试必问系列之在浏览器中输入URL后到网页显示 其间发生了什么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中关村科金发布企业知识大模型,推出Age
- 下一篇: html如何显示上传进度条,HTML5