目錄
- 1.從網絡層到數據鏈路層
- (1)MAC地址
- (2)IP地址和MAC地址的區別
- (3)ARP
- (4)不同層之間的關系
- 2.以太網
- (1)以太網的幀格式
- (2)數據分片的原因
- ①碰撞域
- ②MTU
- ③網絡層和傳輸層的處理
- (3)類型
- ①正常交付
- ②ARP請求
- ③總結
- (4)CRC
- 3.交換機和集線器
- (1)交換機的作用
- (2)理解交換機
- (3)集線器
1.從網絡層到數據鏈路層
我們順著協議棧,經過TCP(UDP),網絡層,接下來就應該到鏈路層了。網絡層的報文會向下交付給鏈路層,鏈路層會怎么處理呢?我會從它要實現的功能出發,逐個展開。
(1)MAC地址
我們知道IP是網絡層的產物,端口號是傳輸層的產物,他們的本質都是定位一個對象,這樣才能正常交付,鏈路層也有這樣的設計。當數據傳給鏈路層之后,鏈路層之下就是物理層了,直接負責數據傳輸,所以鏈路層是數據包裝的最底層(非常關鍵),物理層傳輸數據的就是經過鏈路層包裝的數據。
數據鏈路層要解決的第一個問題是:如何知道數據往哪里傳?但是IP地址不是已經解決了嗎?不同層之間要保證獨立,網絡層用什么跟數據鏈路層沒關系,這也是為什么一開始就提及IP和端口號,不同層之間要解耦,網絡和系統要解耦,這種設計思想我們要體會。
MAC地址48位bit(6字節),是定位不同設備的字段。MAC地址是全球唯一的,在網卡內置。但其實有很多虛擬技術可以虛擬出假的MAC地址,因此MAC地址的唯一性只在局域網內有效。 MAC地址就像在一個班里每個同學的名字,鏈路層給數據包上一層MAC,就能知道這個數據要交給哪個設備了。
mac地址為48位,即6個字節,一般用16進制數字加上冒號表示,如08:00:27:03:fb:19。
(2)IP地址和MAC地址的區別
雖說我們要保證獨立性,但兩層都有定位主機的能力,我們也會疑惑IP和MAC有什么區別?
假設我們要從重慶到北京旅游,src是重慶,dst是北京,無論我怎么規劃路線,目的地和起源地保持不變,這就是IP。 途中我會有階段性的目的地,如重慶 -> 武漢,到了武漢之后又有武漢 -> 鄭州,階段性的目標會隨著我們的位置變化而變化,這就是MAC。
MAC只負責接下來數據交給哪個設備,而IP則是定位起源地和目的地。 在傳輸過程中會經過多個設備,鏈路層的MAC會一直變,而IP保持不變,網絡層感受不到鏈路層干的事,它只覺得數據是從src -> dst,但對于鏈路層而言,路徑卻是src -> A -> B -> C -> dst,這也體現出不同層之間的解耦。
在數據鏈路層包裝之后的數據叫做MAC幀(傳輸層叫做數據段,網絡層叫做數據報,鏈路層叫做MAC幀)。所以各個設備之間真正傳輸的是MAC幀。
(3)ARP
在知道IP和MAC之間的關系之后,又延伸出來的一個新的問題:IP和MAC之間應當如何轉換?這就需要ARP協議了,這是一個位于MAC幀協議(在數據前封裝MAC地址等的協議,需要用到MAC地址)之上,位于鏈路層內的一個協議(在有的模型中會說ARP在網絡層,我們了解即可,它的功能是一樣的)。它的作用就是解析網絡層報文的IP為MAC地址。 但是ARP是如何做到的呢?
首先,發送方的MAC地址ARP是一定知道的,就像每個人一定都知道自己的名字一樣。而目的地的MAC地址ARP可以不知道,ARP只需要知道下一跳的地址就行了,就好比從重慶到北京,在重慶的時候只需要研究怎么到武漢就行。
下面舉個例子,就能明白ARP的宏觀流程了:
老師在講臺上說:我是李老師,哪名學生的學號是10號,告訴我名字。班里的學生都聽到了,有人就回答:我是學生小王,學號是10號。
對于設備來說,當它拿著一個IP不知道怎么轉為MAC地址時,它就會廣播。流程為:我是MAC1,IP1,我要找IP2的MAC,廣播后等待回應。如果在同一個局域網內,IP2對應的設備會直接回應自己的MAC;如果不在一個局域網,發送方就會發給路由器,路由器會根據IP路徑選擇下一跳,返回路由器的MAC(不是IP2的MAC,而是下一跳的MAC地址),循環往復不斷輪轉,就能實現數據包的跳轉。這只是個粗略的流程,我在這里講解的目的是保證讓整個通信的流程跑起來,具體的后面會講。
目前為止我們知道,網絡層封裝好數據之后就交給鏈路層,并且通過ARP得到下一跳的MAC地址,并經由MAC幀協議封裝數據形成MAC幀,最后交由物理層,物理層不會再做任何封裝,直接發送MAC幀給對應MAC設備。
可以通過arp -a查看ARP緩存。已經ARP過的IP和mac的映射會被保存起來,下次直接交付就不需要廣播了,緩存時間是動態的(10 - 30min)。
有個重點需要再次強調,當通信雙方在同一局域網內時,ARP可以直接得到對方的mac,傳過去就是了;但對于不在一個局域網的情況(IP + 子網掩碼判斷),它廣播時要找的目標IP就是路由器的局域網接口 IP了,ARP得到路由器的mac后直接交給它,此時路由器收到的數據報中的目的IP依然還是最開始要找的,路由器會再進行ARP、傳輸直到到目的IP手上。從始至終,原IP和目的IP都不會變。
(4)不同層之間的關系
在上述過程中,路由器會收到mac幀,它只會解包走到網絡層,讀取源IP和目的IP并進行ARP和傳輸mac幀。在整個過程中,路由器不會去修改網絡層里面的原IP和目的IP,要是網絡層和數據鏈路層發現出現丟包,則會直接把剩余數據丟棄,等待傳輸層觸發重傳。
簡而言之,傳輸層提供可靠性的策略,也是保證可靠性的地方;網絡層提供路徑選擇的能力;數據鏈路層幫我們把數據轉發到局域網的下一跳,數據鏈路層和網絡層均不會去保證可靠性,TCP/IP 提供傳輸的方案。邏輯上各個層分別溝通,又相互解耦。
2.以太網
IP是網絡層的一個具體實現方案,鏈路層也有其具體實現方案,如以太網、令牌環網。以太網本身不是一種具體的網絡,而是一種技術標準,既包含了數據鏈路層的內容, 也包含了一些物理層的內容,如規定了網絡拓撲結構,訪問控制方式,傳輸速率等,并且以太網中的網線必須使用雙絞線,傳輸速率有 10M,100M,1000M 等。
以太網是當前應用最廣泛的局域網技術。 這里有個問題,以太網不是數據鏈路層里的一個具體方案嗎?為什么扯到了局域網?
首先,早期計算機是局域網內通信的,以太網、令牌環網就是其中的解決方案。后來網絡誕生后,由于各個實驗室都有自己的一套局域網方案(有的在用以太網,有的在用令牌環網),不統一,最后向上搭建了一個網絡層。所以從歷史上來看,早期的計算機只有數據鏈路層和物理層,網絡層是后來搭建的。所以說網絡層之下像以太網、令牌環網這些本身就是以前局域網通信的方案,只不過后來協議棧向上搭建后如今作為數據鏈路層的實現了。
所以后續以太網的通信方式就可以說是局域網通信的一種方案。mac幀是在局域網內通信的。
(1)以太網的幀格式
根據前面所說,ARP之后我們得到了mac地址,那么以太網的幀格式中就有體現。
這個幀格式是我們學懂數據鏈路層的關鍵,其中目的mac和源mac就是ARP得到的,也就是說在數據鏈路層沒有IP地址這個概念,這和網絡層是解耦的。
(2)數據分片的原因
我們從幀格式上能注意到數據是46 - 1500字節。但這個問題先不討論,我們首先要知道這個數據是什么?從協議棧中可知這個數據網絡層傳過來的,里面包含有網絡層的報頭。 知道這個時候,我們需要思考為什么數據大小有限制?
①碰撞域
以太網(局域網)的通信就像在上課一樣,老師說的話全班都能聽到,叫一聲小王所有人都能收到數據,但只要意識到不是叫的自己,這份數據也就無效了。
主機A(源地址macA)發送數據到主機B(目的地址macB)。在局域網內通信時,每臺主機都有一個協議棧,每個主機收到數據后解包得到目的mac,不匹配的就丟棄。匹配的話主機會根據幀格式中的“類型”處理,如果是0800,就向上交給IP層繼續解包處理。
在一個班里,一堆人同時講話,你能聽清誰說的什么嗎?同樣,兩個主機同時發數據就可能出現數據碰撞問題。如果數據干擾了,那誰也沒辦法正常接收。 所以為了避免局域網中的數據碰撞問題,理論上我們需要保證同一時刻有盡量少的主機在使用局域網資源,這樣碰撞的概率才足夠低。
怎么保證?首先我們假設兩個主機同時發數據,并發生了碰撞,被碰撞的主機怎么辦?碰撞后,兩臺主機都要休眠一段時間,并且觸發重發機制。鏈路層的重發是盡量保證沒有碰撞,即碰撞避免。 注意碰撞避免只是在鏈路層內保證一定的可靠性,它并不會管端到端的可靠性,那是傳輸層干的事。
從另一個角度來理解,整個局域網叫做一個碰撞域。因此以太網其實就是一個臨界資源,碰撞避免就是在保護臨界資源。同理,令牌環網的規則是誰拿令牌誰說話,牌子流轉于每臺主機之間,這就是互斥鎖,它本質上也是保護臨界資源。
②MTU
了解了碰撞域之后,我們需要思考,在一個碰撞域中主機是越多越好還是越少越好?肯定越少越好,主機越多容易發生碰撞,所以一個局域網內主機多了就需要交換機,交換機可以隔絕碰撞域。
還有個問題,單臺主機中發送數據,數據幀的長度越長越好還是越短越好?越長的話,主機占用以太網時間過多,更容易和其他數據碰撞,且觸發碰撞避免后重傳代價大,所以不易太長;但也不能太少,這樣的話發送密度大,發送過于頻繁同樣會對以太網造成一定的擁堵。
那么到底數據幀的長度怎樣才合適呢?這就引出了以太網的最大傳輸單元(MTU,IP層傳下來的數據的最大值),即1500 字節。 但注意實際數據幀大小大于1500字節,MTU限制的是IP傳下來的數據,還得加上以太網包裝的字段。
這就是幀格式中限制IP層傳下來的數據必須滿足[46,1500]的原因,只要我們從碰撞域這個概念出發去理解,MTU就絕對不只是一個空洞的概念,它是有自己的合理性的。
③網絡層和傳輸層的處理
如果鏈路層接收到的數據不在[46, 1500]內,就會被直接丟棄,所以這就要求網絡層和傳輸層得適應規則了,即分片操作(僅在網絡層進行,鏈路層不參與分片,它只負責約束,傳輸層也不會分片,它向下交付完整數據,接收完整數據)。
對于UDP來說,一旦UDP攜帶的數據超過1472字節(1500 - 20(IP層首部) - 8(UDP首部)),那么它就會在IP層分片,傳輸到目標主機后再進行重組,將重組好的完整數據交給傳輸層。如果分組有任意一個發生了丟失,即標志著數據在IP重組失敗,剩下的數據也不會想上交付,全部都被丟棄。 這對傳輸層來講就是丟包了,UDP需要應用層處理。
對于TCP來說,傳輸層攜帶的數據必須在1460字節(1500 - 20(IP層首部)- 20(TCP首部)),這個1460字節也稱為MSS,即最大段尺寸。這個值小于UDP的分片閾值,所以只要控制數據在MSS以內的話,IP層就一定不會分片了。
TCP雙方三次握手SYN時還會交換MSS,選擇較小的MSS值為最終值。MSS協商不是必須的,TCP報頭的選項中可以有這種協商。
如果用戶只想傳輸1字節,經過TCP包裝后為41字節 < 46字節,交給鏈路層后會被填充為46字節,后續解包時鏈路層再丟棄這些填充字段交給網絡層。
(3)類型
①正常交付
在以太網中,發送出去的數據幀是有類型的,常規情況下就是0x0800,接收方接收到mac幀之后,看到0800之后就會解包,并將數據交給IP層進一步處理。
②ARP請求
這是最關鍵的一點,上面我們簡單說了ARP是鏈路層 / 網絡層中的一個協議,負責將IP轉為mac地址,標準來講ARP是網絡層的,但其實現卻實際依賴鏈路層以太網幀協議的“類型”。 下面是最詳細的流程,了解之后我們才算徹底理解ARP:
首先,IP層包裝了數據交給了鏈路層,交付之后鏈路層才會知道目標IP是什么,但鏈路層的通信是靠mac,于是鏈路層在收到IP的數據之后會先讀取IP報頭獲取源IP和目標IP;之后,鏈路層會根據讀取到的信息包裝一個類型為0806的數據幀,隨后在局域網內廣播出去。
這就是以太網拿到IP報文后發起的ARP請求格式,最外層的數據幀沒什么不同,但類型字段為0806,并且按照全F為目的地址發送,這樣局域網內每個收到mac幀的主機都會認為自己是目標主機,并且根據類型也知道這是個ARP請求。
發起請求的ARP字段中僅有發送端IP、發送端mac、目標IP,沒有目標mac(填充,無意義)。接收方拆開看到自己是目標IP后會重新發起一個ARP應答,格式和上面的一模一樣,就是op改為2,即應答模式。同時里面發起方、接收方的IP和mac都知道,直接點對點單播而非廣播。發起ARP請求的主機收到應答后根據類型和op讀取里面的IP和mac,這就實現了一次ARP。
每一次ARP之后,其ARP的IP和mac的映射會被緩存起來,但僅有一個約20min的有效時間。這是考慮到目標主機下線,配置變更,安全保障等因素而設計的。
ARP請求/應答字段的設計是通用的,令牌環網等其它局域網也是這么設計的。所以說可以看到發送端mac地址在上述圖中重復了一次,第一次是以太網幀格式里面,第二次在ARP字段中,出現兩次并不冗余,ARP不能依賴某個具體的鏈路層方案,應該是通用且解耦的。
③總結
不同類型說明了以太網中數據的類型,以及接收方怎么處理數據,應該將數據交給哪個協議去處理,0800交給IP,0806交給ARP,8035交給RARP。
通過類型我們也徹底理解了ARP的過程,先接收IP數據報,根據報頭IP信息發起0806的請求mac幀,收到應答后再發出0800的mac幀。如果發現目標IP不在當前局域網內時ARP的目標IP就是路由器了,路由器應答后直接發給路由器。整個過程中會發現網絡層的報頭目標IP和源IP不變(暫不考慮NAT)。路由器收到后進行路徑選擇、轉發,直到到達目標主機處。
(4)CRC
CRC是負責對發送的mac幀查錯誤的,如果發送前會根據幀的內容計算得到一個CRC的值,目標收到之后會再算一遍,如果CRC不匹配,這個mac幀就直接丟棄了。相應的IP層重組分片也會失敗,最終就等著TCP或應用層判斷重傳了。
3.交換機和集線器
(1)交換機的作用
碰撞域是以太網中會遇到的問題,其他局域網如令牌環網、無線LAN等遇到的情況并不完全相同。 所以如果要黑掉一個以太網,其思路就是往以太網里不斷發送垃圾數據,去碰撞別人的數據包,只需要直接從網絡層繞過鏈路層發送,規避碰撞檢測即可。
正常情況下,主機越多網絡越慢,這符合我們的常識,這是因為我們的主機頻繁發生了碰撞檢測和碰撞避免,緩解的方法之一就是引入交換機。
交換機的核心的作用就是劃分碰撞域。我們買了一個交換機接入網絡之后,剛開始交換機不處理數據,但要做擴散,即轉發數據。交換機在轉發數據時會進行學習,例如macA從接口1發送過來了一個數據,交換機會進行記錄;又有一個macB也從接口1回應了一個數據,交換機也會記錄。注意交換機只會記錄發送過來的數據,發送出去都是擴散式的,從各個接口發送出去,不會記錄。 某個時候,macA要給macB發送數據了,macA和macB都在接口1這邊,交換機就不會從其它接口擴散了;或者交換機已知macC在接口2這邊,macB給macC發消息時交換機就只會像接口2這邊擴散了。
因此,交換機能夠劃分碰撞域,不會擴散碰撞域。
(2)理解交換機
但是還有個問題,交換機這個概念應該怎么插入到我們現有的知識體系中?
其實上述過程僅適用于有線局域網的情況。
每個聯網的主機都和交換機的一個接口相連,一般來說交換機的一個接口只會連接一個設備。如果我們想要讓交換機的一個接口連接多個設備或者說交換機的接口數量不夠了,我們就可以級聯交換機。總之我們現在需要認識到,每個設備都是有線的且都連向交換機,包括路由器也會有接口連向交換機(我們家庭買的路由器自帶一個交換機)。
在一個局域網內,macA想向macB發送消息,過去我們說的都是ARP得到目的mac,然后發過去,但其實這個過程不完善,我們一直忽略了有線這個條件,這也是我們將交換機融入已有知識體系的難點所在。實際上,A在鏈路層準備好ARP請求的mac幀之后,在物理層會通過線將數據從交換機的一個接口傳到交換機里面,同時交換機通過mac幀格式緩存源mac和接口。之后交換機通過mac幀里面的目的mac,先查找交換機的緩存,如果沒有找到目的mac對應接口的緩存,就向所有其它接口轉發mac幀,由于每個設備都連向交換機,所以所有設備都會收到mac幀。匹配上的就會回應,回應途中也是經過交換機傳數據,交換機也同樣會緩存傳來的源mac及其端口。
當macD想要發數據給macF時,macD將mac幀通過線傳給交換機,這個時候如果交換機在緩存中找到macF及其對應的接口后,就會直接把mac幀轉發過去,而不會給每個接口都轉發。有可能轉發過去后就找到了macF,但也有可能是進入了另一個交換機,這個交換機會繼續在其緩存里面找macF,找到了就通過對應接口發過去,找不到就向所有其它接口都發送mac幀。
為什么說交換機能夠劃分碰撞域,不會擴散碰撞域呢?當macA發數據給macB時回先發給交換機,交換機如果找到了緩存會直接通過找到的接口轉發mac幀,該交換機的其它接口連接的設備都不會收到mac幀,就減少了碰撞的風險。 同時,如果macA和macB都在同一個接口,那么macA的幀傳入交換機后不會有任何轉發,因為B一定不在這邊,那么交換機的其它接口連接的設備都不會受到影響。 因此我們可說交換機能夠劃分碰撞域,不會擴散碰撞域。
這個數據傳輸方式適用于所有情況,局域網和跨網段都是如此,因為路由器也是一臺主機,它也會有一條線連接至交換機的一個接口。當A想要給B發消息時,根據IP + 子網掩碼發現不在同一局域網,這時候它的下一跳就是路由器。這個時候A也是把mac幀交給交換機,讓交換機按照上述規則擴散轉發給路由器。
(3)集線器
這個設備現在用的比較少了,但在這里能幫助我們理解交換機。
macA和macB本應連接到交換機的兩個接口,但是我想讓它們只連接到一個接口,且我不想大費周章級聯一個交換機,這時集線器就是個好選擇。A和B兩根線連著集線器,集線器引出一根總線連接至交換機的一個接口。這時A和B發的消息在交換機看來都來自同一個接口。
macA想給macB發消息時,macA會發給集線器,打算由集線器交給交換機,集線器交給交換機的同時,也會向連接集線器的所有設備廣播,這樣B就沒有通過交換機轉發。而交換機看到macA和macB在同一個接口的情況下,也不會有任何轉發操作。
因此我們就可以理解,當macA和macB對應接口一致時,交換機就算不做任何轉發,數據也能傳到B那里,靠的還是集線器的特點。 要是集線器換成交換機,那就按照前面的規則走一遍也行。
從集線器這里的特點也能看出,集線器不像交換機那樣能隔絕碰撞域,一個主機發消息,其它連接著集線器的主機全部都會收到消息,因此同一時刻只能有一份數據在集線器里傳輸,這就意味著集線器的帶寬會被平分,所以它才會逐漸被交換機替代。