主頁 > 後端開發 > 💻 一文讀懂兩臺計算機之間是如何通信的

💻 一文讀懂兩臺計算機之間是如何通信的

2021-02-18 06:07:26 後端開發

 

?? 盡人事,聽天命,博主東南大學研究生在讀,熱愛健身和籃球,正在為兩年后的秋招準備中,樂于分享技術相關的所見所得,關注公眾號 @ 飛天小牛肉,第一時間獲取文章更新,成長的路上我們一起進步

?? 本文已收錄于 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 記憶體模型

標籤雲
其他(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)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more