TCP/IP(一):數據鏈路層

背景

這一系列的文章主要是為一般的、非專業開發崗位(如移動端)的工程師準備,一方面可以對網絡的基本知識有基本的了解,另一方面不至于面試中被問到相關問題時束手無策。知識以 TCP/IP 協議簇為主,也會有應用層和數據鏈路層的簡單介紹。

文章內容不會很難,也不會過多討論各種算法,目標是以最快的速度達到最深的理解。內容肯定比直接百度搜索“TCP/IP協議”,然后隨便看一篇文章要豐富得多,但也不足以讓讀者憑此就能勝任網絡開發的工作。

誠然,面試以 TCP/UDP/HTTP 等協議為主,IP 協議都涉及甚少,更遑論數據鏈路層等。但我希望可以從原理上理解那些問題,而不是臨時抱佛腳,背了一些答案然后在面試后忘干凈。不要為面試而準備面試,為了完善自己的知識體系而準備。如果你覺得這正是你需要的,Let's Begin!

OSI七層模型和協議

在這一節中,我們不談這些層和協議的具體作用,目前只要知道 OSI 模型中,網絡被分為七層,由底層向高層依次是:物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層和應用層。

協議是一個 Big 很高,出現很頻繁的詞。其實它很好理解,它實際上是一種通信雙方共同遵守的規范。比如我需要把性別和年齡傳遞給另外一臺主機,那么我可以定義一個"A 協議",協議規定數據的前 4 個字節表示性別,后四個字節表示年齡。這樣對方主機接收時就知道前 4 個字節是性別,而不會錯把它當成年齡來處理。

整個互聯網世界能夠運行,完全得益于各個軟件、硬件廠商嚴格遵守現有的協議。以 IP 協議為例,你可以隨便修改它,然后自己弄出一個 IP2 協議,只不過沒有人認可、遵守這個協議,所以它毫無用武之地。

物理層

物理層處于 OSI 七層模型的最底端,它的主要任務是將比特流與電子信號進行轉換。

在計算機的世界中,一切都由 0 和 1 組成。你看到的這篇文章,在通過網絡傳輸到你電腦的過程中,自然也是以 0 和 1 的形式存在。但是網絡傳輸的介質(比如光纖,雙絞線,電波等)中顯然是不存在 0 和 1 的。比如在光線中,數據通過光的形式傳遞。0 和 1 以光的亮滅表示,其中的轉換由物理層完成。

如果沒有物理層,由 0 和 1 構成的比特流就無法在物理介質中傳播。

數據鏈路層

數據鏈路層處于 OSI 七層模型的第二層,它定義了通過通信介質相互連接的設備之間,數據傳輸的規范。

在數據鏈路層中,數據不再以 0、1 序列的形式存在,它們被分割為一個一個的“幀”,然后再進行傳輸。

數據鏈路層中有兩個重要的概念:MAC 地址和分組交換。

MAC地址

MAC 地址是被燒錄到網卡 ROM 中的一串數字,長度為 48 比特,它在世界范圍內唯一(不考慮虛擬機自定義 MAC 地址)。由于 MAC 地址的唯一性,它可以被用來區分不同的節點,一旦指定了 MAC 地址,就不可能出現不知道往哪個設備傳輸數據的情況。

分組交換

分組交換是指將較大的數據分割為若干個較小的數據,然后依次發送。使用分組交換的原因是不同的數據鏈路有各自的最大傳輸單元(MTU: Maximum Transmission Unit)。不同的數據鏈路就好比不同的運輸渠道,一輛卡車(對應通信介質)的載重量為 5 噸。那么通過卡車運送 20 噸的貨物就需要把這些貨物分成四部分,每份重 5 噸。如果運輸機的載重量是 30 噸,那么這些貨物不需要分割,直接一架運輸機就可以拉走。

以以太網(一種數據鏈路)為例,它的MTU是 1500 字節,也就是通過以太網傳輸的數據,必須分割為若干幀,每個幀的數據長度不超過 1500 字節。如果上層傳來的數據超過這個長度,數據鏈路層需要分割后再發送。

以太網幀

我們用以太網舉例,介紹一下以太網幀的格式。

以太網幀的開頭是“前導碼(Preamble)”,長度為 8 字節,這一段沒什么用,重點在于以太網幀的本體。

本體由首部,數據和 FCS 三部分組成:


自學過程

類型部分存儲了上層協議的編號,比如上層是 IP 協議,則編號為 0800。

FCS 表示幀校驗序列(Frame Check Sequence),用于判斷幀是否在傳輸過程中有損壞(比如電子噪聲干擾)。FCS 保存著發送幀除以某個多項式的余數,接收到的幀也做相同計算,如果得到的值與 FCS 相同則表示沒有出錯。

交換機

交換機是一種在數據鏈路層工作的網絡設備,它有多個端口,可以連接不同的設備。交換機根據每個幀中的目標 MAC 地址決定向哪個端口發送數據,此時它需要參考“轉發表”

轉發表并非手動設置,而是交換機自動學習得到的。當某個設備向交換機發送幀時,交換機將幀的源 MAC 地址和接口對應起來,作為一條記錄添加到轉發表中。

下圖描述了交換機自學過程的原理


自學過程

關于數據鏈路層,最重要的一點還是它的定義:“通過通信介質相互連接的設備之間,數據傳輸的規范”。這說明數據鏈路層的協議適用于處于同一種數據鏈路兩端的節點。如果不能理解這一點,就無法理解網絡層和 IP 協議。

數據鏈路層的意義在于,如果沒有數據鏈路層,數據只能以流的形式存在與通信介質中,不知道該發送往哪里,過長的數據流可能無法在通信介質中傳輸。



文/bestswifter(簡書作者)
原文鏈接:http://www.jianshu.com/p/f16d7f3c8d5f
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248016.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

富文本和封面制作

1. 富文本編輯器的實現步驟 添加如下的 layui 表單行&#xff1a; <div class"layui-form-item"><!-- 左側的 label --><label class"layui-form-label">文章內容</label><!-- 為富文本編輯器外部的容器設置高度 --><div…

Linux系統編程——線程(1)

目錄 線程概要Linux內核線程實現原理線程的共享/不共享資源線程優缺點線程控制原語pthread_selfpthread_createpthread_exitpthread_joinpthread_cancel終止線程方式控制原語對比前情提要&#xff1a; Linux用戶級線程和內核級線程區別 線程概要 Linux內核線程實現原理 類Unix系…

TCP/IP(二):IP協議

IP協議處于OSI參考模型的第三層——網絡層&#xff0c;網絡層的主要作用是實現終端節點間的通信。IP協議是網絡層的一個重要協議&#xff0c;網絡層中還有ARP(獲取MAC地址)和ICMP協議(數據發送異常通知) 數據鏈路層的作用在于實現同一種數據鏈路下的包傳遞&#xff0c;而網絡層…

Ajax — 大事件項目(第四天)

分類管理 添加分類 初步使用彈出層 給 “添加分類” 綁定一個單擊事件單擊事件中&#xff0c;使用 layer.open() 實現一個彈出層 type: 1, 彈層的類型是頁面層title, “添加文字分類”content: ‘字符串&#xff0c;DOM’,area: [‘500px’, ‘250px’] // ---------------…

redis學習(四)

一、Redis 鍵(key) 1、Redis 鍵命令用于管理 redis 的鍵。 2、Redis 鍵命令的基本語法如下&#xff1a;redis 127.0.0.1:6379> COMMAND KEY_NAME 3、常用key命令 keys * 獲取所有的keyselect 0 選擇第一個庫move myString 1 將當前的數據庫key移動到某個…

TCP/IP(三):IP協議相關技術

在前兩篇文章中&#xff0c;我分別介紹了數據鏈路層和網絡層的IP協議。雖然這個系列教程的重點是搞定 TCP/IP&#xff0c;不過不用著急&#xff0c;本文簡要介紹完與 IP 協議相關的技術&#xff0c;下一篇文章就會正式、詳細的介紹 傳輸層與 TCP 協議。這篇文章會介紹 DNS、ARP…

Node — 第一天

Node-01 會 JavaScript&#xff0c;就能學會 Node.js&#xff01;&#xff01;&#xff01; **Node.js 的官網地址&#xff1a; ** Node.js 的學習路徑&#xff1a; JavaScript 基礎語法 Node.js 內置 API 模塊&#xff08;fs、path、http等&#xff09; 第三方 API 模塊&…

TCP/IP(四):TCP 與 UDP 協議簡介

從本章開始&#xff0c;我們開始介紹最重要的傳輸層。傳輸層位于 OSI 七層模型的第四層&#xff08;由下往上&#xff09;。顧名思義&#xff0c;傳輸層的主要作用是實現應用程序之間的通信。網絡層主要是保證不同數據鏈路下數據的可達性&#xff0c;至于如何傳輸數據則是由傳輸…

Node — 第二天

http模塊 搭建服務器的步驟 ① 導入 http 模塊 ② 創建 web 服務器實例 ③ 為服務器實例綁定 request 事件&#xff0c;監聽客戶端的請求 ④ 啟動服務器 // ① 導入 http 模塊 const http require(http);// ② 創建 web 服務器實例 const server http.createServer();/…

《學習之道》第九章不要突擊工作

靈感從天而降的時刻確實是存在的。 這樣少見的創造性突破&#xff0c;通常是在經歷了一番神經緊張的準備、竭盡全力的努力&#xff0c;甚至包括熬夜工作后才姍姍來遲。這與 數學 和 科學標準的一天學習 是大不相同的。 它更像體育運動&#xff1a;每隔一陣子會有一天的比賽&…

TCP/IP(五):TCP 協議詳解

上一節 中講過&#xff0c;TCP 協議是面向有連接的協議&#xff0c;它具有丟包重發和流量控制的功能&#xff0c;這是它區別于 UDP 協議最大的特點。本文就主要討論這兩個功能。 數據包重發 數據發送 丟包重發的前提是發送方能夠知道接收方是否成功的接收了消息。所以&#…

nodeJS — 學習的筆記

Node介紹 為什么要學習Node.js 企業需求 具有服務端開發經驗更改front-endback-end全棧開發工程師基本的網站開發能力 服務端前端運維部署 多人社區 [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MVqHkEIo-1588084625862)(C:\Users\A\AppData\R…

TCP/IP(六):HTTP 與 HTTPS 簡介

本文是準備面試過程中網絡部分總結整理的最后一篇文章&#xff0c;主要介紹以下知識&#xff1a; HTTP 協議概述POST 請求和 GET 請求Cookie 和 Session數據傳輸時的加密HTTPS 簡介 HTTP 協議 在 OSI 七層模型中&#xff0c;HTTP 協議位于最頂層的應用層中。通過瀏覽器訪問網…

Node — 第三天

模塊化 什么是模塊化 模塊化是指解決一個復雜問題時&#xff0c;自頂向下逐層把系統劃分成若干模塊的過程。 對于整個系統來說&#xff0c;模塊是可組合、分解和更換的單元。 生活中的模塊化 編程中的模塊化 編程領域中的模塊化&#xff0c;就是遵守固定的規則&#xff0c;…

FireDAC 中文字段過濾問題

當使用 FireDAC Filter 過濾數據的時候&#xff0c;通常這樣寫&#xff1a; FDMemTable.Filtered : False; FDMemTable1.Filter : 姓名 string(edtFilter.Text).QuotedString; FDMemTable.Filtered : True; 將會報錯&#xff1a;[FireDAC][Stan][Eval]-107. Invalid characte…

UIScrollViewDelegate-代理API詳解

在iOS編程中&#xff0c;經常用到UIScrollView控件。自然也會用到UIScrollViewDelegate協議。 今天就抽空&#xff0c;研究了一下UIScrollViewDelegate中所有的委托方法。 僅做Mark&#xff01;如有&#xff0c;錯誤之處&#xff0c;歡迎留言指正&#xff0c;交流&#xff01;貼…

License for package Android SDK Build-Tools 28.0.2 not accepted.(MAC)

https://blog.csdn.net/user11223344abc/article/details/83997907轉載于:https://www.cnblogs.com/dtdxrk/p/10812469.html

Express — 使用步驟

Express Express 介紹安裝搭建服務器的步驟express提供的新方法GET接口 獲取GET中的請求參數 POST接口 獲取POST請求提交的數據 中間件原理中間件語法中間件初體驗&#xff08;設置響應頭&#xff09;中間件開放靜態資源中間件接收POST請求體中間件返回404頁面 express 介紹 E…

大模型工具_Langchain-Chatchat

https://github.com/chatchat-space/Langchain-Chatchat 原Langchain-ChatGLM 1 功能 整體功能&#xff0c;想解決什么問題 基于 Langchain 與 ChatGLM 等LLM模型&#xff0c;搭建一套針對中文場景與開源模型&#xff0c;界面友好、可離線運行的知識庫問答解決方案。 當前解決…

iOS 鍵盤風格詳解UIKeyboardType

一、鍵盤風格 UIKit框架支持8種風格鍵盤。 [java] view plaincopy print?typedef enum { UIKeyboardTypeDefault, // 默認鍵盤&#xff1a;支持所有字符 UIKeyboardTypeASCIICapable, // 支持ASCII的默認鍵盤 UIKeyboardTypeNu…