討論以太網的幀長,就不得不先提一下以太網的大名鼎鼎的CSMA/CD協議。
1.1 CSMA/CD協議
CSMA/CD是英文carrier sense multiple access/collision detected 的縮寫,可把它翻成“載波監聽多路訪問/沖突檢測”,或“帶有沖突檢測的載波偵聽多路訪問”。
所謂載波監聽(carrier sense),意思就是以太網絡上的各個工作站在發送數據前,都要監聽總線上有沒有數據正在傳輸。若有數據傳輸 (稱總線為忙),則不發送數據,需要等待;若無數據傳輸(稱總線為空),可以立即發送准備好的數據。
所謂多路訪問(multiple access),意思就是以太網絡上的各個工作站在發送數據時,共同使用一條總線,且發送數據是廣播式的。
所謂沖突(collision),意思就是,若以太網上有兩個或兩個以上工作站同時發送數據,在總線上就會產生信號的沖突;多個工作站都同時發送數據,在總線上就會產生信號的沖突,哪個工作站接收到的數據都辨別不出真正的信息。這種情況稱沖突或者碰撞。
為了減少沖突發生的影響,工作站在發送數據過程中還要不停地檢測自己發送的數據,檢測自己傳輸過程中有沒有其他工作站在發送數據,在傳輸過程中與其它工作站的數據發生沖突,這就是沖突檢測(collision detected)。
詳細見CSMA/CD協議介紹。
1.2 以太網探測幀
當多個工作站均想向以太網發送數據時,如果總線處於忙的狀態,大家都等待,也不會有何爭議;但是如果總線處於空的狀態,而且工作站是依次監聽到空狀態,那么各個工作站就會陸續向總線發送數據,A工作站發送的數據還未傳遞到另一個要發送數據的B工作站,那么B工作站仍然認為總線為空的狀態,那么B工作站也向總線注入數據;如果還有更多工作站向總線注入數據,原理一樣,只是更加復雜而已。
A工作站傳遞的數據與B工作站傳遞的數據就會在總線的某處發送沖突,導致此次數據發送失敗。那有什么辦法可以提前判斷,使得工作站不必每次都源源不斷的向總線注入數據,其后又檢測到沖突,而重新等待,如此反復,既浪費了寶貴的工作站資源與總線資源,又使得數據遲遲不能發送出去。
先了解下碰撞信號,就是連續的01010101或者10101010,十六進制就是55或AA。以太網實現原理是,假設某個工作站檢測到沖突發生,那就發送碰撞信號,使沖突更加明顯,使得所有工作站均能檢測到總線發生了沖突。
我們來看一下,假設A檢測到總線是空閑的,開始發數據包,盡力傳輸,當數據包還沒有到達B時,B也監測到總線是空閑的,開始發數據包,這時就會發生沖突。假設B 首先發現發生碰撞,開始發送碰撞信號。
這個碰撞信號會返回到 A,如果碰撞信號到達A時,A還沒有發完這個數據包,A就知道這個數據包發生了錯誤,就會重傳這個數據包。但如果碰撞信號會返回到A時,數據包已經發完, 則A不會重傳這個數據包。
以太網為什么要設計這樣的重傳機制。首先,以太網不想采用連接機制,這會降低傳輸效率,但他又想保證一定的傳輸效率。因為以太網的重傳是微秒級,而傳輸層的重傳,如TCP的重傳達到毫秒級,應用層的重傳更達到秒級。我們可以看到越底層的重傳,速度越快,所以對於鏈路層發生的錯誤,以太網必須有重傳機制。
要保證以太網的重傳,必須保證A收到碰撞信號的時候,數據包沒有傳完,要實現這一要求,A和B之間的距離很關鍵,也就是說信號在A和B之間傳輸的來回時間 必須控制在一定范圍之內。
解決方法就是,每個想要發送數據的工作站,檢測到總線為空狀態,在發送數據之前,先發送一個探測幀,探測幀的發送就圓滿的解決了上面的問題。而探測幀的長度既要達到最快速的傳遞到目的地,又要確保探測幀的傳遞時間足夠使得其他工作站能夠監聽到。這個探測幀的長度就是以太網規定的最小幀長,就是一個最小最長幀。
由於以太網傳遞的幀,歸根結底還是由比特流組成。上面提到的傳輸速率,其實就是工作站的發送速率,傳輸一個幀還是一個個的比特發送出去。即,工作站發送一個幀的第一個比特到達目的地,而此幀的最后一個比特正好發送出去。
2.1 碰撞槽時間
C代表光速,也就是20.3cm/ns(每納秒20.3厘米), C是30W。電子在銅介質(普通銅)中的移動速度是21W/s 。
假設公共總線媒體長度為S,幀在媒體上的傳播速度為0.7C(光速),網絡的傳輸率為R(bps),幀長為L(bps),tPHY為某站的物理層時延;
則有:
碰撞槽時間=2S/0.7C+2tPHY
因為Lmin/R=碰撞槽時間
所以:Lmin =(2S/0.7C+2tPHY )×R
Lmin 稱為最小幀長度。
碰撞槽時間在以太網中是一個極為重要的參數,有如下特點:
(1)它是檢測一次碰撞所需的最長時間。
(2)要求幀長度有個下限。(即最短幀長)
(3)產生碰撞,就會出現幀碎片。
(4)如發生碰撞,要等待一定的時間。t=rT。(T為碰撞槽時間)
假設:A、B兩地之間通過一個單向傳送帶傳遞物品,傳送帶的傳輸速度是C(C代表光速),也就是20.3cm/ns(每納秒20.3厘米),A點有個人叫Marcia,她要把一車荔枝一串一串的發送給B點的那個人Allen,現在Marcia需要抉擇的是:我在傳送荔枝給Allen的時候,如果Allen同時也有荔枝傳給我,這個時候就會產生沖突,而沖突會把傳送中的荔枝撞碎,破碎的荔枝渣會通過傳送帶反送給我,我很想知道是哪一串荔枝被撞碎了,如何實現?一個辦法就是:在我收到荔枝碎片的時候,我仍舊在傳着這串荔枝!比如有很多串荔枝,第1串,第2串等,當我發送第3串荔枝的過程中,收了荔枝碎片,那肯定是第3串里先發出的荔枝出現了碰撞,而不是第2串或第1串中的荔枝發生碰撞。
為了實現這一點,假如Marcia到Allen點的距離是2500米(250000厘米),傳送帶上的荔枝每納秒20.3厘米,那么一串荔枝中的第一個荔枝到達Allen點的用時就是250000除以20.3=12500納秒,在加上碎片返回的時間是12500納秒,等於25000納秒,這個時間就是一串荔枝在傳送帶上必須持續的時間。
Marcia高興的時候,往傳送帶上放荔枝的時候快,不高興的時候就慢。高興的時候每秒可以往傳送帶上放100Mbit個荔枝,換算一下,也就是說放一個荔枝用10納秒。不高興的時候每秒鍾只能往傳送帶上放10Mbit個,也就是說放一個荔枝用100納秒。
因為一串荔枝必須持續的時間25000納秒,那么對於不高興的時候,25000除以100=250個荔枝,這個結果就是一串荔枝的數量。所以,理論上一個10Mbit/s的以太網,最小幀長應該是250bit。但為了確保Marcia在放荔枝的過程中不會被扎到手,放送荔枝間會有一定的延時,所以最小幀長被定義為512bit(64字節)。
因為一串荔枝必須持續的時間25000納秒,對於高興的時候,25000除以10=2500個荔枝,這個結果就是一串荔枝的數量。所以,理論上一個100Mbit/s的以太網,最小幀長應該是2500bit。但一個2500bit的幀又太大了,上層來的數據包不可能這么大。所以我們只能縮短A點到B點的距離為250米,一個荔枝在傳送帶上往返的時間也變成了2500納秒。這時用2500除以10=250個荔枝,這個結果就是一串荔枝的數量。所以,理論上一個100Mbit/s的以太網,最小幀長應該是250bit,網絡最大有效距離是250米。但為了確保Marcia在放荔枝的過程中不會被扎到手,放送荔枝間會有一定的延時,所以幀長被定義為512bit(64字節)。
由此可見,MAC層發送的速度越快,以太網的最大有效距離就越短。但對於1000Mb/s的吉比特以太網,MAC層有兩種選擇,要么保留CSMA/CD,要么不用它。若保留CSMA/CD協議,必須面臨碰撞檢測問題,這就要再一次減小網絡的最大有效傳輸距離到25米。當然您可以不縮短網絡的距離,而是增加一個幀的程度,就如我們開始分析100Mb/s以太網那樣,讓一個幀持續足夠長的時間。但因為上層來的數據沒有這么多,所以就需要在MAC層進行一些無用數據的填充來滿足這個要求。
2.2 最優沖突時間
下面我們來估計在最壞情況下,檢測到沖突所需的時間
(1)A和B是網上相距最遠的兩個主機,設信號在A和B之間傳播時延為τ,假定A在t時刻開始發送一幀,則這個幀在t+τ時刻到達B,若B在t+τ-ε時刻開始發送一幀,則B在t+τ時就會檢測到沖突,並發出阻塞信號。
(2)阻塞信號將在t+2τ時到達A。所以A必須在t+2τ時仍在發送才可以檢測到沖突,所以一幀的發送時間必須大於2τ。
(3)按照標准,10Mbps以太網采用中繼器時,連接最大長度為2500米,最多經過4個中繼器(以太網中使用中繼器的5-4-3-2-1原則),因此規定對於10Mbps以太網規定一幀的最小發送時間必須為51.2μs。
(4)51.2μs也就是512位數據在10Mbps以太網速率下的傳播時間,常稱為512位時。這個時間定義為以太網時隙。512位時=64字節,因此以太網幀的最小長度為512位時=64字節。
2.3 以太網幀長
802.3-2002標准定了以太網的頭結構為DA(6)+SA(6)+Len/Type(2)=14字節。幀校驗序列(FCS):4字節,使用CRC計算從目的MAC到數據域這部分內容而得到的校驗和。
以太網的幀開銷是18字節,是“目的MAC(6)+源MAC(6)+Type(2)+CRC(4)”。以太網最小幀長為64字節,那么IP報文最小為46字節,而局域網規定IP最大傳輸單元1500字節,實際上加上以太網幀的18字節,就是1518字節。
IEEE定義了這個標准,一個碰撞域內,最遠的兩台機器之間的round-trip time 要小於512bit time。(來回時間小於512位時,所謂位時就是傳輸一個比特需要的時間)。這也是我們常說的一個碰撞域的直徑。
512個位時,也就是64字節的傳輸時間,如果以太網數據包大於或等於64個字節,就能保證碰撞信號到達A的時候,數據包還沒有傳完。
這就是為什么以太網要最小64個字節,同樣,在正常的情況下,碰撞信號應該出現在64個字節之內,這是正常的以太網碰撞,如果碰撞信號出現在64個字節之后,叫 late collision。這是不正常的。
CISCO交換機有一種轉發方式叫fragment-free,叫無碎片轉發,他就是檢查64個字節之內有沒有錯誤,有的話不轉發,這樣就排除了正常的以太網錯誤包。