?? 盡人事,聽天命,博主東南大學研究生在讀,熱愛健身和籃球,正在為兩年后的秋招準備中,樂于分享技術相關的所見所得,關注公眾號 @ 飛天小牛肉,第一時間獲取文章更新,成長的路上我們一起進步
?? 本文已收錄于 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), 致力打造完善的后端知識體系,在技術的路上少走彎路,歡迎各位小伙伴前來交流學習 ~ ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260469.html
標籤:Java
上一篇:jdk 動態代理原始碼分析
下一篇:Java 記憶體模型
