在上一講中,我們學習了鏈路層可以提供的服務?:framing,link access,reliable delivery,error detection&correction。這一講我們從link access中的broadcast接入方式深入,學習這種接入方式下的協議,以及衍生出的MAC地址,最後會學習一下主要的區域網種類。
課件地址:https://cs.nju.edu.cn/lwz/networks/CH2-Direct Link Networks-3.pdf
多路訪問協議(MAC協議)
在上一講我們提到了在link access
中有point-to-point
和broadcast
兩種鏈路接入方式。
在broadcast
中,多路複用問題需要使用一系列的MAC協議來解決,它負責”當多個節點處於活躍狀態時,為了確保廣播通道執行有用的工作,以某種方式協調活躍節點的傳輸“。
設計這些協議前,在broadcast
通道的傳輸速率為R bps
的前提下,我們設定了協議需要實現的一系列的理想狀態:
- 單一活躍節點傳輸時,能達到
R
的傳輸速率 - 當
M
個節點共用通道時,每個節點傳輸平均速率達到R/M
- 完全分散(
fully decentralized
),沒有所謂的主節點- 不需要特殊節點來協調傳輸
- 儘量時鐘、時隙不同步
- 儘可能簡單,使實現不昂貴
我們儘量按這些理想狀態設計了一些協議,這些協議可以劃分為三類:
通道劃分協議
Channel partitioning
主要思想是把通道劃分為小片,然後把這些小片分下去給各個節點單獨使用。劃分標準可以為時隙(time slot
)、頻段(frequency
)、編碼(code
)有以下幾種:
-
TDMA
:分時多重進接。和前文的分時多工TDM一樣,在時間幀內按照時隙來劃分通道; -
FDMA
:分頻多重進接。和前文的分頻多工FDM一樣,按照劃分的頻段來劃分通道; -
CDMA
:分碼多重進接。給使用者分配不同的正交的chipping sequece
,對使用者要傳送的資料進行編碼,使得多個使用者的資料可以進行疊加後變成“一個資料”在通道上傳輸,然後再由接收方分別根據chipping sequece
來解碼消除噪音拿到資料。流程如下圖:
隨機接入協議
random access
協議可以讓單個活躍節點傳輸達到R
的速率,而且傳輸前不用對各個節點進行協調,但這就很容易產生collision
。如何探測並解決這些collision
,是我們在隨機接入協議中主要考慮解決的問題。主要有以下幾種協議:
ALOHA
ALOHA的主要解決 collision 的方法是:一旦有幀準備好了就立刻傳送,發生 collision 就根據p
的機率進行重傳(1-p
的機率等一段時間,等待的時間是隨機的),進行重傳後還是沒有收到ACK資訊就把當前幀直接丟棄。
Slotted ALOHA
相比於純ALOHA,時隙ALOHA做的一個改變就是把所有幀定義為相同大小,並且根據幀的大小來劃分時隙( T == Size/R
)。這樣子的操作使得節點在時間上的傳輸和等待都是同步的,都得向時隙對齊。
它的具體操作是一旦有幀準備好了就在下一個時隙中進行傳送,發生 collision 就根據p
的機率進行重傳(1-p
的機率等一段時間,等待的時間是隨機的),直到重傳成功為止。它的效率剛好是純ALOHA的兩倍,為1/e
。
CSMA
載波監聽多路訪問。在兩種ALOHA中節點進行幀傳送時是完全不夠別的節點的死活的,想傳就傳,這放到生活中是非常不禮貌不道德的行為。這會導致collision
的數量大大地增加,CSMA協議對此進行了最佳化。
在CSMA中,每個節點必須“ listen before transmit”, 先聽一下有沒有人在講話,也就是觀測通道上有無能量波動(幀的傳輸),這種觀測行為會一直進行直到當前通道從 busy 變為 idle 為止。在觀測的過程中,如果通道是 busy 的,那麼就推遲傳送。
CSMA對 busy 的推遲操作因演算法而不同。有三種busy推遲處理演算法:
-
Non persistent CSMA
:如果busy就先躺平一會(躺一個 random time,這減少了 collision 的機率)再回來聽,也就是它不是全天候保持觀測的;但是這種演算法雖然減少了碰撞機率,但是如果通道在節點躺平還沒結束時變為了idle,那麼通道就會存在被浪費的情況; -
1-persistent CSMA
:為了避免non persistent
中的通道浪費情況,我們節點不再開擺,全天候工作一直從 busy 聽到 idle 為止 ? ,通道 idle 了就把幀傳輸出去;但這種演算法就會導致節點們太自私,如果有多個節點同時等待監聽,通道變為 idle 時就一定會發生碰撞; -
p-Persistent CSMA
:折中方案,既能像第二種那樣減少idle時間,又能減少碰撞機率;通道 idle 時以p
的機率進行傳輸,以1-p
的機率等待一個時間單位(大小為最大傳播時延)p的值取等待傳送的節點數N的倒數即1/N
。
但我們進行了這麼多的工作,還是會因為傳播延遲的問題出現碰撞的情況……?所以我們搞出了CSMA/CD!
CSMA/CD
根據CSMA協議進行幀傳送,按理說都萬事俱備了,怎麼還會發生collision呢??
原來是在幀傳送過程中,因為在鏈路上傳播速率的問題,幀會產生因端對端傳播時延產生的碰撞。CSMA沒有進行碰撞的檢測,即使碰撞了還是會繼續傳輸這些幀。而在CSMA/CD中,當某節點進行碰撞檢測時,一旦它檢測到了碰撞就會立刻停止幀的傳輸。
CSMA/CD的幀傳送步驟為:
- If medium idle, transmit; otherwise, step 2
- If busy, listen for idle, then transmit immediately (採用的1-persistent演算法)
- If collision detected, send jam signal then abort
- After jam, wait random time then start from step 1
在這個協議的工作環境下,我們可以解釋Minimum Frame Size的由來:
在當下,size
作為協議的介面是不能變的,物理傳播速率v
也是不變的,所以變的就只有鏈路長度L
和頻寬B
;
所以,早期乙太網能連幾百米,到了現在頻寬越來越快,鏈路長度就只有十幾米嘍?
IEEE 802.3協議用的是CSMA/CD加上1-persistence演算法,同時為了解決因 1-persistent 出現的頻繁collision問題,打上了一個叫“二進位制指數後退”(binary exponential backoff
)的補丁。在自頂向下中對這個演算法的描述如下:
輪流協議
taking-turns
型別的協議可以讓M
個節點共用通道時,每個節點傳輸平均速率達到R/M
。我們來看兩種比較重要的協議:
Polling
輪詢協議。協議會指定鏈路上的多個節點之一為主節點,主節點能夠透過觀察在通道上是否缺乏訊號,來決定一個節點何時完成幀的傳送,它以迴圈的方式poll
每個節點,告訴節點可以傳輸的最大幀數量,傳輸了某些幀後繼續下一個節點的poll
。
polling
協議有幾個缺點:
- 產生了輪詢時延;
- 單一活躍節點傳輸因輪詢而速率小於
R
; - 主節點故障是很糟糕的,會導致整個通道的崩潰
我們使用的藍芽就是採用了這種MAC協議。
Token passing
令牌傳遞協議。該協議沒有主節點,一個被稱為令牌(token
)的小幀在節點之間以某種固定順序交換傳遞。令牌意味著幀傳送的許可證。當一個節點需要進行幀的傳送時它才能持有令牌,否則立刻釋放令牌轉發給下一個節點。
token passing
有幾個缺點:
- 要不停地傳令牌,產生時延;
- 單個節點的故障同樣會導致整個通道的崩潰,如節點忘記釋放令牌;
- 公平性問題:雖然拿到 token 的節點想發多大就發多大,但這耗時很長,其他節點得等好久。
具體的實現有IBM的 TOKEN ring
,FDDI
,我們會在後面的LAN中看到TOKEN ring
的具體情況。
協議效能分析結論
這裡放的是分析後得出的結論,分析過程見ppt嗷 XD
一個協議效能的好壞可以用幀的傳輸時間比來衡量。
設傳播時延為a,傳輸時延為1,則代表各個協議效率的 U 如下:
point2point
:無論 a 大於1還是小於1,U的結果都是1/(1+a)
.ring
:當環中存在N個節點時,有- 令牌環釋放前提是幀頭部被接收到&幀完成傳輸;
- a大於1時,U為
1/(a + a/N)
- a小於1時,U為
1/(1 + a/N)
slotted ALOHA
:- N 個節點全部成功傳送的機率為
A = N*p*(1-p)^(N-1)
- p 等於
1/N
時, A 達到最大為1/e
- 成功傳送的用時為
1/(1+2a)
- 所以
U = 1/(1+2a) * A
-->1/e
- N 個節點全部成功傳送的機率為
pure ALOHA
:- N 個節點全部成功傳送的機率為
A = N*p*(1-p)^(2N-1)
- p 等於
1/2N
時, A 達到最大為1/2e
- 成功傳送的用時為
1/(1+2a)
- 所以
U = 1/(1+2a) * A
-->1/2e
- N 個節點全部成功傳送的機率為
CSMA/CD + p-persistence
: U 經過種種分析後最終為1/(1 + (2e-1)*a)
MAC
MAC地址
什麼是MAC地址?
MAC地址的全稱為 Medium Access Control (MAC) Address,它是一個與網路介面卡相關聯的數字地址。鏈路層地址有許多種稱呼:LAN地址,實體地址或MAC地址,MAC地址是目前最廣泛的鏈路層地址稱呼。
有啥特點?
- MAC地址具有扁平結構,而IP是層次結構,兩者相當於身份證號和郵政地址的區別(後者會因搬家而變動),網路卡是出生廠家,mac就是它給你配的身份證號,獨一無二,永久存在(但現在的技術可以靠軟體來改)。
- MAC分配給網路介面卡的方式是:IEEE把前三個位元組分配給(賣給)廠家,然後後三個位元組的內容由廠家決定寫啥。
- 交換機沒有MAC地址。
- 特殊廣播地址 FF-FF-FF-FF-FF-FF,用於讓通道上所有
adaptor
接收處理該幀。
從MAC地址出發
我們現在知道,一個主機“誕生”時只知道自己的 MAC 地址,它想要和遠處的主機通訊,就像寄信,是需要確切的地址的,怎麼辦?
- 我的IP地址是啥?
- 對面的IP地址是啥?
- 如果在同一個LAN中,對面的MAC地址是啥?
- 如果不在,那我要找的第一跳的路由器地址是啥?
- ………………
解決了這些問題,我們才能成功達成通訊。我們需要ARP和DHCP協議。
ARP
地址解析協議.Address Resolution Protocol(RFC 826)
ARP的功能就是將子網內的任意IP地址解析為MAC地址。ARP僅僅在LAN下才能工作!!它不能跨越子網而去解析別的主機!!
ARP的具體工作原理是:
- 首先,每個主機或路由器的記憶體中都放著一個動態的ARP表,動態表示它所有的表項都不是永久的,表項具有一個壽命值(TTL),是會過期的。(在cmd中輸入
arp -a
可以看到這個表)
- 好,我們要開始通訊了!傳送端主機首先透過拿到的對方的IP地址來查詢自己的ARP表,如果存在對映,就直接獲取MAC;
- 如果在ARP表中找不到表項,那麼就會經歷以下過程:
- 傳送端構造一個特殊的ARP packet;這裡有ARP報文格式詳解!
- 傳送端把一個這樣的查詢packet傳遞到介面卡中,介面卡在鏈路層中封裝它,使用廣播MAC地址來作為幀的目的地址,並將幀傳輸到子網中;
- 子網上的其它介面卡接收到該幀並向上傳遞給ARP模組,由模組檢查目的IP是否與自己匹配;
- 匹配的主機給查詢主機返回一個響應packet;
- 查詢主機拿到目的MAC,將其封裝在IP資料包後傳送。
要注意的是,查詢ARP報文是在廣播幀中傳送,而響應報文是在標準幀中;ARP"即插即用",不用自己配置;ARP並不劃分到具體的鏈路層或網路層,它可以看成跨這兩層之間的協議。
當主機想要向外網通訊時,需要用尋找的MAC是第一跳路由器的MAC。(用子網掩碼來識別通訊的主機在外網)
DHCP
動態主機配置協議.Dynamic Host Configuration Protocol(RFC 2131)
一個主機用DHCP協議來配置自己的IP地址、子網掩碼、DNS伺服器的IP地址、第一跳路由器的IP地址。
DHCP執行的過程為:
- 客戶端在其子網上廣播一條DHCP-DISCOVER訊息;
- 每臺伺服器都可以使用一條DHCP-Offer訊息進行響應;
- 客戶端選擇一個伺服器,廣播包含伺服器IP的DHCP請求訊息;
- 選定的伺服器提交繫結,並使用一條DHCP-ACK訊息進行響應;
- 客戶端在DHCP-ACK內設定其配置引數;
- 客戶端透過DHCP-Release訊息放棄繫結;
- 如果客戶端之前沒有續訂(重新繫結)繫結,則繫結將到期。
網路層地址和鏈路層地址共存原因
IP-to-IP communication is really just a series of MAC-to-MAC communication taking place at each router hop.
自頂向下對現象的解釋:
LAN
TOKEN Ring
令牌環是一個區域網的協議,可以說是輪流協議中token passing
類協議的一個例項,它由IEEE 802.5所規定。
每個節點有三種狀態:監聽狀態,傳輸狀態和通行狀態。
Listen State
: 節點會監聽流經自身的位元流,它會將傳輸過來的幀抓住copy一份後再釋放轉發,如果這個幀發給自己的,那麼節點歡歡喜喜收下copy的一份後,對原始幀進行一個ACK的修改;Transmit State
:傳送方節點在傳送幀後所處的狀態,它會等待自己發出去的幀轉回來然後進行回收;在此過程,它有一個buffer用來暫存其它節點發出來的幀(不讓它們跑,只讓自己發的幀跑)Bypass State
:啥也不幹,只是單純地連線;
節點發出去的幀是肯定能到達目的地的,除非中途有節點故障(因為環形的結構)。這個協議在大的負載量傳輸下需要多次輪詢,在小負載量下效率也不會很高。
具體圖示如下:
具體的標準有:
Ethernet
乙太網是一類計算機區域網技術。它以便宜的實現價格佔領了有線區域網市場,取代了其他區域網標準如TOKEN ring、FDDI和ARCNET。
IEEE組織的IEEE 802.3標準制定了乙太網的技術標準,它規定了包括物理層的連線、電子訊號和介質訪問層協議的內容。
乙太網在邏輯上使用匯流排型拓撲(以前是bus結構,當前快速乙太網使用了交換機,拓撲結構變成了star)和CSMA/CD的匯流排技術。
在當下交換機的使用下,就沒必要用CSMA/CD的broadcast鏈路接入了,詳細可以看看這個問答:
乙太網的特點有倆:unreliable
、connectionless
。
-
unreliable
:在NIC之間傳送接收幀時,不用進行握手; -
connectionless
:接收方不會返回ACK資訊給傳送方;data in dropped frames recovered only if initial sender uses higher layer rdt (e.g., TCP), otherwise dropped data lost.
僅當初始傳送者使用更高層的RDT(例如,TCP)時,丟棄的幀中的資料才能恢復,否則丟棄的資料會丟失。
乙太網的演化非常快。啥都變了就只有幀的格式沒有變化,作為一個介面,乙太網幀的實現是非常成功的。(乙太網規定了最小幀長應滿足:幀的傳輸時延等於最遠兩個站點間訊號的往返傳播時延。)我們來看看幀的結構:
Preamble
: 前同步碼欄位,8個位元組;7個位元組用以喚醒接收介面卡並進行時鐘同步,每個位元組的值都是0xAA;後一個位元組用以確認幀的起始位。(為了確定起始位我們使用了一個哨兵位機制,對資料進行每5個1填充1個0)Addresses
: 地址欄位,兩個地址欄位都是6個位元組,地址是MAC地址。Type
: 型別欄位,2個位元組,說明了上層的協議是啥(可以記錄2^16種)Data payload
: 最大1500位元組,最小46位元組;CRC
: 迴圈冗餘檢測欄位,4個位元組;
乙太網具體的標準有:
使用的802.3協議(CSMA/CD+1-persistent+beb)的演算法邏輯圖如下:
octet是什麼?
octet 表示的是8個bit ,當我們在談論網路上的問題時,更喜歡使用這個詞而不是Byte。
一些小的點
NOTE:物理上看到的節點星型組網形狀並不一定是broadcast的接入方式,很可能是多個point-to-point!這種邏輯上的組網拓撲的link access 因中心裝置不同而不同:中心裝置是switch的話其實是多個point-to-point,今天的以太區域網基本就是這樣,這就不用MAC協議了;而中心是hub的話對應的就是broadcast,hub相當於一個匯流排。
一個IEE802圖示:
一些看到的比較好的文章: