當數據從網絡層發送下來, 又是如何定位到另外一臺主機或路由器中的呢?html
從以前的瞭解,不難發現,當數據從網絡層發送時,此時咱們指定了目的地的IP地址,而且不管是本機仍是路由器都可以根據IP轉發表決定咱們將要發送的下一個端口是什麼,該以哪一條鏈路進行發送。網絡
但在鏈路層呢?當脫離了IP地址,又如何從一端發送到另外一端呢,在底層相互之間又是如何肯定彼此的呢?學習
在本篇中,僅僅就我我的比較感興趣的知識點梳理總結一下。大數據
在路由器中,鏈路層是在 線路卡中實現的, 而在主機中, 實現鏈路層的地方正是在 網絡適配器, 也就是咱們經常會聽到的 網卡。.net
在鏈路層的尋址方式, 也就是鏈路層地址有各類不一樣的稱呼: LAN地址,物理地址,或是最熟悉的 MAC地址。MAC地址長度爲6字節, 便是2的48次方,對於每一臺機器都有其全球獨有的MAC地址,儘管MAC地址被設計成永久的, 可是經過軟件修改MAC地址可能也是可以作到的。設計
當某個適配器須要向目的適配器發送數據時,會將其目的地址的MAC地址插入到該幀中,並將該幀發送到局域網中。與網絡層的概念相似,偶爾咱們也會有發送廣播數據給全部接口的需求,所以 一個適配器偶爾也會接收到 並不屬於它自身的幀。htm
此時,目的適配器會與自身的MAC地址相比較,若是是發送給它的,那麼接收並解析數據。blog
那若是我真的須要發送廣播數據呢?接口
此時,有相似於IP協議中的 255.255.255.255 廣播地址 的 鏈路層地址, 即48個連續的1, 也即 FF-FF-FF-FF-FF-FF。事件
那麼問題來了。
我怎麼知道目的地的MAC地址是多少呢? 莫非我要存儲全球的MAC地址? 仍是像路由器那樣配置相應的轉發表?
事實上是以這樣的方式,轉發這件事,仍是交給網絡層去作,在鏈路層只須要實現點對點的數據發送就能夠了,即當我知道了個人下一跳IP是多少,那麼我就已經知道我應該從哪一個 接口 發送數據, 同時, 獲取到下一跳IP地址所在路由器的MAC地址就能夠了, 這樣就將數據從主機發送到了路由器。
至於之後?抱歉,我已經放在IP數據報中,請路由器你本身決定。
那麼如何知道下一跳, 也就是對應IP地址的MAC地址是多少呢?難道是在插入網線的時候由你主動告訴我嗎?
解決方式是ARP,咱們已經知道經過DNS能夠將域名解析爲IP地址。不一樣的是 DNS是全球性的服務,而ARP只爲在同一個子網中的路由器和主機提供服務。
在每臺主機或路由器中都保存着一個ARP表, 哎?等等, 這不仍是經過表的方式存儲起來了嗎?那又費什麼事呢?ARP是存儲在內存中的,同時每條數據都有其失效時間,咱們並不會無限制的保存相關的ARP表,過時就會刪除。
若是此時我要尋址的IP在ARP表中沒有數據呢? 聰明的你必定想到了, 經過廣播的方式, 告訴全部的相連主機,我須要知道IP地址爲xxx的 MAC地址,請快速回復。
而這,就是ARP協議, 首先,發送方構建一個ARP分組,一個ARP分組包含,發送和接收的IP地址和MAC地址。此時接收MAC地址天然爲 FF-FF-FF-FF-FF-FF。接收到ARP分組的適配器將數據向上傳遞給ARP模塊,這些ARP模塊都檢查,本身的IP地址是否與接收到的IP地址一致,若是一致,則響應, 將自身的MAC地址發送給對方。
經過ARP已經解決了兩個點之間的數據發送問題。
在發送端,控制器取得了存在協議棧較高層生成並存儲在內存中的數據,在鏈路層幀中封裝該數據報,填寫該幀的各個字段,而後遵循鏈路層協議將數據發送到 通訊鏈路中, 在接收端, 接收了整個幀,若是在鏈路層須要執行差錯檢驗,則須要接收控制器執行差錯檢驗, 以後提取出網絡層數據報。
以太網幀結構以下:
前同步碼:須要注意到的是即便沒有數據須要發送, 根據以太網具體類型的不一樣也可能會發送IDLE, 也即一連串的11111, 在這裏不太明白爲何要發送這些數據,可能由於在鏈路層數只有01兩種數據形式,所以須要以1111來表示肯定的IDLE狀態, 其次, 在以太網間隙中發送的數據也都是111, 有了前導碼,做用一是:告訴對方,我立刻就要發送數據了,前導碼的前7個字節目的是爲了「喚醒」接收適配器,並將雙方的時鐘進行同步,而第八個本身的最後兩個bit 則是告訴對方,數據即將到來。
10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011
目的地址:6 字節,這個字段是目的地的MAC地址,並非指的最終的接收端,而是指當前接收以太網幀的路由器,交換機,自身的MAC地址,用這個地址來辨別數據到底是否是發送給本身的,若是不是,也一樣不是廣播信息,則丟棄數據。
源地址:6字節, 發送當前以太網幀的適配器。
類型字段:2字節, 指定上層的協議類型,如IP協議 以及 剛剛提到的ARP協議。
數據:數據這部分長度在 46~1500字節,最大傳輸單元在1500字節,至於爲何會有這樣的最大最小值,稍後再提,若是不足46字節,會補全至46字節,因此以太網的上層協議, 最經常使用的是IP協議,須要在IP首部保存整個IP數據報的長度,以此來去掉以太網的填充部分。
CRC:4字節,循環冗餘校驗, 目的是檢驗以太網幀中是否有差錯。
以太網與TCP有所不一樣, 是無鏈接服務, 也意味着若是須要發送數據,只要將數據進行封裝處理, 直接發送給對方就能夠了。同時, 若是發送過來的數據真的有誤呢? CRC校驗不經過, 並不會發送錯誤通知,成功了也不會有ACK信息,所有交由上層處理,若是上層是 IP UDP的方式, 這些數據丟失了就真的丟失了。
要解決這個問題,須要一系列的其餘知識來作補充。
有兩種類型的網絡鏈路:廣播鏈路和點對點鏈路,點對點鏈路由單一的發送方和接收方組成,點對點協議有PPP,HDLC等, 而廣播鏈路則是讓多個發送方和接收方都鏈接到相同的,單一的,共享的廣播信道上,之因此說是廣播,是由於當信道發送該幀,鏈路上的全部節點都會收到對應的副本,而以太網和無線網正是廣播的典型例子。
而就上述的概念來看,究竟該怎樣協調各個節點之間的發送接收呢?廣播信道只有一個,不可能讓你們一塊兒來講話,但事實上每一個人都有說話的權力,那聲音太亂,沒有人能夠聽清究竟在說什麼。
而這就是多路訪問問題。而計算機中的爲了解決這個問題對應的則是 多路訪問協議。
即爲了解決多個活躍節點在同一廣播信道如何收發信息的問題。
有如下幾種類型的協議:
信道劃分協議
隨即接入協議
輪流協議
信道劃分協議
信道劃分協議的核心觀點大概是這樣, 有相應的 CDM TDM FDM幾種技術作支撐, FDM頻分多址技術,即你們溝通的時候,無需指定說話時間,每一個人在每一個時刻均可以發送信息,而經過 信息的 頻率, 通俗來講,就是每一個人說話的音色相差較大,計算機即可以識別這種音色,做爲不一樣的數據源來對待。
TDM則是將時間進行極細粒度的劃分,約定好在某個時刻,由誰來進行說話。
CDM碼分多址,則是, 在每一個幀的前面都加上前綴,表示信息來源是誰,這樣即便收到一堆信息,也可以分別開來。主要是用在無線信道當中。
隨即接入協議
隨即接入協議,是每一個節點都以全速率發送該幀,當發生數據碰撞時,則重發該數據,直到數據經過爲止。但並非當即重發該數據,這個等待時間則是根據協議來肯定。
而經常使用的協議有 ALOHA 及 載波偵聽多路訪問協議(CSMA)協議。
以太網正是一種 CSMA協議
ALOHA
這種協議在每一個時隙發送數據,若是此時衝突,則到下一個時隙繼續以機率 P進行發送數據。通俗來說是這樣, 咱們幾我的同時開始講話,我檢測到了有人和我在一塊兒說話,則在下一個時間點我擲硬幣,硬幣正面朝上的機率是P,若是正面朝上我說話,不然保持沉默。
不難發現這樣作會有大量的浪費,即便是在最優解的狀況下 通信節點數量一多, 其所能取到的效率 極值爲 37%。
CSMA
載波偵聽多路訪問, 即一個節點在傳輸以前先偵聽信道, 若是此時有其餘節點正在信道上發送消息,則等待,直到有一小段時間 沒有信息發送,發送信息。 若是和別人一塊兒發送信息了, 則中止發送消息,然後在從新偵聽以前等待一段隨機時間。
可是我自己已經在偵聽了, 又怎麼會發生碰撞的事件呢? 這個的根本緣由在於, 雖然發送消息的速率接近光速,但並不意味着消息從一個節點到達另外一個節點之間的距離傳播不須要時間, 這個就被成爲信道傳播時延。
輪流協議
輪流協議的一種實現方式是,輪詢協議, 即存在主節點,循環告訴每一個節點在當前時間所能發送的最大數據量,噹噹前節點發送完對應的數據以後, 繼續詢問下一個節點, 保證沒有衝突存在。
而發送最小字節的緣由正是在這裏, 若是數據足夠小, 從遠端節點A發送小數據 到 B, 此時B檢測到衝突,將衝突信號發送給A, 當衝突信號到達A, 若是A的數據已經發送完畢, 此時它會誤覺得發送成功, 但事實上在B端, 檢測到衝突,數據天然是發送失敗的。 所以必須有最小幀長的限制, 有些設備發現達不到最小長度,會幫你填充無效數據到最小長度。
至於具體的計算能夠看: 傳統 以太網 時隙(slot time) 理解
根本目的則是,在碰撞信號到達A的時候, A的信號尚未發送完畢。而這個爭用檢測時間是 51.2微秒, 10M帶寬在這個時間內能傳輸的數據量爲 512bit 也即64字節。
而除去以太網幀的固定格式,留給IP數據的最小長度就是46字節了。
而1500字節,則是爲了控制不能無限制的傳輸,佔用全部的傳輸時間所定義的最大字節。
同時也稱做 二層交換機, 在實際中兩臺主機之間並不進行直連,而是經過交換機輔助發送。
交換機工做流程以下:
交換機表中,匹配的正是 MAC地址 和端 口, 同時還存在一個超時時間選項。
咱們假設一個以太網交換機有一、二、三、4,共4個接口,每一個接口都分別鏈接了一臺計算機,他們的MAC地址分別是A、B、C和D。在最開始的時候,交換機的交換表是空的。
假如A向B發送了一幀,從接口1進入交換機,交換機收到這一幀以後會先查找交換表,不過很顯然表是空的,交換機查不到應該從哪一個接口轉發這個幀(就是找不到目的地址爲B的表項)。然後交換機會記錄A的端口 MAC地址,記錄時間。 而若是接口A未來被另外一臺主機佔用,再發送消息的時候, MAC地址就會被替換掉。
過了一段時間(老化時間)以後,交換機並無收到源爲 A的數據,就會將A對應的表項刪除掉。
若是找不到目的地址,則廣播該幀。
若是主機C收到了對應的消息, 發現目的地址並未自身的MAC地址,則會丟棄該數據。
這正是基於交換機自學習的一種有趣手段, 當咱們發送數據,改變了自身的MAC地址爲 B, 這樣在交換機中就會記錄, 經過MACB的接口 在 1, 這樣就可以有效的將通往主機B的數據引導到1接口。使得B收不到數據。
固然,若是B有發送消息的話,交換機依然會更新對應的數據。 此時須要發送源源不斷的數據使得交換機表中數據一直更新。
這一樣是基於交換機學習機制的一個有趣手段,咱們知道,當交換機表在表項中找不到對應的主機時,就會廣播該幀。
但事實是,交換機的表項存儲空間是有限的,若是咱們可以填滿該空間, 此時交換機接收到的全部數據都會以廣播的形式發送出來。