轉:http://blog.sina.com.cn/s/blog_13b34cfee0102wjfo.html
在編寫arp請求程序的時候,struct arpMsg 結構體的最后一個成員是u_char pad[18],這個成員是防止arp報文小於64字節而添加的,但為什么會有這個要求呢?這就要提到數據在物理層的傳輸方式CSMA/CD了.
CSMA/CD:即帶沖突檢測的載波監聽多路訪問技術(載波監聽多點接入/碰撞檢測).
以太網是不可靠的,這意味着它並不知道對方有沒有收到自己發出的數據包,但如果他發出的數據包發生錯誤,他會進行重傳。以太網的錯誤主要是發生碰撞,碰撞是指兩台機器同時監聽到網絡是空閑的,同時發送數據,就會發生碰撞,碰撞對於以太網來說是正常的。
我們來看一下,假設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。這是不正常的。
總結:最小數據幀的設計原因和以太網電纜長度有關,為的是讓兩個相距最遠的站點能夠感知到雙方的數據發生了碰撞;最遠兩端數據的往返時間就是爭用期,以太網的爭用期是51.2微妙,正好發送64byte數據。
交換機在傳輸一個64字節的數據包時,具體的數據包在傳輸過程中會在每個包的前面加上64個bit preamble(前導符),然后在每個包之間會有96個bit的IFG(幀間隙),也就是原本傳輸一個64個字節的數據包,雖只有512個bit,但在傳輸過程中實際上會有512+64+96=672bit,也就是說,傳輸一個64字節數據包,但是這時一個數據包的長度實際上是有672bit的。 千兆端口線速包轉發率=1000Mbps/672=1.488095Mpps,約等於1.4881Mpps, 百兆端口線速包轉發率=100Mbps/672=0.1488095Mpps,約等於0.14881Mpps。一個交換機的數據包轉發能力的計算方法:交換機滿配置吞吐量(Mpps)=滿配置GE端口數×1.488Mpps