html
🎁 本文已收錄於 CS-Wiki(Gitee 官方推薦項目,現已 0.9k star)git
計算機網絡的知識點很是雜亂且瑣碎,很是容易讓人產生畏懼心理。其實計網通篇研究的核心就是不一樣計算機之間的通訊過程,👍 本文將從小白的角度,講解兩臺計算機之間是如何精確的找到對方的位置併發送和接收消息的,以幫助讀者從宏觀角度把握計算機網絡的體系結構面試
所謂通訊協議就是通訊雙方都必需要遵照的通訊規則。若是沒有網絡通訊協議,計算機的數據將沒法發送到網絡上,更沒法到達對方計算機,即便可以到達,對方也未必能讀懂。有了通訊協議,網絡通訊纔可以發生。算法
通常咱們用五層協議參考模型來進行計算機網絡的學習:數據庫
應用層後端
運輸層瀏覽器
網絡層緩存
數據鏈路層服務器
物理層網絡
上述各層的做用會在下文詳細講解,咱們首先要明白爲何要分層:
協議的實現是很複雜的。由於協議要把人讀得懂的數據,如網頁、電子郵件等加工轉化成能夠在網絡上傳輸的信號,須要進行的處理工做很是多。
兩個系統中實體間的通訊是一個十分複雜的過程。爲了減小協議設計和調試過程的複雜性,網絡協議一般都按結構化的層次方式來進行組織,每一層完成必定功能,每一層又都創建在它的下層之上。不一樣的網絡協議,其層的數量、各層的名字、和功能不盡相同。
👍 也就是說,每一層都是在下一層的基礎上,經過層間接口向上一層提供必定的服務,而把 「這種服務是如何實現的」 細節對上層加以屏蔽。
❓ 那麼,咱們將一個大型網絡體系分紅了若干個層,各個層之間是如何進行通訊的呢?
1)對等層之間通訊(不一樣開放系統中的相同層次之間的通訊,對等層實體之間的信息交換):OSI 標準爲每一層的通訊都嚴格定義了 協議數據單元 PDU的格式。 對等層之間的通訊是目的,對等層實體的協做保證該層功能和服務的實現
2)相鄰層之間通訊(相鄰的上下層之間的通訊,屬於局部問題):相鄰層之間的通訊是手段,保證對等層實體之間的通訊得以實 施
⭐ 假設網絡協議分爲若干層,那麼 A、B 兩節點通訊,實際是節點 A 的第 n 層與節點 B 的第 n 層進行通訊,故協議老是指某一層的協議,例如物理層協議、傳輸層協議、應用層協議。每一相鄰層協議間有一接口,下層經過該接口向上一層提供服務。
兩臺計算機之間要進行通訊,必然須要傳輸介質/物理媒介來鏈接兩臺計算機,這樣,咱們才能把數據傳輸過去。傳輸介質分爲:
導向型傳輸介質:
雙絞線:適用於近距離
同軸電纜(抗干擾性強):適用於遠距離
光纖:帶寬遠遠大於其餘傳輸媒體
非導向型傳輸介質:
無線電波
微波
紅外線、激光
⭐ 也就是說,物理層的做用就是實現計算機之間的數據傳送,這個數據實際上是比特流,物理層須要儘量屏蔽掉具體傳輸介質和物理設備的差別, 使其上面的數據鏈路層沒必要考慮網絡的具體傳輸介質是什麼,即實現比特流的透明傳輸。
物理層只是簡單的把計算機鏈接起來並在上面傳輸比特流,它仍是存在着不少問題的:
1)物理鏈接是有差錯和不可靠的
2)物理設備之間可能存在傳輸速度不匹配問題
也就是說僅僅靠物理層是沒法保證數據傳輸的正確性的。
⭐ 這樣,數據鏈路層的主要做用就是增強物理層傳輸原始比特流的功能,將物理層提供的可能出錯的物理鏈接改形成爲邏輯上無差錯的數據鏈路,使之對網絡層表現爲一條無差錯的鏈路。在物理層提供服務的基礎上,數據鏈路層還肩負着爲網絡層提供服務的責任,其最基本的服務是未來自網絡層的 IP 數據報封裝成幀,可靠的傳輸到相鄰結點的目標網絡層。
首先了解一下爲何須要封裝成幀:前面說了,物理層它只是簡單的把計算機鏈接起來並在上面傳輸比特流(0、1 序列),若是這些 0,1 組合的傳送毫無規則的話,計算機是解讀不了的。所以,咱們須要制定一套規則來進行 0、1 的傳送,讓計算可以讀懂這些序列。
⭐ 封裝成幀就是:發送端的數據鏈路層接收到上層網絡層傳過來的 IP 數據報後,在其先後部分添加首部、尾部,這樣就構成了一個幀。接收端在收到物理層上交的比特流後,就能根據首部和尾部的標記,從收到的比特流中識別幀的開始和結束。
把一臺計算的的數據經過物理層和鏈路層發送給另外一臺計算機,到底是誰發給誰的,計算機與計算機之間如何區分,你總得給他們一個惟一的標識吧?
因而,MAC 地址出現了 👇
MAC 地址就是鏈路層地址,長度爲 6 字節(48 位),用於惟一標識網絡適配器(網卡)。計算機之間的數據傳送,就是經過 MAC 地址來惟一尋找、傳送的。
一臺主機擁有多少個網絡適配器就有多少個 MAC 地址。例如筆記本電腦廣泛存在無線網絡適配器和有線網絡適配器,所以就有兩個 MAC 地址。
❓ 那麼,一臺計算機它是如何知道另外一臺計算機的 MAC 地址的呢?這是網絡層的 ARP 地址解析協議作的事情,詳見下文 👇
在 計算機網絡中進行通訊的兩個計算機之間可能會通過不少個數據鏈路,也可能還要通過不少通訊子網。
網絡層的任務就是選擇合適的網間路由和交換結點, 確保數據及時傳送。 在發送數據時,網絡層把運輸層產生的報文段或用戶數據報封裝成分組和包進行傳送。
在 TCP/IP 體系結構中,因爲網絡層使用 IP 協議,所以分組也叫 IP 數據報 ,簡稱數據報。
IP 協議用於屏蔽下層物理網絡的差別,爲上層提供統一的 IP 數據報。
IP 協議定義的地址,咱們稱之爲 IP 地址。IP 數據報中含有發/收方的 IP 地址。
IP 協議提供無鏈接的、不可靠的、盡力的數據報投遞服務
1)無鏈接的投遞服務
發送端可於任什麼時候候自由發送數據,而接收端永遠不知道本身會在什麼時候從哪裏接收到數據。每一個數據報獨立處理和傳輸, 一臺主機發出的數據報序列,可能取不一樣的路徑, 甚至其中的一部分數據報會在傳輸過程當中丟失;
2)不可靠的投遞服務
IP 協議自己不保證數據報投遞的結果。 在傳輸的過程當中,數據報可能會丟失、重複、延遲和亂序等, IP協議不對內容做任何檢測,也不將這些結果通知收發雙方; I 數據報的丟失,經過路由器發 ICMP報文
告知; 必要時,由高層實體(如TCP)負責差錯恢復動做。
3)盡力投遞服務
執行數據報的分段和封裝,以適應具體的傳輸網絡, 由最終結點的IP模塊進行合段處理
不一樣物理網絡對傳輸的幀 /分組的體積有不一樣的規定; 當數據報長度 > MTU(最大傳輸單元 MTU—Maximun Transfer Unit )時,需對數據報分段 。
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 協議作的事情,在應用層咱們會詳細講解。
經過物理層、數據鏈路層以及網絡層的互相做用,咱們已經把數據成功從計算機 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 通常用於文件傳輸、發送和接收郵件、遠程登陸等場景。
應用層最接近於用於,它的任務就是經過應用進程間的交互來完成特定網絡應用。
應用層協議定義的是應用進程間的通訊和交互的規則。因爲傳輸層傳來的數據五花八門,有 html 格式的,有 mp4 格式等等,因此對於不一樣的網絡應用須要不一樣的應用層協議。在互聯網中應用層協議不少,如域名系統 DNS,支持萬維網應用的 HTTP 協議,支持電子郵件的 SMTP 協議等等。咱們把應用層交互的數據單元稱爲報文。
因爲本文的關鍵就是講解計算機之間的通訊,因此其餘協議咱們就不講了,只講解一下 DNS 協議是如何將域名轉化爲 IP 地址的。
域名系統 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), 致力打造完善的後端知識體系,在技術的路上少走彎路,歡迎各位小夥伴前來交流學習 ~ 😊