1. 數據鏈路層
- 網絡層用于將數據從一臺主機發送到另一臺主機。
- 傳輸層用于將數據可靠的從一臺主機發送到另一臺主機。(網絡層沒有保證可靠性的策略,傳輸過程中可能會出現各種意外,例如:丟包,網絡擁塞等。通過傳輸層可以保證數據可靠的傳輸到對端主機。
- 數據鏈路層用于在局域網內找尋目標主機。當一臺主機要和其他主機通信時,本質上其實是將數據交給路由器通過一跳一跳的方式最終到達目標主機的。
本章介紹數據鏈路層的工作原理,如何在局域網內找到目標主機(路由器)。
2. 以太網協議
2.1 認識以太網
局域網通信技術
- 以太網:每個節點有全球唯一的48位地址,即制造商分配給網卡的MAC地址,以保證以太網上所有節點能互相鑒別。以太網具有廣播特性、半雙工和全雙工傳輸特性以及CSMA/CD特性等。(1000 Mbps)和10G以太網,它們都符合IEEE 802.3系列標準規范。
- 令牌環網:通過在網環上按順序依次傳遞令牌,確保在同一時刻只有一個節點能夠獨占信道,從而避免了傳輸沖突。
- 無線局域網(WLAN):無線局域網技術基于無線通信技術,通過無線信號進行數據傳輸。它提供了無線接入網絡的便利,用戶可以在無線覆蓋范圍內隨時隨地連接到局域網,并享受網絡資源和服務。
認識以太網
- "以太網" 不是一種具體的網絡, 而是一種技術標準; 既包含了數據鏈路層的內容, 也包含了一些物理層的內容. 例如: 規定了網絡拓撲結構, 訪問控制方式, 傳輸速率等;
- 例如以太網中的網線必須使用雙絞線; 傳輸速率有10M, 100M, 1000M等;
- 以太網是當前應用最廣泛的局域網技術; 和以太網并列的還有令牌環網, 無線LAN等;
局域網通信原理:所有主機都會收到消息,但是在數據鏈路層發現消息不是發給自己的,就會自動丟棄該報文。
例如在上圖局域網中,主機A給主機E發送一個消息,其他的所有主機其實都會收到,但是在數據鏈路層判斷出該報文并不是發給自己的,于是直接丟棄了。
碰撞避免
由于局域網通信中,所有主機共享一個通信信道,所以難免存在多條數據發生碰撞的問題,因為發生碰撞可能會對數據造成干擾,所以局域網中同一時間只能有一臺主機發消息。站在系統的角度來看,局域網就是一種臨界資源,多臺主機(多個進程)訪問局域網(臨界資源)時是互斥的(加鎖)。
為了解決這個問題,以太網采用了以下措施:
- 在發送數據前,先偵聽信道是否空閑,如果空閑則立即發送數據。
- 如果信道忙,則繼續偵聽,直到信道空閑時再發送數據。
- 在發送數據的同時,繼續偵聽信道是否發生沖突。
- 如果在發送數據過程中檢測到沖突,則立即停止發送數據并發送一個特殊的信號,通知其他所有站點發生了沖突。
- 發生沖突的站點會執行一種特殊的退避算法(如截斷二進制指數退避算法),等待一段時間后再重新嘗試發送數據。
通過這種方式,以太網能夠在一定程度上減少碰撞的發生,提高通信效率。
令牌環網則采用了令牌傳遞的方式來控制數據的傳輸,從而避免了碰撞的問題。在令牌環網中,每個節點都連接在一個環形鏈路上,并且只有擁有令牌的節點才能發送數據。當一個節點想要發送數據時,它必須等待獲得令牌。當一個節點完成數據傳輸后,它會將令牌傳遞給下一個節點。通過這種方式,令牌環網能夠確保在任意時刻只有一個節點在發送數據,從而避免了碰撞的發生。
令牌環網中的令牌傳遞機制也可以類比為操作系統中的信號量或互斥鎖,它們都是用來控制多個進程對共享資源的訪問。
2.2 以太網幀格式
- 源地址和目的地址是指網卡的硬件地址(也叫MAC地址), 長度是48位,是在網卡出廠時固化的;
- 幀協議類型字段有三種值,分別對應IP、ARP、RARP;
- 幀末尾是CRC校驗碼。
如何將報文和有效載荷分離
因為以太網的報文都是固定大小,所以我們提取出報文的頭14個字節,尾4個字節,剩下的就是數據了。
報文向上交付給哪個協議
接收端收到該報文后,可以提取出該報文的2位類型字段,根據2位類型交給不同的協議。常見的類型:0800為IP協議,0806為ARP協議,8035為RARP協議。
舉個例子
當主機A想要給主機E發送MAC幀時,局域網中所有的主機都會收到該報文,但是到達數據鏈路層后發現該報文并不是發送給自己的,于是將該報文丟棄。
主機E收到該報文后,發現該報文是發給自己的,然后進行CRC校驗,判斷該報文在傳輸過程中是否出現錯誤,如果沒有,提取出類型字段為0800,判斷出要將數據交給IP協議,于是將報文和有效載荷進行分離,然后將數據向上交付。
2.3 認識MAC地址
- MAC地址用來識別數據鏈路層中相連的節點;
- 長度為48位, 及6個字節. 一般用16進制數字加上冒號的形式來表示(例如: 08:00:27:03:fb:19)
- 在網卡出廠時就確定了, 不能修改. mac地址通常是唯一的(虛擬機中的mac地址不是真實的mac地址, 可能會沖突; 也有些網卡支持用戶配置mac地址).
MAC地址有點像我們的身份證,每臺主機都擁有一個全球唯一的MAC地址。
我們使用ifconfig命令來查看我們的MAC地址,前面的ether就是以太的意思。
如何理解MAC地址和IP地址
在網絡通信中,當我們給對方發送消息時,我們需要知道對方的IP地址。根據IP地址我們就能將數據從一臺主機發送到另一臺主機,IP地址就像是一個終極目標。而MAC地址的作用像是為了這個終極目標而劃分成的一個個小目標。
- 1.源IP和目的IP表示通信過程中的起始和終點
- 2.源MAC和目的MAC表示的是通信過程中每一個區間上的起始和重點
舉個例子:唐僧要從東土大唐到西天取經,中間會路過黑風嶺,女兒國,車遲國。在這個例子中,東土大唐和西天相當于是通信的兩臺主機,黑風嶺,女兒國,車遲國看作是路由器,唐僧理解為是通信中的報文。
在東土大唐(發送端)時,唐僧(報文)確定好了目的地(目的IP)以及下一站要去的地點(目的MAC)時,出發到達黑風嶺(路由器),到達后,他的目的IP是不會發生改變的,因為他要去的一直都是西天(接收端)。但是源MAC和目的MAC就會發生改變了,他已經完成了從東土大唐到黑風嶺,接下來就應該從黑風嶺到女兒國。
如圖所示,最終就完成了整個報文的傳輸過程。
2.4 認識MTU
MTU相當于發快遞時對包裹尺寸的限制. 這個限制是不同的數據鏈路對應的物理層, 產生的限制.
- 以太網幀中的數據長度規定最小46字節,最大1500字節,ARP數據包的長度不夠46字節,要在后面補填充位;
- 最大值1500稱為以太網的最大傳輸單元(MTU),不同的網絡類型有不同的MTU
- 如果一個數據包從以太網路由到撥號鏈路上,數據包長度大于撥號鏈路的MTU了,則需要對數據包進行分片(fragmentation);
- 不同的數據鏈路層標準的MTU是不同的;
對于MAC幀來說,其中的數據長度其實就是上層協議交付給他的報文。
為什么要設置MTU
如果不設置MTU,那么數據就不會分包。在網絡傳輸中就會出現數據過長的問題。
長數據的傳輸速度慢,且容易發生碰撞,發生碰撞可能會導致數據出現錯誤,發送端要將整個長數據重新發送(重發的成本較大)。
但是這也不代表分包就是好的。
如果將長數據分包,也就意味著丟包的概率概率增大。原本網絡的丟包概率為萬分之一,如果我們將報文分成一百個,那么丟包概率就上升到了百分之一。
所以我們在網絡通信中,盡可能避免傳送長數據。
2.5 MTU對IP協議的影響
由于數據鏈路層MTU的限制, 對于較大的IP數據包要進行分包
- 將較大的IP包分成多個小包, 并給每個小包打上標簽;
- 每個小包IP協議頭的 16位標識(id) 都是相同的;
- 每個小包的IP協議頭的3位標志字段中, 第2位置為0, 表示允許分片, 第3位來表示結束標記(當前是否是最后一個小包, 是的話置為1, 否則置為0);
- 到達對端時再將這些小包, 會按順序重組, 拼裝到一起返回給傳輸層;
- 一旦這些小包中任意一個小包丟失, 接收端的重組就會失敗. 但是IP層不會負責重新傳輸數據;
因為網絡通信的最大傳輸單元為1500。所以數據網絡層交給數據鏈路層的報文大小就不能超過1500個字節,但是IP協議至少20字節,也就是說IP報文的數據部分不能超過1480個字節。如果超過了就需要在IP層分包。對接收端IP層組裝。
2.6 MTU對UDP協議的影響
- 一旦UDP攜帶的數據超過1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就會在網絡層分成多個IP數據報.
- 這多個IP數據報有任意一個丟失, 都會引起接收端網絡層重組失敗. 那么這就意味著, 如果UDP數據報在網絡層被分片, 整個數據被丟失的概率就大大增加了.
2.7 MTU對TCP協議的影響
因為IP報文的數據長度最大為1480,也就意味著TCP協議交給IP協議的報文大小最大為1480。但是TCP協議報頭的最小長度為20字節,也就是說TCP協議的數據部分不能超過1460的大小,一旦超過就會在網絡層分包。
- TCP的一個數據報也不能無限大, 還是受制于MTU. TCP的單個數據報的最大消息長度, 稱為MSS(MaxSegment Size);
- TCP在建立連接的過程中, 通信雙方會進行MSS協商.
- 最理想的情況下, MSS的值正好是在IP不會被分片處理的最大長度(這個長度仍然是受制于數據鏈路層的MTU).
- 雙方在發送SYN的時候會在TCP頭部寫入自己能支持的MSS值.
- 然后雙方得知對方的MSS值之后, 選擇較小的作為最終MSS. MSS的值就是在TCP首部的40字節變長選項中(kind=2);
對于TCP來說,分片也會增加TCP報文丟包的概率,但與UDP不同的是TCP丟包后還需要進行重傳,因此TCP應該盡量減少因為分片導致的數據重傳。
MTU和MSS的關系如下:
我們可以使用ifconfig命令查看MTU的大小。
2.8 模擬通信過程
當前主機B想要給主機C發送消息。
1.主機B要將數據傳輸給主機C,首先必須先將數據交給局域網中的路由器F,主機B會構建好MAC幀報文進行將報文發送到局域網中。發送報文如下:
2.局域網中所有主機都會收到該報文,其他主機在數據鏈路層識別出該報文的目的地址不是自己的,于是直接將該報文丟棄,路由器F收到該報文后,判斷出該報文是給自己的,于是向上交付給網絡層,網絡層提取出目的IP后,通過路由表查詢到下一次應該將數據交給路由器G。
3.路由器F構建MAC幀報文,發送到路由器F和路由器G所在的局域網中。構建報文如下:
3.不斷經過以上過程,最終將數據傳送給了主機D
3. ARP協議
地址解析協議(Address Resolution Protocol,ARP)協議,根據IP地址獲取MAC地址的一個TCP/IP協議。
3.1 ARP協議的作用
為什么會存在ARP協議
我們剛剛模擬了通信過程,但是中間有一個疑點,主機B如何知道路由器F的MAC地址,從而構建出MAC幀的。
- 方法一:所有主機出廠時內置一份其他所有主機的MAC地址,顯而易見不太現實。
- 方法二:通信過程中獲取對方的MAC地址。
而ARP協議就是我們說的方法二,通過IP地址獲取對方的MAC地址。
ARP的作用
ARP協議建立了主機 IP地址 和 MAC地址 的映射關系.
- 在網絡通訊時,源主機的應用程序知道目的主機的IP地址和端口號,卻不知道目的主機的硬件地址;
- 數據包首先是被網卡接收到再去處理上層協議的,如果接收到的數據包的硬件地址與本機不符,則直接丟棄;
- 因此在通訊前必須獲得目的主機的硬件地址;
3.2 ARP協議的位置
ARP協議實際上是在MAC幀協議之上的。我們再來看一下MAC幀的報文格式。
類型字段的含義是交給上層的哪個協議,其中就有0806對應的就是交給上層的ARP協議,而8035協議是RARP協議。
ARP協議是將IP地址轉化為MAC地址,而RARP的作用剛好相反,是將MAC地址轉化為IP地址。
3.3 ARP協議數據報格式
- 注意到源MAC地址、目的MAC地址在以太網首部和ARP請求中各出現一次,對于鏈路層為以太網的情況是多余的,但如果鏈路層是其它類型的網絡則有可能是必要的。
- 硬件類型指鏈路層網絡類型,1為以太網;
- 協議類型指要轉換的地址類型,0x0800為IP地址;
- 硬件地址長度對于以太網地址為6字節;
- 協議地址長度對于和IP地址為4字節;
- op字段為1表示ARP請求,op字段為2表示ARP應答。
仔細觀察會發現其實前半部分就是以太網報文的首部,而在以太網協議的角度來看,其實ARP協議就是以太網報文的數據部分,這也驗證了其實ARP協議是在以太網協議之上的。
3.4 ARP協議工作流程
現在,主機A想要給主機E發送消息,但是在局域網內通信,必須要知道對方的MAC地址,我們現在來模擬一次主機A是如何獲取主機E的地址的。
APR請求
1.主機A在ARP層構建ARP報文。
- 主機A構建的是ARP請求,所以ARP報文中的op字段設置為1。
- ARP報文中的硬件類型字段設置為1,表示當前使用的是以太網通信。
- ARP報文中的協議類型設置為0800,表示路主機A要根據主機E的IP地址來獲取主機E的MAC地址。
- ARP報文中的硬件地址長度和協議地址長度分別設置為6和4,因為MAC地址的長度是48位,IP地址的長度是32位。
- ARP報文當中的發送端以太網地址和發送端IP地址,對應就是主機A的MAC地址和IP地址。
- ARP報文當中的目的以太網地址和目的IP地址,對應就是主機E的MAC地址和IP地址,但由于主機A當前還不知道主機E的MAC地址,因此將目的以太網地址的二進制序列設置為全1,表示在局域網中進行廣播。
2.主機A在MAC幀層構建MAC幀。
- 封裝MAC幀報頭時,以太網目的地址和以太網源地址,對應分別是主機E和主機A的MAC地址,但由于主機A不知道主機E的MAC地址,因此MAC幀報頭當中的以太網目的地址的二進制序列也只能設置為全1,表示在局域網中進行廣播。
- 因為這里封裝的是一個ARP請求數據包,因此MAC幀當中的幀類型字段設置為0806。
3.主機A在局域網中以廣播的形式發送。
所有主機都會收到該報文。在MAC幀層,其他主機會先看該報文的目的MAC,發現是以廣播的形式,于是再提取出類型字段,發現是0806,這是一個ARP請求報文,于是將該報文的報頭和有效載荷分離,并且將有效載荷向上交付給ARP層。
在ARP層,其他主機先提取出op字段,判斷出這是一個ARP請求的報文,然后再提取出目的IP字段,發現這個報文并不是交給自己的,于是直接將該報文丟棄,而主機E判斷出這個報文是自己的后,就會對該報文進行應答。
ARP響應
4.主機E收到報文后,進行ARP應答,他也會在ARP層構建一個報文。
- 主機E構建的是ARP響應,所以ARP報文中的op字段設置為2。
- 主機E填寫源MAC,源IP,目的MAC和目的IP
5.主機E在MAC幀層構建MAC幀
填寫目的MAC和源MAC。
6.主機E在局域網中發送該報文
所有主機都會收到MAC幀報文,在MAC幀層提取出目的MAC是MACA,與自己的MAC地址不相同,于是直接丟棄報文,不會向上交付。
而主機A在提取出目的MAC后判斷出該報文是發給自己的,于是將該報文進行報頭和有效載荷的分離,并將有效載荷向上交付。在ARP層,先提取出op字段,發現這是一個ARP響應,于是就可以拿到主機E的MAC地址了。
為什么MAC幀中已經有了源MAC和目的MAC,ARP報頭中還要有這兩個字段?
MAC幀中的源MAC和目的MAC地址用于在數據鏈路層上傳輸數據,而ARP報頭中的源MAC和目的MAC地址則用于在數據鏈路層上傳輸ARP請求和響應。這兩個字段在不同的上下文中有不同的用途。
如果下層使用的不是以太網協議,而是其他協議(不一定包含源MAC和目的MAC字段),在ARP層可以提取出源MAC和目的MAC。
為什么主機A在收到ARP應答后,MAC幀中已經有了源MAC,為什么到ARP層才能提取出MACE?
局域網中的任何一臺主機可能即會發送ARP請求,也會收到ARP請求。如果只在MAC幀層,是無法判斷出這個報文是一個ARP請求還是ARP應答。也就是說,主機A無法判斷出該報文是請求主機A的MAC還是對A發送的ARP請求的一個響應,所以主機A需要向上交付給ARP層,ARP提取出op字段為2時才能夠判斷出這是一個ARP響應。
3.5 ARP緩存表
我們并不是每一次獲取ARP都需要經過上述過程。每個主機都會維護一個ARP緩存表,當進行了一次ARP請求和響應時,就把MAC和IP的映射填入ARP緩存表中,下次查詢就可以直接去ARP緩沖表中查了,不需要再進行ARP的請求和響應了。
我們可以使用arp -a命令來查看我們主機的ARP緩存表
需要注意的是緩存表中的表項有過期時間(一般為20分鐘),如果20分鐘內沒有再次使用某個表項,則該表項失效,下次還要發ARP請求來獲得目的主機的硬件地址。
3.6 RARP協議
RARP(Reverse Address Resolution Protocol),即反向地址解析協議,是地址解析協議(ARP)的反向過程。RARP協議的主要功能是將物理地址(MAC地址)轉換為IP地址。在計算機網絡中,當設備(如某些無盤工作站或路由器)啟動時,它可能知道自己的物理地址,但不知道自己的IP地址。這時,設備可以使用RARP協議來請求其邏輯地址。