? 本文已收錄於 CS-Wiki(Gitee 官方推薦專案,現已 0.9k star)
前言
計算機網路的知識點非常雜亂且瑣碎,非常容易讓人產生畏懼心理。其實計網通篇研究的核心就是不同計算機之間的通訊過程,? 本文將從小白的角度,講解兩臺計算機之間是如何精確的找到對方的位置併傳送和接收訊息的,以幫助讀者從巨集觀角度把握計算機網路的體系結構
1. 五層協議參考模型
所謂通訊協議就是通訊雙方都必須要遵守的通訊規則。如果沒有網路通訊協議,計算機的資料將無法傳送到網路上,更無法到達對方計算機,即使能夠到達,對方也未必能讀懂。有了通訊協議,網路通訊才能夠發生。
一般我們用五層協議參考模型來進行計算機網路的學習:
-
應用層
-
運輸層
-
網路層
-
資料鏈路層
-
物理層
上述各層的作用會在下文詳細講解,我們首先要明白為什麼要分層:
協議的實現是很複雜的。因為協議要把人讀得懂的資料,如網頁、電子郵件等加工轉化成可以在網路上傳輸的訊號,需要進行的處理工作非常多。
兩個系統中實體間的通訊是一個十分複雜的過程。為了減少協議設計和除錯過程的複雜性,網路協議通常都按結構化的層次方式來進行組織,每一層完成一定功能,每一層又都建立在它的下層之上。不同的網路協議,其層的數量、各層的名字、和功能不盡相同。
? 也就是說,每一層都是在下一層的基礎上,通過層間介面向上一層提供一定的服務,而把 “這種服務是如何實現的” 細節對上層加以遮蔽。
❓ 那麼,我們將一個大型網路體系分成了若干個層,各個層之間是如何進行通訊的呢?
-
1)對等層之間通訊(不同開放系統中的相同層次之間的通訊,對等層實體之間的資訊交換):OSI 標準為每一層的通訊都嚴格定義了 協議資料單元 PDU的格式。 對等層之間的通訊是目的,對等層實體的協作保證該層功能和服務的實現
-
2)相鄰層之間通訊(相鄰的上下層之間的通訊,屬於區域性問題):相鄰層之間的通訊是手段,保證對等層實體之間的通訊得以實 施
⭐ 假設網路協議分為若干層,那麼 A、B 兩節點通訊,實際是節點 A 的第 n 層與節點 B 的第 n 層進行通訊,故協議總是指某一層的協議,例如物理層協議、傳輸層協議、應用層協議。每一相鄰層協議間有一介面,下層通過該介面向上一層提供服務。
2. 物理層
兩臺計算機之間要進行通訊,必然需要傳輸介質/物理媒介來連線兩臺計算機,這樣,我們才能把資料傳輸過去。傳輸介質分為:
-
導向型傳輸介質:
-
雙絞線:適用於近距離
-
同軸電纜(抗干擾性強):適用於遠距離
-
光纖:頻寬遠遠大於其他傳輸媒體
-
-
非導向型傳輸介質:
-
無線電波
-
微波
-
紅外線、鐳射
-
⭐ 也就是說,物理層的作用就是實現計算機之間的資料傳送,這個資料其實是位元流,物理層需要儘可能遮蔽掉具體傳輸介質和物理裝置的差異, 使其上面的資料鏈路層不必考慮網路的具體傳輸介質是什麼,即實現位元流的透明傳輸。
3. 資料鏈路層
物理層只是簡單的把計算機連線起來並在上面傳輸位元流,它還是存在著很多問題的:
-
1)物理連線是有差錯和不可靠的
-
2)物理裝置之間可能存在傳輸速度不匹配問題
也就是說僅僅靠物理層是無法保證資料傳輸的正確性的。
⭐ 這樣,資料鏈路層的主要作用就是加強物理層傳輸原始位元流的功能,將物理層提供的可能出錯的物理連線改造成為邏輯上無差錯的資料鏈路,使之對網路層表現為一條無差錯的鏈路。在物理層提供服務的基礎上,資料鏈路層還肩負著為網路層提供服務的責任,其最基本的服務是將來自網路層的 IP 資料包封裝成幀,可靠的傳輸到相鄰結點的目標網路層。
① 封裝成幀
首先了解一下為什麼需要封裝成幀:前面說了,物理層它只是簡單的把計算機連線起來並在上面傳輸位元流(0、1 序列),如果這些 0,1 組合的傳送毫無規則的話,計算機是解讀不了的。因此,我們需要制定一套規則來進行 0、1 的傳送,讓計算能夠讀懂這些序列。
⭐ 封裝成幀就是:傳送端的資料鏈路層接收到上層網路層傳過來的 IP 資料包後,在其前後部分新增首部、尾部,這樣就構成了一個幀。接收端在收到物理層上交的位元流後,就能根據首部和尾部的標記,從收到的位元流中識別幀的開始和結束。
把一臺計算的的資料通過物理層和鏈路層傳送給另一臺計算機,究竟是誰發給誰的,計算機與計算機之間如何區分,你總得給他們一個唯一的標識吧?
於是,MAC 地址出現了 ?
② MAC 地址
MAC 地址就是鏈路層地址,長度為 6 位元組(48 位),用於唯一標識網路介面卡(網路卡)。計算機之間的資料傳送,就是通過 MAC 地址來唯一尋找、傳送的。
一臺主機擁有多少個網路介面卡就有多少個 MAC 地址。例如膝上型電腦普遍存在無線網路介面卡和有線網路介面卡,因此就有兩個 MAC 地址。
❓ 那麼,一臺計算機它是如何知道另一臺計算機的 MAC 地址的呢?這是網路層的 ARP 地址解析協議做的事情,詳見下文 ?
4. 網路層
在 計算機網路中進行通訊的兩個計算機之間可能會經過很多個資料鏈路,也可能還要經過很多通訊子網。
網路層的任務就是選擇合適的網間路由和交換結點, 確保資料及時傳送。 在傳送資料時,網路層把運輸層產生的報文段或使用者資料包封裝成分組和包進行傳送。
在 TCP/IP 體系結構中,由於網路層使用 IP 協議,因此分組也叫 IP 資料包 ,簡稱資料包。
① IP 協議
IP 協議用於遮蔽下層物理網路的差異,為上層提供統一的 IP 資料包。
IP 協議定義的地址,我們稱之為 IP 地址。IP 資料包中含有發/收方的 IP 地址。
IP 協議提供無連線的、不可靠的、盡力的資料包投遞服務
-
1)無連線的投遞服務
傳送端可於任何時候自由傳送資料,而接收端永遠不知道自己會在何時從哪裡接收到資料。每個資料包獨立處理和傳輸, 一臺主機發出的資料包序列,可能取不同的路徑, 甚至其中的一部分資料包會在傳輸過程中丟失;
-
2)不可靠的投遞服務
IP 協議本身不保證資料包投遞的結果。 在傳輸的過程中,資料包可能會丟失、重複、延遲和亂序等, IP協議不對內容作任何檢測,也不將這些結果通知收發雙方; I 資料包的丟失,通過路由器發
ICMP報文
告知; 必要時,由高層實體(如TCP)負責差錯恢復動作。 -
3)盡力投遞服務
執行資料包的分段和封裝,以適應具體的傳輸網路, 由最終結點的IP模組進行合段處理
不同物理網路對傳輸的幀 /分組的體積有不同的規定; 當資料包長度 > MTU(最大傳輸單元 MTU—Maximun Transfer Unit )時,需對資料包分段 。
② ARP 地址解析協議
OK,有了上面 IP 協議的知識,我們來講解一臺計算機它是如何知道另一臺計算機的 MAC 地址的,這就是網路層的 ARP 地址解析協議做的事情。
網路層實現主機之間的通訊,而鏈路層實現具體每段鏈路之間的通訊。因此在通訊過程中,IP 資料包的源地址和目的地址始終不變,而 MAC 地址隨著鏈路的改變而改變。
⭐ ARP(Address Resolution Protocol )協議就可以實現由 IP 地址得到 MAC 地址。
每個主機都有一個 ARP 快取記憶體,裡面有本區域網上的各主機和路由器的 IP 地址到 MAC 地址的對映表。
如果主機 A 知道主機 B 的 IP 地址,但是 ARP 快取記憶體中沒有該 IP 地址到 MAC 地址的對映,此時主機 A 通過廣播的方式傳送 ARP 請求分組(該分組攜帶自己的 IP 地址 和 MAC 地址 以及 目標主機的 IP 地址),主機 B 收到該請求後會傳送 ARP 響應分組 給主機 A 告知其 MAC 地址,隨後主機 A 向其快取記憶體中寫入主機 B 的 IP 地址到 MAC 地址的對映。
? 對應的,RARP 協議可以實現由 MAC地址轉化為 IP 地址
❓ 那麼,我們如何知道對方計算機的 IP 地址呢,這是 DNS 協議做的事情,在應用層我們會詳細講解。
5. 傳輸層
通過物理層、資料鏈路層以及網路層的互相作用,我們已經把資料成功從計算機 A 傳送到計算機 B 了,可是,計算機 B 裡面有各種各樣的應用程式,計算機 B 該如何知道這些資料是給哪個應用程式的呢?
所以,我們在從計算機 A 傳資料給計算表 B 的時候,還得指定一個埠(Port),以供特定的應用程式來接受處理。即 IP 地址 + 埠號就可以唯一確定某個主機上的某個應用程式
⭐ 也就是說,網路層的功能是建立主機到主機的通訊,而傳輸層的功能就是建立埠到埠的通訊(也可以說是程式到程式之間的通訊)
傳輸層最常見的兩大協議是 TCP 協議和 UDP 協議,其中 TCP 協議與 UDP 最大的不同就是 TCP 提供可靠的傳輸,而 UDP 提供的是不可靠傳輸。
-
1)使用者資料包協議 UDP(User Datagram Protocol)
UDP 在傳送資料之前不需要先建立連線,遠端主機在收到 UDP 報文後,不需要給出任何確認。雖然
UDP 不提供可靠交付,但在某些情況下 UDP 確是一種最有效的工作方式(一般用於即時通訊),比
如: QQ 語音、 QQ 視訊 、直播等等
-
2)傳輸控制協議 TCP(Transmission Control Protocol)
TCP 提供面向連線的服務。在傳送資料之前必須先建立連線,資料傳送結束後要釋放連線。
TCP 不提供廣播或多播服務。由於 TCP 要提供可靠的,面向連線的傳輸服務(TCP 的可靠體現在 TCP 在傳遞資料之前,會有三次握手來建立連線,而且在資料傳遞時,有確認、視窗、重傳、流量控制、擁塞控制機制,在資料傳完後,還會斷開連線用來節約系統資源。這不僅使協議資料單元的首部增大很多,還要佔用許多處理機資源。TCP 一般用於檔案傳輸、傳送和接收郵件、遠端登入等場景。
6. 應用層
應用層最接近於用於,它的任務就是通過應用程式間的互動來完成特定網路應用。
應用層協議定義的是應用程式間的通訊和互動的規則。由於傳輸層傳來的資料五花八門,有 html 格式的,有 mp4 格式等等,所以對於不同的網路應用需要不同的應用層協議。在網際網路中應用層協議很多,如域名系統 DNS,支援全球資訊網應用的 HTTP 協議,支援電子郵件的 SMTP 協議等等。我們把應用層互動的資料單元稱為報文。
由於本文的關鍵就是講解計算機之間的通訊,所以其他協議我們就不講了,只講解一下 DNS 協議是如何將域名轉化為 IP 地址的。
DNS 域名解析協議
域名系統 Domain Name System 縮寫 DNS,是因特網的一項核心服務,它作為可以將域名和 IP 地址相互對映的一個分散式資料庫 (這裡的分散式資料庫是指,每個站點只保留它自己的那部分資料),能夠使人更方便的訪問網際網路,而不用去記住能夠被機器直接讀取的 IP 地址。
域名具有層次結構,從上到下依次為:根域名、頂級域名、二級域名。
DNS 可以使用 UDP 或者 TCP 進行傳輸,使用的埠號都為 53。
大多數情況下 DNS 使用 UDP 進行傳輸,這就要求域名解析器和域名伺服器都必須自己處理超時和重傳從而保證可靠性。
域名解析方式:
-
遞迴查詢
-
迭代查詢
基本原理:
1)瀏覽器搜尋自己的 DNS 快取,快取中維護一張域名與 IP 地址的對應表;
2)若沒有,則搜尋作業系統的 DNS 快取;
3)若沒有,則作業系統將域名傳送至本地域名伺服器(遞迴查詢方式),本地域名伺服器查詢自己的 DNS 快取,查詢成功則返回結果,否則,通過以下方式迭代查詢:
-
本地域名伺服器向根域名伺服器發起請求,根域名伺服器返回 com 域的頂級域名伺服器的地址;
-
本地域名伺服器向 com 域的頂級域名伺服器發起請求,返回許可權域名伺服器地址
-
本地域名伺服器向許可權域名伺服器發起請求,得到 IP 地址
4)本地域名伺服器將得到的 IP 地址返回給作業系統,同時自己將 IP 地址快取起來
5)作業系統將 IP 地址返回給瀏覽器,同時自己也將 IP 地址快取起來
至此,瀏覽器已經得到了域名對應的 IP 地址。
總結
? 計算機之間的通訊過程至此完畢,當然,裡面很多的細節並沒有詳細敘述,計算機網路的知識點比較雜亂,本篇只作為大家構建計算機網路知識體系的開篇之旅
-
博主東南大學研究生在讀,利用課餘時間運營一個公眾號『 飛天小牛肉 』,2020/12/29 日開通,專注分享計算機基礎(資料結構 + 演算法 + 計算機網路 + 資料庫 + 作業系統 + Linux)、Java 基礎和麵試指南的相關原創技術好文。本公眾號的目的就是讓大家可以快速掌握重點知識,有的放矢。希望大家多多支援哦,和小牛肉一起成長 ?
-
並推薦個人維護的開源教程類專案: CS-Wiki(Gitee 推薦專案,現已 0.9k star), 致力打造完善的後端知識體系,在技術的路上少走彎路,歡迎各位小夥伴前來交流學習 ~ ?