數據鏈路層協議
- 一、鏈路層解決的問題
- 二、以太網協議
- 1、局域網技術
- 2、令牌環網(了解)
- 3、以太網通信原理
- 4、 MAC地址
- 5、以太網幀格式
- 6、碰撞避免
- 7、最大傳輸單元MTU
- 二、ARP協議
- 1、ARP數據的格式
- 2、ARP協議的工作流程
- 3、ARP緩存表
- 4、ARP協議中的一些問題
- 7、成為中間人的一種方式——ARP欺騙
- 6、RARP協議
一、鏈路層解決的問題
-
IP擁有將數據跨網絡從一臺主機送到另一臺主機的能力,但是我們會發現但數據在網絡傳輸時需要一跳一跳的從一個局域網跳到另一個局域網,最終才能將數據轉發到目標主機。
-
因此要將數據發送到目標主機的前提是:在一個局域網內如何將數據進行轉發,而兩臺主機在一個局域網內也就意味著這兩臺主機屬于同一網段(網絡號相同),因此將數據轉發到下一跳主機(通常是路由器)實際是屬于局域網通信范疇的,而這實際就是鏈路層需要解決的問題。
- 數據鏈路層屬于驅動層,其向下可以屏蔽物理層中介與傳輸介質的不同,以及通信,規程協議的不同,從邏輯上構建一條性能穩定,不受傳輸介質類型影響的人物及數據傳輸通道。
二、以太網協議
1、局域網技術
不同局域網所采用的通信技術可能是不同的,常見的局域網技術有以下三種:
- 以太網:以太網是一種計算機局域網技術,一種應用最普遍的局域網技術。
- 令牌環網:令牌環網常用于IBM系統中,在這種網絡中有一種專門的幀稱為“令牌”,在環路上持續地傳輸來確定一個節點何時可以發送包。
- 無線LAN/WAN:無線局域網是有線網絡的補充和擴展,現在已經是計算機網絡的一個重要組織部分。
雖然網絡中各個局域網所采用的通信技術可能的不同的,但是IP屏蔽了底層網絡的差異,對于網絡通信雙方的IP層及其往上的協議來說,它們并不需要關心底層具體使用的是哪種局域網技術。
- 數據在發送之前會先進行數據封裝,此時鏈路層會給數據封裝上對應的局域網的協議報頭。
- 如果數據要進行跨網絡傳輸,那么就需要經過路由器轉發。
- 當數據在路由器進行向上交付時,會將該數據對應的局域網報頭去掉,而當路由器該數據轉發給下一跳之前,又會給該數據封裝上下一跳網絡所對應的局域網報頭。
也就是說,網絡中的路由器會不斷去掉數據舊的局域網報頭,并添加上新的局域網報頭,因此數據在進行跨網絡傳輸時,就算所需跨越的網絡采用的是不同的局域網技術,最終也能夠正確實現跨越。
2、令牌環網(了解)
- 令牌環網(Token-ring network)的傳輸方法在物理上采用了星形拓撲結構,但邏輯上是環形拓撲結構。
- 令牌環網的通信傳輸介質可以是無屏蔽雙絞線、屏蔽雙絞線和光纖等。
- 令牌環網中各節點間采用多站訪問部件(Multistation Access Unit,MAU)連接在一起,MAU是一種專業化集線器,用來圍繞工作站計算機的環路進行傳輸。
在令牌環網中有一種專門的幀稱為“令牌”,這個“令牌”會在環路上持續地傳輸,只有拿到“令牌”的主機才能發送數據,因此發送出去的數據不會發生碰撞。
3、以太網通信原理
-
“以太網”不是一種具體的網絡,而是一種技術標準,它既包含了數據鏈路層的內容,也包含了一些物理層的內容。例如,以太網規定了網絡拓撲結構,訪問控制方式,傳輸速率等。
-
以太網中的網線必須使用雙絞線,傳輸速率有10M,100M,1000M等。
-
以太網中所有的主機共享一個通信信道,當局域網中的一臺主機發出數據后,該局域網中的所有主機都能夠收到該數據,包括自己。
例如下面的一個以太網
當局域網中的主機A想要發送數據給主機E時,其實局域網當中的每一臺主機都能收到主機A發出去的數據,只不過最終只有主機B會將主機A發來的數據向上進行交付。
局域網當中的其他主機雖然也收到了主機A發出的數據,但經過識別后發現這個數據不是發送給自己的,于是就會直接將該數據丟棄而不會向上進行交付。
擴展:
-
網卡有一種模式叫做混雜模式,被設置為混雜模式的網卡能夠接收所有經過它的數據流,并向上交付給IP層而不論其目的地址是否是它,這也是許多抓包攻擊的基本原理。
-
網絡抓包不僅能夠抓到發送給自己的報文數據,也能抓取到發給別人的報文數據,實際就是因為在進行網絡抓包時,主機將從局域網中收到的所有報文數據都向上交付了而已。
4、 MAC地址
- MAC地址用來識別數據鏈路層中相連的節點。
- 長度為48位,即6個字節。一般用16進制數字加上冒號的形式來表示(例如: 08:00:27:03:fb:19)
- 在網卡出廠時就確定了,不能修改。mac地址通常是唯一的(虛擬機中的mac地址不是真實的mac地址,可能會沖突。也有些網卡支持用戶配置mac地址)
5、以太網幀格式
-
源地址和目的地址是指網卡的硬件地址(也叫MAC地址)。
-
類型字段有三種值,表示MAC幀數據是什么協議的數據,
0800
對應IP協議、0806
對應ARP協議和8035
對應的是RARP協議。 -
MAC幀數據,其大小是有限制的
46~1500
字節。 -
幀末尾是CRC校驗碼
以太網協議的解包
以太網MAC幀的幀頭和幀尾都是固定長度的總共有18個字節,因此當底層收到一個MAC幀后,直接提取出MAC幀當中固定長度的幀頭和幀尾,此時剩下的就是有效載荷了。
以太網協議的分用
以太網MAC幀對應的上層協議不止一種,在MAC幀的幀頭當中有2個字節的類型字段,因此在分離出報頭和有效載荷后,根據該字段就可以有效載荷交付給對應的上層協議,完成報文的分用。
6、碰撞避免
由于以太網中的所有的主機共享一個通信信道,因此在同一時刻只允許有一臺主機發送數據,否則各個主機發送的數據就會相互干擾,所以一個局域網又稱為一個碰撞域。
站在系統的角度來看,這里各個主機所共享的通信信道就是一種臨界資源,這個臨界資源同一時刻只允許一臺主機使用。
碰撞避免算法
對于如何解決這個數據相互碰撞的問題,以太網的做法是:
-
先不限制各個主機發送數據的能力,局域網中的每個主機想發數據的時候直接發,但是只要發送出去的數據與其他主機發送的數據產生了碰撞,那就得執行碰撞避免算法。
-
所謂的碰撞避免算法就是,由于主機發送出去的數據在局域網內所有主機都能夠收到(本主機也能夠收到),所以本機就可以對收到的數據與源數據進行CRC檢驗,如果檢驗沒有出現問題,就說明本次發送的數據沒有被經過碰撞。
-
當主機發送出去的數據產生碰撞時,碰撞的所有主機各自等待一段隨機時間后再進行數據重發,在發生碰撞的主機等待的時候就能夠盡可能讓局域網當中的數據消散,以及給其他主機發送數據的機會。
-
不必過于擔心數據一直在碰撞導致數據一直無法從局域網中發送出去,因為在一個通信信道內數據的發送速度是很快很快的,接近于光速。
碰撞避免算法就是主機等待一段時間后重新發送數據,因此以太網底層也有重傳機制,只不過以太網的重傳機制只是為了保證將數據從局域網中的一臺主機發送到另一臺主機。
從系統角度看:
令牌環網當中的“令牌”就像系統當中用于保護臨界資源的互斥鎖一樣,“令牌”與互斥鎖一樣也有“忙”和“閑”兩種狀態,“忙”表示令牌已經被占用,而“閑”則表示令牌沒有被占用。
想要發送數據的計算機必須首先檢測到“閑”令牌,并將其置為“忙”狀態,然后才可以發送數據,這就和申請互斥鎖的過程很像。
此外,由于“令牌”在網環上是按順序依次傳遞的,因此對于所有入網的計算機而言,它們獲取令牌的機會都是相等的,因此不會造成某臺主機發送數據的饑餓問題。
交換機
隨著網絡的發展,局域網中的主機越來越多,為了更好的解決數據碰撞問題,誕生出了一種硬件設備——交換機。
交換機工作在數據鏈路層,可以用來隔離沖突域,交換機可以對MAC幀數據進行轉發,在每個交換機中,都有一張MAC地址表,這個表是交換機自動學習的。
交換機的作用:
- 連接多個以太網物理段,隔離沖突域
- 對MAC幀進行高速而透明的交換轉發
- 自行學習和維護MAC地址信息
例如,當區域1中的主機A與主機B進行數據發送時,發生了數據碰撞,其碰撞不會被廣播到區域2中,所以在同一時刻主機F也想進行數據發送時,不會受到區域1碰撞的影響,能夠成功發送數據。
又或者同一區域內的主機進行通信時不會影響其他區域,當被交換機分割的不同區域需要進行通信時,可以由交換機進行數據的交換,這樣就能夠將碰撞域進行減小和隔離,來確保較少的發生數據碰撞。
7、最大傳輸單元MTU
MTU(Maximum Transmission Unit,最大傳輸單元)描述的是底層數據幀一次最多可以發送的數據量,這個限制是不同的數據鏈路層對應的物理層產生的。
-
以太網對應MTU的值一般是1500字節,不同的網絡類型有不同的MTU,如果一次要發送的數據超過了MTU,則需要在IP層對數據進行分片(fragmentation)。
-
此外,以太網規定MAC幀中數據的最小長度為46字節,如果發送數據量小于46字節,則需要在數據后面補填充位,比如ARP數據包的長度就是不夠46字節的。
MUT對IP協議的影響
-
因為數據鏈路層規定了最大傳輸單元MTU,所以如果IP層一次要發送的數據量超過了MTU,此時IP層就需要先對該數據進行分片,然后才能將分片后的數據向下交付。
-
當對端IP層收到這些分片報文后,需要先將這些分片報文按順序進行組裝,拼裝到一起后再向上交付給傳輸層。
-
數據的分片和組裝發生在IP層,不僅源端主機可能會對數據進行分片,數據在路由過程中的路由器也可能對數據進行分片。因為不同網絡的MTU是不一樣的,如果傳輸路徑上的某個網絡的MTU比源端網絡的MTU小,那么路由器就可能對IP數據報再次進行分片。
MTU對UDP協議的影響
- IP報頭當中如果不攜帶選項字段,那么IP報頭的長度就是20字節,而UDP采用的是定長的8字節報頭,因此如果UDP一次攜帶的數據超過了 1500 ? 20 ? 8 = 1472 1500 ? 20 ? 8 = 1472 1500?20?8=1472 字節,此時數據就需要在IP層進行分片。
MTU對TCP協議的影響
-
同理,MAC幀的有效載荷最大為
MTU
,因此TCP就要有有效載荷最大為MSS
,由于TCP和IP常規情況下報頭的長度都是20字節,因此一般情況下 M S S = M T U ? 20 ? 20 MSS = MTU - 20 - 20 MSS=MTU?20?20,而以太網MTU的值是1500字節,因此MSS的值一般就是1460字節。 -
TCP通信雙方在建立連接的過程中,就會進行
MSS
協商,最終選取雙方支持的MSS值當中的較小值作為最終MSS。 -
MSS的值實際就是在TCP首部的40字節的選項字段當中的(kind=2)。
MSS和MTU的關系如下:
二、ARP協議
ARP協議,地址解析協議(Address Resolution Protocol,ARP),是根據IP地址獲取MAC地址的一個協議,ARP協議工作在數據鏈路層但是其工作在以太網之上。

為什么會存在ARP這樣的協議?
-
實際在進行數據路由時,通過IP路由我們能夠將數據交給目標主機所在局域網中的路由器。
-
此時路由器和目標主機是屬于同一個局域網的,因此路由器能夠直接將數據交給目標主機,但要給同局域網中的一臺主機發送數據,前提是得先知道對方的MAC地址。
-
但路由器此時只知道目標主機的IP地址,因此路由器必須通過某種方式得到目標主機的MAC地址。
因此我們就需要有ARP這樣的協議來根據IP地址來獲取目標主機的MAC地址。
1、ARP數據的格式
- 硬件類型指鏈路層的網絡類型,1為以太網。
- 協議類型指要轉換的地址類型,0x0800為IP地址。
- 硬件地址長度對于以太網地址為6字節,因為MAC地址是48位的。
- 協議地址長度對于IP地址為4字節,因為IP地址是32位的。
- op字段為1表示ARP請求,op字段為2表示ARP應答。
從ARP的數據格式也可以看出,ARP是MAC幀協議的上層協議,ARP數據格式中的前3個字段和最后一個字段對應的就是以太網首部,但由于ARP數據包的長度不足46字節,因此ARP數據包在封裝成為MAC幀時還需要補上18字節的填充字段。
2、ARP協議的工作流程
ARP的大致工作原理
雖然路由器不知道目標主機的MAC地址,但是路由器有目標主機的IP地址,而在一個局域網中,所有的主機的IP地址都是不同的,于是路由器就可以在局域網內以廣播的形式,在局域網內大喊:IP為"192.168.1.xxx"的主機是誰?
局域網內的所有主機受到報文以后,都會比對自己的IP地址是不是路由器所說的IP,如果不是就不進行處理,如果是就將自己的MAC地址告訴路由器,于是路由器就通過IP地址拿到了MAC地址。
還是以剛才的例子為例,路由器D要將數據轉發給同一局域網當中的主機B,前提是路由器D必須知道主機B的MAC地址,而現在路由器D只知道主機B的IP地址,因此路由器D現在需要向主機B發起ARP請求,然后等待主機B發送ARP應答得知主機B的MAC地址。
ARP請求的過程:
- 首先,因為路由器D構建的是ARP請求,因此ARP請求當中的op字段設置為1。
- 其次,ARP請求當中的硬件類型字段設置為1,因為當前使用的是以太網通信。
- ARP請求當中的協議類型設置為0800,因為路由器是要根據主機B的IP地址來獲取主機B的MAC地址。
- ARP請求當中的硬件地址長度和協議地址長度分別設置為6和4,因為MAC地址的長度是48位,IP地址的長度是32位。
- ARP請求當中的發送端以太網地址和發送端IP地址,對應就是路由器D的MAC地址和IP地址。
- ARP請求當中的目的以太網地址和目的IP地址,對應就是主機B的MAC地址和IP地址,但由于路由器D不知道主機B的MAC地址,因此將目的以太網地址的二進制序列設置為全1,表示在局域網中進行廣播。
ARP請求構建完成后,為了能將ARP請求發送到以太網當中,還需要將ARP數據包向下交付給MAC幀協議,封裝成MAC幀。
-
封裝MAC幀報頭時,以太網目的地址和以太網源地址,對應分別是主機B和路由器D的MAC地址,但由于路由器D不知道主機B的MAC地址,因此MAC幀報頭當中的以太網目的地址的二進制序列也只能設置為全1,表示在局域網中進行廣播。
-
因為這里封裝的是一個ARP請求數據包,因此MAC幀當中的幀類型字段設置為0806。
-
由于ARP請求數據包的長度只有28字節,不足46字節,因此還需要在MAC幀的有效載荷當中補上18字節的填充字段,最后再對MAC幀添加CRC校驗即可。
MAC幀封裝完畢后,路由器D就可以將封裝好的MAC幀以廣播的方式發送到局域網當中了。
-
由于MAC幀是以廣播的方式發出的,因此局域網當中的每臺主機收到這個MAC幀后,都會對該MAC幀進行解包。當這些主機識別到MAC幀當中的幀類型字段為0806后,便知道這是一個ARP的請求或應答的數據包,于是會將MAC幀的有效載荷向上交付給ARP層。
-
當ARP層收到這個數據包后,發現ARP數據包當中的op字段為1,于是判定這是一個ARP請求,然后再提取出ARP數據包當中的目的IP地址字段,雖然局域網當中的所有主機都會將該數據包交給自己的ARP層,但最終只有主機B發現ARP數據包當中的目的IP地址與自己相同,因此只有主機B會對該ARP請求進行應答,而局域網當中的其他主機在識別到ARP數據包當中的目的IP地址與自己不匹配后,就會直接將這個ARP請求報文丟棄。
-
需要注意的是:局域網當中其他不相干的主機在收到這個ARP請求報文后,不是在MAC幀層丟棄的,而是在ARP層發現該ARP數據包的目的IP與自己的IP不匹配后丟棄的。
ARP應答的過程 :
-
首先,因為主機B構建的是ARP應答,因此ARP應答當中的op字段設置為2。
-
ARP應答當中的硬件類型、協議類型、硬件地址長度、協議地址長度的值與ARP請求當中設置的值相同。
-
ARP應答當中的發送端以太網地址和發送端IP地址,對應就是主機B的MAC地址和IP地址。
-
ARP應答當中的目的以太網地址和目的IP地址,對應就是路由器D的MAC地址和IP地址,因為路由器D發來的ARP請求當中告知了主機B它的MAC地址和IP地址,因此主機B是知道的。
同理,ARP應答構建完成后,為了能將ARP應答發送到以太網當中,也需要將ARP數據包向下交付給MAC幀協議,封裝成MAC幀。
-
封裝MAC幀報頭時,以太網目的地址和以太網源地址,對應分別是路由器D和主機B的MAC地址。
-
因為這里封裝的是一個ARP應答數據包,因此MAC幀當中的幀類型字段設置為0806。
-
由于ARP應答數據包的長度也只有28字節,不足46字節,因此也需要在MAC幀的有效載荷當中補上18字節的填充字段,最后再對MAC幀添加CRC校驗。
MAC幀封裝完畢后,主機B就可以將封裝好的MAC幀發送到局域網當中了。
-
此時局域網當中的每臺主機在底層都能收到這個MAC幀,但局域網當中的不相干的主機,在發現該MAC幀對應的以太網目的地址與自己不同后,就會將該MAC幀丟棄,而不會交付給上層ARP層,最終只有路由器D會將解包后MAC幀的有效載荷向上交付給自己的ARP層。
-
當路由器D的ARP層收到這個數據包后,發現ARP數據包當中的op字段為2,于是判定這是一個ARP應答,然后就會提取出ARP數據包當中的發送端以太網的地址和發送端IP地址,此時路由器D就拿到了主機B的MAC地址。
需要注意的是,局域網當中其他不相干的主機在收到這個ARP應答報文后,直接在MAC幀層就丟棄了,并沒有將其交付給自己的ARP層。
3、ARP緩存表
如果每次局域網內的兩個主機想要進行通信都要先進行ARP請求,就會導致局域網內存在過多的數據碰撞,所以每臺主機都維護了一個ARP緩存表,每次發起ARP請求后都會建立對應主機IP地址和MAC地址的映射關系,緩存表中的表項有過期時間,這個時間一般為20分鐘,如果20分鐘內沒有再次使用某個表項,那么該表項就會失效,下次使用時就需要重新發起ARP請求來獲得目的主機的硬件地址。
我們可以用arp -a
命令進行查看ARP緩存表:
Linux下:
在Windowsh下會更加清晰一些:
4、ARP協議中的一些問題
1、MAC幀的報頭當中已經涵蓋了源和目的MAC地址,為什么ARP的報頭當中還要有這兩個字段?
需要注意的是,MAC幀和ARP雖然都在數據鏈路層,但畢竟是上下層的關系,因此它們不會互相關心彼此報頭當中的數據。
此外,如果底層網絡采用的不是以太網,而是其他類型的網絡,此時ARP層的MAC地址就是必要的了。
2、在局域網內路由器將報文交給目標主機時,為什么不直接以廣播的方式發送數據,非要獲取目標主機的MAC地址?
在進行局域網通信時,就算只知道對方的IP地址,而不知道對方的MAC地址,也可以以廣播的方式將數據發送到局域網當中,此時局域網當中的主機也能夠在IP層比對目的IP地址與自己是否相符,來判斷收到的這個數據是否是發送給自己的。
理論上確實可以這樣,但這種方式是不妥的。
-
對于局域網當中的大多數主機來說,收到的這個報文其實早就應該被丟棄,而現在這個報文卻交付到了IP層,我們都知道IP層是屬于操作系統管控的,因此這對網絡資源和系統資源來說都是一種浪費。
-
因此在底層MAC幀層就應該判定這個報文是不是發送給當前主機的,而不是當數據向上交付到了IP層再來判斷。
此外,如果無腦使用廣播的方式來進行數據的發送,會使得廣播和單播的概念變得模糊不清,你明明是想發送數據給局域網當中的一臺主機,但你卻采用了廣播的方式,這顯然是不合理的。
3、什么時候需要發起ARP請求?
我們剛才說的路由器D要將數據發送給主機B的時候,需要通過ARP獲得主機B的MAC地址,但實際數據在路由過程中的每一跳可能都需要發起ARP請求,詢問下一跳主機對應的MAC地址,因為在每一跳時我們一般都是只知道下一跳的IP地址,而并不知道其對應的MAC地址的。
注意: ARP屬于局域網通信的協議標準,因此一臺主機不能跨網絡向另一臺主機發起ARP請求
7、成為中間人的一種方式——ARP欺騙
ARP請求和響應沒有必然的一對一關系,也就是如果一個主機沒有發起過ARP請求其仍然可能收到ARP應答,這是為了保證ARP緩存表能夠緩存最新的ARP信息。
于是利用這個特點,當黑客在一個局域網中就可以構建假的ARP響應進行欺騙從而成為中間人。
例如下面:
黑客向主機A發送ARP響應,“我是IPC,我的MAC地址是MACE”,向主機C發送"我是IPA,我的MAC地址是MACE",這樣當以后主機A/C給主機C/A通信的數據都會被先發送給主機E,然后由主機E選擇進行正常發送還是攔截報文,甚至是修改報文。
6、RARP協議
RARP(Reverse Address Resolution Protocol,反向地址轉換協議),是根據MAC地址獲取IP地址的一個TCP/IP協議。
也就是說,某些情況下我們可能只知道一臺主機的MAC地址,此時要得知該主機的IP地址就可以使用RARP協議。
RARP協議要比ARP協議更加簡單,因為既然我們已經知道一臺主機的MAC地址了,那么我們就已經可以直接向給主機發送消息了,因此我們可以直接發消息詢問對方的IP地址就行了。
參考資料:
數據鏈路層協議 ——— 以太網協議