理解CSMA/CD,主要有三個方面:
1、多點接入:
2、載波監聽
3、碰撞檢測。
這里值得一提的是,CSMA/CD 使用場景是在一個站不能同時發送數據和接收數據,即適用場景為 半雙工通信。
多點接入:就是說這是總線型網絡,許多計算機接在總線上。
載波監聽:發送前先監聽。就是每個計算機在發送數據前,先要檢測一下總線上是否有其他站在發送數據。如果有,則暫時不發送數據,等待信道變為空閑時在發送。你可以理解為,汽車要駛入路口時,先按一下喇叭,看看道路內有沒有其他車輛。如果有人回應了,那表明狹窄道路上有車輛,暫時不用駛入。
碰撞檢測:邊發送邊監聽。網卡邊發送數據邊監聽信道上的信號電壓的變化情況,以此來判斷自己在發送數據時是否有其人正好也在發送數據。如果確實發送了,總線上的信號電壓變化幅度是會增加的(互相疊加),這是總線就認為產生了碰撞。傳輸的信號會嚴重失真,失真就是數字信號無法還原成模擬信號(語音、視頻)。網卡監聽到碰撞了,就會立即停止發送,這樣可以節省網絡資源的浪費,然后等一會兒(等一個隨機時間)再發送。
總線的特點是:當一台計算機發送數據時,總線上的所有計算機都能監聽到這個數據。這也是常說的:廣播通信。但現實中,我們並不總是需要一對多通信。所以為了實現一對一通信,專家們就使用了一個叫做適配器的東西,也是我們說的網卡,在上面進行燒錄不同的MAC地址進行區分。計算機在發送時,就在數據幀中的“目的Mac”字段填上接收站的地址即可。好比,現實中,我們寄快遞一樣,寫上收件人的地址一樣。總線工作有一個特點:總線上只要有一個台計算機在發送數據,總線的傳輸資源就被占用了。所以,在同一個時間內,只能允許一台計算機來發送數據,否則各個計算機之間就會互相干擾,導致數據不可用。
Destination and Source MAC address :
網卡:
Rule:當數據幀到達網卡時,在物理層上網卡要先去掉前導同步碼和幀開始定界符,然后對幀進行CRC檢驗,如果幀校驗和錯,就丟棄此幀。如果校驗和正確,就判斷幀的目的硬件地址是否符合自己的接收條件(目的地址是自己的物理硬件地址、廣播地址、可接收的多播硬件地址等),如果符合,就將幀交“設備驅動程序”做進一步處理。
這時,你可能會有疑問,為什么發送前都已經載波監聽了,空閑時才發送,怎么會出現碰撞呢?
這是因為電磁波在總線傳播是以有限的速率傳播的。可能A機現在檢測是空閑的,B機也同時檢測是空閑的,於是他們同時發送數據,然后的然后就發送碰撞了。
電磁波在1km電纜的傳播時延約為5us。
我們經常把單程端到端的傳播時間記為 τ
在T=0時,A發送數據。B檢測到信道為空閑。
在T=τ-δ時(這里τ>δ>0),A發送數據還沒到達B時,由於B檢測到信道是空閑的(為什么B檢測是空閑的?前面我們說了,電磁波1km的傳播時延是5us,換言之就是5us后B才能檢測到信道是忙的,5us之前,B認為是空閑的,於是開始發送數據)。因此B發送數據。
經過時間δ/2后,即在T=τ-δ時,A發送的數據和B發送的數據發生了碰撞。這時,A和B都不知道發送了碰撞。
在T=τ時,只有B先檢測到了發生碰撞,於是停止發送數據。
在T=2τ- δ時,A才檢測到發生了碰撞,也停止發送數據。
然后A和B就隨時選擇一個時間,推遲,再重新發送。
由此可知,每一個站,在發送數據時,在一定時間內,都存在碰撞的可能性。
發送數據幀的A站,最多經歷2τ時間就可以知道是否遭受碰撞了。我們把這2τ稱為爭用期,也叫碰撞窗口。
經過這個爭用期時間,檢測沒有發生碰撞,就能肯定這次發送的數據不會發生碰撞。
至此,碰撞問題還是沒有解決。專家們就發明了一種算法,來減小發生碰撞的概率,這個算法就是:退避算法。
退避,意思就是推遲,發送碰撞了,利用一種算法,來選擇推遲多久才發送數據。
退避算法的思想如下:
1、確定基本退避時間。就是爭用期2τ。以太網把爭用期2τ定為51.2us 。(至於為什么是這個值,就沒必要去糾結了,反正當時專家這么定,你就這么記咯!)
對於10Mb/s以太網,在爭用期內可發送512bit,即64字節。
512bit怎么來的? 就是速率乘以時間,就等於數據量。
10Mb/s*51.2us=[10*10^6b/s] * [51.2^(-6)s]=512bit
2、從離散的整數集合隨機取出一個數[0,1,2,3……,(2^k-1)] ,取出來的數,記為r。重傳推遲的時間就是r倍的爭用期。T=r*2τ
上面k的參數,按照這個計算k=Min[重傳次數,10]。 可見,當重傳次數不超過10時,參數k=重傳次數。如果重傳次數超過10時,k就不再增加了,一直等於10。
3、當重傳達16次,仍然會不能成功時,就丟棄該幀,向高層報告。說明發送的人太多了,導致連續發送碰撞。
舉例:
在第一次重傳時,k=1,隨機數r從整數{0,1}中選一個數, 可得重傳的推遲時間要么為0,要么為1*2τ, 這兩個選擇一個。
如果再次發送,即第二次重傳,k=2,代入[0,1,2,3……,(2^k-1)] ,隨機數r從整數{0,1,2,3}選一個數,可得重傳推遲時間是0,2τ,4τ,6τ 這4個值隨機選擇一個。
同理,再次發送碰撞,以此類推。
結論
到這里,我們就可以看出,以太網在發送數據時,如果幀的前64字節沒有發送沖突,那么后續的數據就不會發送沖突。換句話說,就是如果發送沖突,就一定是在發送的前64字節之內。因為檢測到沖突就停止發送,這時已經發送出去的數據一定小於64字節。
因此以太網規定了最短有效幀長為64字節,只要長度小於64字節的幀都是由於沖突而異常中止的無效幀。收到這種無效幀就立即丟棄。
以太網是不可靠的,這意味着它並不知道對方有沒有收到自己發出的數據包,但如果他發出的數據包發生錯誤,他會進行重傳。以太網的錯誤主要是發生碰撞,碰撞是指兩台機器同時監聽到網絡是空閑的,同時發送數據,就會發生碰撞,碰撞對於以太網來說是正常的。
我們來看一下,假設A檢測到網絡是空閑的,開始發數據包,盡力傳輸,當數據包還沒有到達B時,B也監測到網絡是空閑的,開始發數據包,這時就會發生碰 撞,B 首先發現發生碰撞,開始發送碰撞信號,所謂碰撞信號,就是連續的01010101或者10101010,十六進制就是55或AA。這個碰撞信號會返回到 A,如果碰撞信號到達A時,A還沒有發完這個數據包,A就知道這個數據包發生了錯誤,就會重傳這個數據包。但如果碰撞信號會返回到A時,數據包已經發完, 則A不會重傳這個數據包。
我們先看一下,以太網為什么要設計這樣的重傳機制。首先,以太網不想采用連接機制,因為會降低效率,但他又想有一定的重傳機制,因為以太網的重傳是微秒 級,而傳輸層的重傳,如TCP的重傳達到毫秒級,應用層的重傳更達到秒級,我們可以看到越底層的重傳,速度越快,所以對於以太網錯誤,以太網必須有重傳機 制。
要保證以太網的重傳,必須保證A收到碰撞信號的時候,數據包沒有傳完,要實現這一要求,A和B之間的距離很關鍵,也就是說信號在A和B之間傳輸的來回時間 必須控制在一定范圍之內。IEEE定義了這個標准,一個碰撞域內,最遠的兩台機器之間的round-trip time 要小於512bit time.(來回時間小於512位時,所謂位時就是傳輸一個比特需要的時間)。這也是我們常說的一個碰撞域的直徑。
512個位時,也就是64字節的傳輸時間,如果以太網數據包大於或等於64個字節,就能保證碰撞信號到達A的時候,數據包還沒有傳完。
這就是為什么以太網要最小64個字節,同樣,在正常的情況下,碰撞信號應該出現在64個字節之內,這是正常的以太網碰撞,如果碰撞信號出現在64個字節之后,叫 late collision。這是不正常的。
我們以前學習CISCO網絡的時候,CISCO交換機有一種轉發方式叫fragment-free,叫無碎片轉發,他就是檢查64個字節之內有沒有錯誤,有的話不轉發,這樣就排除了正常的以太網錯誤包。