前面在介紹網絡層時我們提出來過一個問題:主機是怎么把數據交給路由器的?那里我們說這是由數據鏈路層來做的。
網絡上的報文在物理結構上是以mac幀的形式流動的,但在邏輯上是以IP流動的,IP的流動是需要mac幀支持的。
數據鏈路層解決的是相鄰節點間的通信問題。
1. 以太網
1.1 認識以太網
“以太網”不是一種具體的網絡,而是一種技術標準。它既包含了數據鏈路層的內容,也包含了一些物理層的內容。它不但規定了網絡拓撲結構、訪問控制方式、傳輸速率等問題;而且規定了以太網中的網線必須使用雙絞線,其傳輸速率有 10M、100M、1000M……?以太網是當前應用最廣泛的局域網技術,和以太網并列的還有令牌環網、無線 LAN ……
1.2 以太網的幀格式
報頭各部分的功能:
? 源地址和目的地址:指網卡的硬件地址(mac?地址)
? 類型:該字段有三種值,分別對應 IP、ARP、RARP
? CRC:校驗碼
關于mac地址
mac 地址用來識別數據鏈路層中相連的節點,它的長度為 48 位(?6 個字節),一般用 16 進制數字加上冒號的形式來表示(例如: 08:00:27:03:fb:19)。它在網卡出廠時就確定了,不能修改。
mac 地址通常是唯一的(虛擬機中的 mac 地址不是真實的 mac 地址,可能會沖突;也有些網卡支持用戶配置 mac 地址)。
2. MTU
2.1 認識MTU
MTU 相當于發快遞時對包裹尺寸的限制。這個限制是不同的數據鏈路對應的物理層產生的限制。以太網幀中的數據長度規定最小 46 字節,最大 1500 字節,若 ARP 數據包的長度不夠 46 字節就要在后面補填充位。最大值 1500 稱為以太網的最大傳輸單元(MTU),不同的網絡類型有不同的MTU。如果一個數據包從以太網路由到撥號鏈路上,數據包長度大于撥號鏈路的 MTU 則需要對數據包進行分片。
我們可以通過ifconfig 命令查看 ip 地址、mac 地址和 MTU。
2.2 MTU對IP協議的影響
由于數據鏈路層 MTU 的限制,這使得對于較大的 IP 數據包要進行分包。
2.3 MTU對UDP協議的影響
一旦 UDP 攜帶的數據超過 1472(1500 - 20(IP 首部) - 8(UDP 首部))?那么就會在網絡層分成多個 IP 數據報。這多個 IP 數據報有任意一個丟失,都會引起接收端網絡層重組失敗。那么這就意味著:如果 UDP 數據報在網絡層被分片,整個數據被丟失的概率就大大增加了。
2.4 MTU對TCP協議的影響
TCP 的一個數據報也不能無限大,還是受制于 MTU。TCP 的單個數據報的最大消息長度為 1460(1500 - 20(IP首部) - 20(TCP首部)),稱為 MSS(Max Segment Size)。?TCP 在建立連接的過程中,通信雙方會進行 MSS 協商。最理想的情況下就是MSS 的值正好是在 IP 不會被分片處理的最大長度(這個長度仍然是受制于數據鏈路層的 MTU)。
雙方在發送 SYN 的時候會在 TCP 頭部寫入自己能支持的 MSS 值,然后雙方得知對方的 MSS 值之后,選擇較小的作為最終 MSS。MSS 的值就是在 TCP 首部的 40 字節變長選項中(kind = 2)。
MSS和MTU的關系:
3. 局域網通信原理和交換機
3.1 局域網通信原理示意圖
局域網中,任何時刻都只允許一臺機器向網絡中發送數據,如果有多臺同時發送的話,會發生數據干擾,我們稱之為數據碰撞。所有發送數據的主機要進行碰撞檢測和碰撞避免。
如果碰撞了,涉及的主機該怎么辦呢?
兩臺主機都會休眠一下,然后將數據重發(數據鏈路層也有重發機制)。
在沒有交換機的情況下,一個局域網就是一個碰撞域。
從系統的角度來看,局域網就是一個臨界資源,碰撞檢測和碰撞避免就是保護臨界資源,使得任何時刻都只有一臺主機發送消息的策略和機制。
所以在一個局域網(碰撞域)中主機自然是越少越好,如果主機過多就要引入交換機了。
3.2 交換機
交換機的核心問題就是通過對局域網中的mac幀進行分析,從而劃分碰撞域。
4. APR協議
曾經在介紹網絡層時說到過,數據轉發的時候用到的是IP地址,但是在局域網通信時我們使用的可是mac地址啊,所以這也就注定需要在局域網中提供一種將IP地址轉化為mac地址的能力——ARP協議。
4.1 基本原理
源主機發出 ARP 請求,詢問 “IP 地址是 192.168.0.1 的主機的硬件地址是多少”,并將這個請求廣播到本地網段(以太網幀首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示廣播)。目的主機接收到廣播的 ARP 請求后若發現其中的 IP 地址與本機相符,則將自己的硬件地址填寫在應答包中,并發送?ARP 應答數據包給源主機。
總結來說就是:先廣播,后單發。
每臺主機都維護一個 ARP 緩存表,可以用 arp -a 命令查看。緩存表中的表項有過期時間(一般為 20 分鐘),如果 20 分鐘內沒有再次使用某個表項則該表項失效,下次還要發 ARP 請求來獲得目的主機的硬件地址。
C:\Users\caryo>arp -a接口: 172.18.154.182 --- 0xeInternet 地址 物理地址 類型169.254.169.254 cc-d8-1f-28-db-2f 動態172.18.145.119 ac-19-8e-6c-c5-8c 動態172.18.148.251 ac-50-de-88-fa-45 動態172.18.150.140 64-d6-9a-9a-37-1f 動態172.18.152.44 c4-d0-e3-64-de-35 動態
4.2 ARP協議報頭
可以看出ARP協議是 mac 幀協議的上層協議,但是也屬于數據鏈路層。
報頭各部分的功能:
??硬件類型:指鏈路層網絡類型,1 為以太網
? 協議類型:指要轉換的地址類型,0x0800 為 IP 地址
? 硬件地址長度:對于以太網地址為 6 字節
? 協議地址長度:對于和 IP 地址為 4 字節
? op 字段:為 1 表示 ARP 請求,為 2 表示 ARP 應答
4.3 ARP的具體過程
如果路由器知道IP對應的MAC地址,那就可以直接發送,如果不知道,就要使用ARP協議獲取目的MAC。
主機會通過廣播發送 ARP 請求,這個包中包含了想要知道的 MAC 地址的主機 IP 地址。目的MAC地址為全F(FF:FF:FF:FF:FF:FF)。局域網內的所有主機都會收到這個ARP請求,網卡識別目的MAC地址為全F,廣播數據,需要向上交付,再根據幀類型識別是ARP請求/響應。所以向上交付給ARP協議。ARP協議 先看op字段,如果為ARP請求,再看目的IP地址,除目的主機外,其他主機發現不是給自己的,就在ARP層丟棄報文。如果 ARP 請求包中的目標 IP 地址與自己的 IP 地址一致,那么這個設備就將自己的 MAC 地址塞入 ARP 響應包返回給主機。