主頁 >  其他 > 30張圖解:鍵入網址后,到網頁顯示,其間發生了什么?

30張圖解:鍵入網址后,到網頁顯示,其間發生了什么?

2020-09-10 12:10:53 其他


前言

想必不少小伙伴面試程序中,會遇到「當鍵入網址后,到網頁顯示,其間發生了什么」的面試題,

還別說,這真是挺常問的這題,前幾天坐在我旁邊的主管電話面試應聘者的時候,也問了這個問題,

這次,小林我帶大家一起探究下,一個資料包在網路中的心路歷程

每個階段都有資料包的「心路歷程」,我們一起看看它說了什么?


正文

接下來以下圖較簡單的網路拓撲模型作為例子,探究探究其間發生了什么?

簡單的網路模型簡單的網路模型

01 孤單小弟 —— HTTP

瀏覽器做的第一步作業是決議 URL

首先瀏覽器做的第一步作業就是要對 URL 進行決議,從而生成發送給 Web 服務器的請求資訊,

讓我們看看一條長長的 URL 里的各個元素的代表什么,見下圖:

URL 決議URL 決議

所以圖中的長長的 URL 實際上是請求服務器里的檔案資源,

要是上圖中的藍色部分 URL 元素都省略了,那應該是請求哪個檔案呢?

當沒有路徑名時,就代表訪問根目錄下事先設定的默認檔案,也就是 /index.html 或者 /default.html 這些檔案,這樣就不會發生混亂了,

生產 HTTP 請求資訊

URL 進行決議之后,瀏覽器確定了 Web 服務器和檔案名,接下來就是根據這些資訊來生成 HTTP 請求訊息了,

HTTP 的訊息格式HTTP 的訊息格式

一個孤單 HTTP 資料包表示:“我這么一個小小的資料包,沒親沒友,直接發到浩瀚的網路,誰會知道我呢?誰能載我一程呢?誰能保護我呢?我的目的地在哪呢?”,充滿各種疑問的它,沒有停滯不前,依然踏上了征途!


02 真實地址查詢 —— DNS

通過瀏覽器決議 URL 并生成 HTTP 訊息后,需要委托作業系統將訊息發送給 Web 服務器,

但在發送之前,還有一項作業需要完成,那就是查詢服務器域名對應的 IP 地址,因為委托作業系統發送訊息時,必須提供通信物件的 IP 地址,

比如我們打電話的時候,必須要知道對方的電話號碼,但由于電話號碼難以記憶,所以通常我們會將對方電話號 + 姓名保存在通訊錄里,

所以,有一種服務器就專門保存了 Web 服務器域名與 IP 的對應關系,它就是 DNS 服務器,

域名的層級關系

DNS 中的域名都是用句點來分隔的,比如 www.server.com,這里的句點代表了不同層次之間的界限

在域名中,越靠右的位置表示其層級越高

畢竟域名是外國人發明,所以思維和中國人相反,比如說一個城市地點的時候,外國喜歡從小到大的方式順序說起(如 XX 街道 XX 區 XX 市 XX 省),而中國則喜歡從大到小的順序(如 XX 省 XX 市 XX 區 XX 街道),

根域是在最頂層,它的下一層就是 com 頂級域,再下面是 server.com,

所以域名的層級關系類似一個樹狀結構:

  • 根 DNS 服務器
  • 頂級域 DNS 服務器(com)
  • 權威 DNS 服務器(server.com)
DNS 樹狀結構DNS 樹狀結構

根域的 DNS 服務器資訊保存在互聯網中所有的 DNS 服務器中,

這樣一來,任何 DNS 服務器就都可以找到并訪問根域 DNS 服務器了,

因此,客戶端只要能夠找到任意一臺 DNS 服務器,就可以通過它找到根域 DNS 服務器,然后再一路順藤摸瓜找到位于下層的某臺目標 DNS 服務器,

域名決議的作業流程

  1. 客戶端首先會發出一個 DNS 請求,問 www.server.com 的 IP 是啥,并發給本地 DNS 服務器(也就是客戶端的 TCP/IP 設定中填寫的 DNS 服務器地址),
  2. 本地域名服務器收到客戶端的請求后,如果快取里的表格能找到 www.server.com,則它直接回傳 IP 地址,如果沒有,本地 DNS 會去問它的根域名服務器:“老大, 能告訴我 www.server.com 的 IP 地址嗎?” 根域名服務器是最高層次的,它不直接用于域名決議,但能指明一條道路,
  3. 根 DNS 收到來自本地 DNS 的請求后,發現后置是 .com,說:“www.server.com 這個域名歸 .com 區域管理”,我給你 .com 頂級域名服務器地址給你,你去問問它吧,”
  4. 本地 DNS 收到頂級域名服務器的地址后,發起請求問“老二, 你能告訴我 www.server.com 的 IP 地址嗎?”
  5. 頂級域名服務器說:“我給你負責 www.server.com 區域的權威 DNS 服務器的地址,你去問它應該能問到”,
  6. 本地 DNS 于是轉向問權威 DNS 服務器:“老三,www.server.com對應的IP是啥呀?” server.com 的權威 DNS 服務器,它是域名決議結果的原出處,為啥叫權威呢?就是我的域名我做主,
  7. 權威 DNS 服務器查詢后將對應的 IP 地址 X.X.X.X 告訴本地 DNS,
  8. 本地 DNS 再將 IP 地址回傳客戶端,客戶端和目標建立連接,

至此,我們完成了 DNS 的決議程序,現在總結一下,整個程序我畫成了一個圖,

域名決議的作業流程域名決議的作業流程

DNS 域名決議的程序蠻有意思的,整個程序就和我們日常生活中找人問路的程序類似,只指路不帶路

資料包表示:“DNS 老大哥厲害呀,找到了目的地了!我還是很迷茫呀,我要發出去,接下來我需要誰的幫助呢?”


03 指南好幫手 —— 協議堆疊

通過 DNS 獲取到 IP 后,就可以把 HTTP 的傳輸作業交給作業系統中的協議堆疊

協議堆疊的內部分為幾個部分,分別承擔不同的作業,上下關系是有一定的規則的,上面的部分會向下面的部分委托作業,下面的部分收到委托的作業并執行,

應用程式(瀏覽器)通過呼叫 Socket 庫,來委托協議堆疊作業,協議堆疊的上半部分有兩塊,分別是負責收發資料的 TCP 和 UDP 協議,它們兩會接受應用層的委托執行收發資料的操作,

協議堆疊的下面一半是用 IP 協議控制網路包收發操作,在互聯網上傳資料時,資料會被切分成一塊塊的網路包,而將網路包發送給對方的操作就是由 IP 負責的,

此外 IP 中還包括 ICMP 協議和 ARP 協議,

  • ICMP 用于告知網路包傳送程序中產生的錯誤以及各種控制資訊,
  • ARP 用于根據 IP 地址查詢相應的以太網 MAC 地址,

IP 下面的網卡驅動程式負責控制網卡硬體,而最下面的網卡則負責完成實際的收發操作,也就是對網線中的信號執行發送和接收操作,

資料包看了這份指南表示:“原來我需要那么多大佬的協助啊,那我先去找找 TCP 大佬!”


04 可靠傳輸 —— TCP

HTTP 是基于 TCP 協議傳輸的,所以在這我們先了解下 TCP 協議,

TCP 包頭格式

我們先看看 TCP 報文頭部的格式:

TCP 包頭格式TCP 包頭格式

首先,源埠號目標埠號是不可少的,如果沒有這兩個埠號,資料就不知道應該發給哪個應用,

接下來有包的號,這個是為了解決包亂序的問題,

還有應該有的是確認號,目的是確認發出去對方是否有收到,如果沒有收到就應該重新發送,直到送達,這個是為了解決不丟包的問題,

接下來還有一些狀態位,例如 SYN 是發起一個連接,ACK 是回復,RST 是重新連接,FIN 是結束連接等,TCP 是面向連接的,因而雙方要維護連接的狀態,這些帶狀態位的包的發送,會引起雙方的狀態變更,

還有一個重要的就是視窗大小,TCP 要做流量控制,通信雙方各宣告一個視窗(快取大小),標識自己當前能夠的處理能力,別發送的太快,撐死我,也別發的太慢,餓死我,

除了做流量控制以外,TCP還會做擁塞控制,對于真正的通路堵車不堵車,它無能為力,唯一能做的就是控制自己,也即控制發送的速度,不能改變世界,就改變自己嘛,

TCP 傳輸資料之前,要先三次握手建立連接

在 HTTP 傳輸資料之前,首先需要 TCP 建立連接,TCP 連接的建立,通常稱為三次握手

這個所謂的「連接」,只是雙方計算機里維護一個狀態機,在連接建立的程序中,雙方的狀態變化時序圖就像這樣,

TCP 三次握手TCP 三次握手
  • 一開始,客戶端和服務端都處于 CLOSED 狀態,先是服務端主動監聽某個埠,處于 LISTEN 狀態,

  • 然后客戶端主動發起連接 SYN,之后處于 SYN-SENT 狀態,

  • 服務端收到發起的連接,回傳 SYN,并且 ACK 客戶端的 SYN,之后處于 SYN-RCVD 狀態,

  • 客戶端收到服務端發送的 SYNACK 之后,發送 ACKACK,之后處于 ESTABLISHED 狀態,因為它一發一收成功了,

  • 服務端收到 ACKACK 之后,處于 ESTABLISHED 狀態,因為它也一發一收了,

所以三次握手目的是保證雙方都有發送和接收的能力

如何查看 TCP 的連接狀態?

TCP 的連接狀態查看,在 Linux 可以通過 netstat -napt 命令查看,

TCP 連接狀態查看TCP 連接狀態查看

TCP 分割資料

如果 HTTP 請求訊息比較長,超過了 MSS 的長度,這時 TCP 就需要把 HTTP 的資料拆解成一塊塊的資料發送,而不是一次性發送所有資料,

MTU 與 MSSMTU 與 MSS
  • MTU:一個網路包的最大長度,以太網中一般為 1500 位元組,
  • MSS:除去 IP 和 TCP 頭部之后,一個網路包所能容納的 TCP 資料的最大長度,

資料會被以 MSS 的長度為單位進行拆分,拆分出來的每一塊資料都會被放進單獨的網路包中,也就是在每個被拆分的資料加上 TCP 頭資訊,然后交給 IP 模塊來發送資料,

資料包分割資料包分割

TCP 報文生成

TCP 協議里面會有兩個埠,一個是瀏覽器監聽的埠(通常是隨機生成的),一個是 Web 服務器監聽的埠(HTTP 默認埠號是 80, HTTPS 默認埠號是 443),

在雙方建立了連接后,TCP 報文中的資料部分就是存放 HTTP 頭部 + 資料,組裝好 TCP 報文之后,就需交給下面的網路層處理,

至此,網路包的報文如下圖,

TCP 層報文TCP 層報文

此時,遇上了 TCP 的 資料包激動表示:“太好了,碰到了可靠傳輸的 TCP 傳輸,它給我加上 TCP 頭部,我不再孤單了,安全感十足啊!有大佬可以保護我的可靠送達!但我應該往哪走呢?”


05 遠程定位 —— IP

TCP 模塊在執行連接、收發、斷開等各階段操作時,都需要委托 IP 模塊將資料封裝成網路包發送給通信物件,

IP 包頭格式

我們先看看 IP 報文頭部的格式:

IP 包頭格式IP 包頭格式

在 IP 協議里面需要有源地址 IP目標地址 IP

  • 源地址IP,即是客戶端輸出的 IP 地址;
  • 目標地址,即通過 DNS 域名決議得到的 Web 服務器 IP,

因為 HTTP 是經過 TCP 傳輸的,所以在 IP 包頭的協議號,要填寫為 06(十六進制),表示協議為 TCP,

假設客戶端有多個網卡,就會有多個 IP 地址,那 IP 頭部的源地址應該選擇哪個 IP 呢?

當存在多個網卡時,在填寫源地址 IP 時,就需要判斷到底應該填寫哪個地址,這個判斷相當于在多塊網卡中判斷應該使用哪個一塊網卡來發送包,

這個時候就需要根據路由表規則,來判斷哪一個網卡作為源地址 IP,

在 Linux 作業系統,我們可以使用 route -n 命令查看當前系統的路由表,

路由表路由表

舉個例子,根據上面的路由表,我們假設 Web 服務器的目標地址是 192.168.10.200

路由規則判斷路由規則判斷
  1. 首先先和第一條目的子網掩碼(Genmask)進行 與運算,得到結果為 192.168.10.0,但是第一個條目的 Destination192.168.3.0,兩者不一致所以匹配失敗,
  2. 再與第二條目的子網掩碼進行 與運算,得到的結果為 192.168.10.0,與第二條目的 Destination 192.168.10.0 匹配成功,所以將使用 eth1 網卡的 IP 地址作為 IP 包頭的源地址,

那么假設 Web 服務器的目標地址是 10.100.20.100,那么依然依照上面的路由表規則判斷,判斷后的結果是和第三條目匹配,

第三條目比較特殊,它目標地址和子網掩碼都是 0.0.0.0,這表示默認網關,如果其他所有條目都無法匹配,就會自動匹配這一行,并且后續就把包發給路由器,Gateway 即是路由器的 IP 地址,

IP 報文生成

至此,網路包的報文如下圖,

IP 層報文IP 層報文

此時,加上了 IP 頭部的資料包表示 :“有 IP 大佬給我指路了,感謝 IP 層給我加上了 IP 包頭,讓我有了遠程定位的能力!不會害怕在浩瀚的互聯網迷茫了!可是目的地好遠啊,我下一站應該去哪呢?”


06 兩點傳輸 —— MAC

生成了 IP 頭部之后,接下來網路包還需要在 IP 頭部的前面加上 MAC 頭部

MAC 包頭格式

MAC 頭部是以太網使用的頭部,它包含了接收方和發送方的 MAC 地址等資訊,

MAC 包頭格式MAC 包頭格式

在 MAC 包頭里需要發送方 MAC 地址接收方目標 MAC 地址,用于兩點之間的傳輸

一般在 TCP/IP 通信里,MAC 包頭的協議型別只使用:

  • 0800 : IP 協議
  • 0806 : ARP 協議

MAC 發送方和接收方如何確認?

發送方的 MAC 地址獲取就比較簡單了,MAC 地址是在網卡生產時寫入到 ROM 里的,只要將這個值讀取出來寫入到 MAC 頭部就可以了,

接收方的 MAC 地址就有點復雜了,只要告訴以太網對方的 MAC 的地址,以太網就會幫我們把包發送過去,那么很顯然這里應該填寫對方的 MAC 地址,

所以先得搞清楚應該把包發給誰,這個只要查一下路由表就知道了,在路由表中找到相匹配的條目,然后把包發給 Gateway 列中的 IP 地址就可以了,

既然知道要發給誰,按如何獲取對方的 MAC 地址呢?

不知道對方 MAC 地址?不知道就喊唄,

此時就需要 ARP 協議幫我們找到路由器的 MAC 地址,

ARP 廣播ARP 廣播

ARP 協議會在以太網中以廣播的形式,對以太網所有的設備喊出:“這個 IP 地址是誰的?請把你的 MAC 地址告訴我”,

然后就會有人回答:“這個 IP 地址是我的,我的 MAC 地址是 XXXX”,

如果對方和自己處于同一個子網中,那么通過上面的操作就可以得到對方的 MAC 地址,然后,我們將這個 MAC 地址寫入 MAC 頭部,MAC 頭部就完成了,

好像每次都要廣播獲取,這不是很麻煩嗎?

放心,在后續作業系統會把本次查詢結果放到一塊叫做 ARP 快取的記憶體空間留著以后用,不過快取的時間就幾分鐘,

也就是說,在發包時:

  • 先查詢 ARP 快取,如果其中已經保存了對方的 MAC 地址,就不需要發送 ARP 查詢,直接使用 ARP 快取中的地址,
  • 而當 ARP 快取中不存在對方 MAC 地址時,則發送 ARP 廣播查詢,

查看 ARP 快取內容

在 Linux 系統中,我們可以使用 arp -a 命令來查看 ARP 快取的內容,

ARP 快取內容ARP 快取內容

MAC 報文生成

至此,網路包的報文如下圖,

MAC 層報文MAC 層報文

此時,加上了 MAC 頭部的資料包萬分感謝,說道 :“感謝 MAC 大佬,我知道我下一步要去哪了!我現在有很多頭部兄弟,相信我可以到達最終的目的地!”,
帶著眾多頭部兄弟的資料包,終于準備要出門了,


07 出口 —— 網卡

IP 生成的網路包只是存放在記憶體中的一串二進制數字資訊,沒有辦法直接發送給對方,因此,我們需要將數字資訊轉換為電信號,才能在網線上傳輸,也就是說,這才是真正的資料發送程序,

負責執行這一操作的是網卡,要控制網卡還需要靠網卡驅動程式

網卡驅動從 IP 模塊獲取到包之后,會將其復制到網卡內的快取區中,接著會在其開頭加上報頭和起始幀分界符,在末尾加上用于檢測錯誤的幀校驗序列

物理層資料包物理層資料包
  • 起始幀分界符是一個用來表示包起始位置的標記
  • 末尾的 FCS(幀校驗序列)用來檢查包傳輸程序是否有損壞

最后網卡會將包轉為電信號,通過網線發送出去,

唉,真是不容易,發一個包,真是歷經千辛萬苦,致此,一個帶有許多頭部的資料終于踏上尋找目的地的征途了!


08 送別者 —— 交換機

下面來看一下包是如何通過交換機的,交換機的設計是將網路包原樣轉發到目的地,交換機作業在 MAC 層,也稱為二層網路設備

交換機的包接收操作

首先,電信號到達網線介面,交換機里的模塊進行接收,接下來交換機里的模塊將電信號轉換為數字信號,

然后通過包末尾的 FCS 校驗錯誤,如果沒問題則放到緩沖區,這部分操作基本和計算機的網卡相同,但交換機的作業方式和網卡不同,

計算機的網卡本身具有 MAC 地址,并通過核對收到的包的接收方 MAC 地址判斷是不是發給自己的,如果不是發給自己的則丟棄;相對地,交換機的埠不核對接收方 MAC 地址,而是直接接收所有的包并存放到緩沖區中,因此,和網卡不同,交換機的埠不具有 MAC 地址

將包存入緩沖區后,接下來需要查詢一下這個包的接收方 MAC 地址是否已經在 MAC 地址表中有記錄了,

交換機的 MAC 地址表主要包含兩個資訊:

  • 一個是設備的 MAC 地址,
  • 另一個是該設備連接在交換機的哪個埠上,
交換機的 MAC 地址表交換機的 MAC 地址表

舉個例子,如果收到的包的接收方 MAC 地址為 00-02-B3-1C-9C-F9,則與圖中表中的第 3 行匹配,根據埠列的資訊,可知這個地址位于 3 號埠上,然后就可以通過交換電路將包發送到相應的埠了,

所以,交換機根據 MAC 地址表查找 MAC 地址,然后將信號發送到相應的埠

當 MAC 地址表找不到指定的 MAC 地址會怎么樣?

地址表中找不到指定的 MAC 地址,這可能是因為具有該地址的設備還沒有向交換機發送過包,或者這個設備一段時間沒有作業導致地址被從地址表中洗掉了,

這種情況下,交換機無法判斷應該把包轉發到哪個埠,只能將包轉發到除了源埠之外的所有埠上,無論該設備連接在哪個埠上都能收到這個包,

這樣做不會產生什么問題,因為以太網的設計本來就是將包發送到整個網路的,然后只有相應的接收者才接收包,而其他設備則會忽略這個包

有人會說:“這樣做會發送多余的包,會不會造成網路擁塞呢?”

其實完全不用過于擔心,因為發送了包之后目標設備會作出回應,只要回傳了回應包,交換機就可以將它的地址寫入 MAC 地址表,下次也就不需要把包發到所有埠了,

局域網中每秒可以傳輸上千個包,多出一兩個包并無大礙,

此外,如果接收方 MAC 地址是一個廣播地址,那么交換機會將包發送到除源埠之外的所有埠,

以下兩個屬于廣播地址:

  • MAC 地址中的 FF:FF:FF:FF:FF:FF
  • IP 地址中的 255.255.255.255

資料包通過交換機轉發抵達了路由器,準備要離開土生土長的子網了,此時,資料包和交換機離別時說道:“感謝交換機兄弟,幫我轉發到出境的大門,我要出遠門啦!”


09 出境大門 —— 路由器

路由器與交換機的區別

網路包經過交換機之后,現在到達了路由器,并在此被轉發到下一個路由器或目標設備,

這一步轉發的作業原理和交換機類似,也是通過查表判斷包轉發的目標,

不過在具體的操作程序上,路由器和交換機是有區別的,

  • 因為路由器是基于 IP 設計的,俗稱三層網路設備,路由器的各個埠都具有 MAC 地址和 IP 地址;
  • 交換機是基于以太網設計的,俗稱二層網路設備,交換機的埠不具有 MAC 地址,

路由器基本原理

路由器的埠具有 MAC 地址,因此它就能夠成為以太網的發送方和接收方;同時還具有 IP 地址,從這個意義上來說,它和計算機的網卡是一樣的,

當轉發包時,首先路由器埠會接收發給自己的以太網包,然后路由表查詢轉發目標,再由相應的埠作為發送方將以太網包發送出去,

路由器的包接收操作

首先,電信號到達網線介面部分,路由器中的模塊會將電信號轉成數字信號,然后通過包末尾的 FCS 進行錯誤校驗,

如果沒問題則檢查 MAC 頭部中的接收方 MAC 地址,看看是不是發給自己的包,如果是就放到接識訓沖區中,否則就丟棄這個包,

總的來說,路由器的埠都具有 MAC 地址,只接收與自身地址匹配的包,遇到不匹配的包則直接丟棄,

查詢路由表確定輸出埠

完成包接收操作之后,路由器就會去掉包開頭的 MAC 頭部,

MAC 頭部的作用就是將包送達路由器,其中的接收方 MAC 地址就是路由器埠的 MAC 地址,因此,當包到達路由器之后,MAC 頭部的任務就完成了,于是 MAC 頭部就會被丟棄

接下來,路由器會根據 MAC 頭部后方的 IP 頭部中的內容進行包的轉發操作,

轉發操作分為幾個階段,首先是查詢路由表判斷轉發目標,

路由器轉發路由器轉發

具體的作業流程根據上圖,舉個例子,

假設地址為 10.10.1.101 的計算機要向地址為 192.168.1.100 的服務器發送一個包,這個包先到達圖中的路由器,

判斷轉發目標的第一步,就是根據包的接收方 IP 地址查詢路由表中的目標地址欄,以找到相匹配的記錄,

路由匹配和前面講的一樣,每個條目的子網掩碼和 192.168.1.100 IP 做 & 與運算后,得到的結果與對應條目的目標地址進行匹配,如果匹配就會作為候選轉發目標,如果不匹配就繼續與下個條目進行路由匹配,

如第二條目的子網掩碼 255.255.255.0192.168.1.100 IP 做 & 與運算后,得到結果是 192.168.1.0 ,這與第二條目的目標地址 192.168.1.0 匹配,該第二條目記錄就會被作為轉發目標,

實在找不到匹配路由時,就會選擇默認路由,路由表中子網掩碼為 0.0.0.0 的記錄表示「默認路由」,

路由器的發送操作

接下來就會進入包的發送操作

首先,我們需要根據路由表的網關列判斷對方的地址,

  • 如果網關是一個 IP 地址,則這個IP 地址就是我們要轉發到的目標地址,還未抵達終點,還需繼續需要路由器轉發,
  • 如果網關為空,則 IP 頭部中的接收方 IP 地址就是要轉發到的目標地址,也是就終于找到 IP 包頭里的目標地址了,說明已抵達終點

知道對方的 IP 地址之后,接下來需要通過 ARP 協議根據 IP 地址查詢 MAC 地址,并將查詢的結果作為接收方 MAC 地址,

路由器也有 ARP 快取,因此首先會在 ARP 快取中查詢,如果找不到則發送 ARP 查詢請求,

接下來是發送方 MAC 地址欄位,這里填寫輸出埠的 MAC 地址,還有一個以太型別欄位,填寫 0080 (十六進制)表示 IP 協議,

網路包完成后,接下來會將其轉換成電信號并通過埠發送出去,這一步的作業程序和計算機也是相同的,

發送出去的網路包會通過交換機到達下一個路由器,由于接收方 MAC 地址就是下一個路由器的地址,所以交換機會根據這一地址將包傳輸到下一個路由器,

接下來,下一個路由器會將包轉發給再下一個路由器,經過層層轉發之后,網路包就到達了最終的目的地,

不知你發現了沒有,在網路包傳輸的程序中,源 IP 和目標 IP 始終是不會變的,一直變化的是 MAC 地址,因為需要 MAC 地址在以太網內進行兩個設備之間的包傳輸,

資料包通過多個路由器道友的幫助,在網路世界途經了很多路程,最終抵達了目的地的城門!城門值守的路由器,發現了這個小兄弟資料包原來是找城內的人,于是它就將資料包送進了城內,再經由城內的交換機幫助下,最終轉發到了目的地了,資料包感慨萬千的說道:“多謝這一路上,各路大俠的相助!”


10 互相扒皮 —— 服務器 與 客戶端

資料包抵達了服務器,服務器肯定高興呀,正所謂有朋自遠方來,不亦樂乎?

服務器高興的不得了,于是開始扒資料包的皮!就好像你收到快遞,能不興奮嗎?

網路分層模型網路分層模型

資料包抵達服務器后,服務器會先扒開資料包的 MAC 頭部,查看是否和服務器自己的 MAC 地址符合,符合就將包收起來,

接著繼續扒開資料包的 IP 頭,發現 IP 地址符合,根據 IP 頭中協議項,知道自己上層是 TCP 協議,

于是,扒開 TCP 的頭,里面有序列號,需要看一看這個序列包是不是我想要的,如果是就放入快取中然后回傳一個 ACK,如果不是就丟棄,TCP頭部里面還有埠號, HTTP 的服務器正在監聽這個埠號,

于是,服務器自然就知道是 HTTP 行程想要這個包,于是就將包發給 HTTP 行程,

服務器的 HTTP 行程看到,原來這個請求是要訪問一個頁面,于是就把這個網頁封裝在 HTTP 回應報文里,

HTTP 回應報文也需要穿上 TCP、IP、MAC 頭部,不過這次是源地址是服務器 IP 地址,目的地址是客戶端 IP 地址,

穿好頭部衣服后,從網卡出去,交由交換機轉發到出城的路由器,路由器就把回應資料包發到了下一個路由器,就這樣跳啊跳,

最后跳到了客戶端的城門把手的路由器,路由器扒開 IP 頭部發現是要找城內的人,于是又把包發給了城內的交換機,再由交換機轉發到客戶端,

客戶端收到了服務器的回應資料包后,同樣也非常的高興,客戶能拆快遞了!

于是,客戶端開始扒皮,把收到的資料包的皮扒剩 HTTP 回應報文后,交給瀏覽器去渲染頁面,一份特別的資料包快遞,就這樣顯示出來了!

最后,客戶端要離開了,向服務器發起了 TCP 四次揮手,至此雙方的連接就斷開了,


一個資料包臭不要臉的感受

下面內容的 「我」,代表「臭美的資料包角色」,注:(括號的內容)代表我的吐槽,三連呸!

我一開始我雖然孤單、不知所措,但沒有停滯不前,我依然滿懷信心和勇氣開始了征途,(你當然有勇氣,你是應用層資料,后面有底層兄弟當靠山,我呸!

我很慶幸遇到了各路神通廣大的大佬,有可靠傳輸的 TCP、有遠程定位功能的 IP、有指明下一站位置的 MAC 等(你當然會遇到,因為都被計算機安排好的,我呸!),

這些大佬都給我前面加上了頭部,使得我能在交換機和路由器的轉發下,抵達到了目的地!(哎,你也不容易,不吐槽了,放過你!

這一路上的經歷,讓我認識到了網路世界中各路大俠協作的重要性,是他們維護了網路世界的秩序,感謝他們!(我呸,你應該感謝眾多計算機科學家!


巨人的肩膀

[1] 戶根勤.網路是怎么連接的.人民郵電出版社.

[2] 劉超.趣談網路協議.極客時間.


嘮叨嘮叨

小林是專為大家圖解的工具人,Goodbye,我們下次見!


讀者問答

讀者問:“筆記本的是自帶交換機的嗎?交換機現在我還不知道是什么”

筆記本不是交換機,交換機通常是2個網口以上,

現在家里的路由器其實有了交換機的功能了,交換機可以簡單理解成一個設備,三臺電腦網線接到這個設備,這三臺電腦就可以互相通信了,交換機嘛,交換資料這么理解就可以,

讀者問:“如果知道你電腦的mac地址,我可以直接給你發訊息嗎?”

Mac地址只能是兩個設備之間傳遞時使用的,如果你要從大老遠給我發訊息,是離不開 IP 的,

讀者問:“請問公網服務器的 Mac 地址是在什么時機通過什么方式獲取到的?我看 arp 獲取Mac地址只能獲取到內網機器的 Mac 地址吧?”

在發送資料包時,如果目標主機不是本地局域網,填入的MAC地址是路由器,也就是把資料包轉發給路由器,路由器一直轉發下一個路由器,直到轉發到目標主機的路由器,發現 IP 地址是自己局域網內的主機,就會 arp 請求獲取目標主機的 MAC 地址,從而轉發到這個服務器主機,

轉發的程序中,源IP地址和目標IP地址是不會變的,源MAC地址和目標MAC地址是會變化的,


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/2147.html

標籤:其他

上一篇:手把手教你實作基于Redis的分布式鎖

下一篇:【外文閱讀】Web Development in 2020: What Coding Tools You Should Learn---Quincy Larson

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more