我想Ethernet恐怕是最佳的邏輯bus形態例子了﹐它也是現在最普遍的LAN類型。
這個邏輯bus形態是如何工作的呢﹖很簡單﹐就是每次只能有一個節點在網路上傳遞數據給其它節點﹐其形式是通過對整個網路進行廣播(broadcast)。然後其它接點收聽到廣播之後﹐就看看數據是否傳個自己的﹐如果是﹐則接收下來﹔如果不是﹐則略過。每一節點都有一個自己用的48bit的地址(也可以稱為Node ID﹐也就是在前面說的網卡地址了)﹐而每一個在網路中傳輸的數據都是以這個地址為傳送和接收依據的。
當任何一個節點進行廣播的時候﹐所有的其它節點都收聽得到。其情形就像我們上課一樣﹐老師說﹕“第幾排第幾號同學出來拿作業﹗”雖然全班同學都聽得到﹐但卻只有一位同學可以拿到。Bus形態也和這種形式很類似﹐當然具有更嚴謹的一套法則啦。在bus上面的數據都是以框包(frame)形式傳遞的﹐框包送出來之後﹐會同時向bus兩端廣播﹐當目的地接收到給它的框包﹐也不是據為己有的﹐而是複製一份給自己﹐而原來的框包則還是會繼續被送給下一個節點﹐直到封包抵達終端電阻才會被銷毀。
任何類型的數據要在這一網路上面傳遞的話﹐都必須嚴格的遵循既定的框包格式﹕Data Link Layer Frame 格式﹐是給網路用來安排數據的。Ethernet的Data Link Layer Frame看起來如圖﹕
序言 (Preamble)
| 目的地 地址 (Destination)
| 來源地址 (Source)
| 信息類型 (Message Type)
| 數據 (Data)
| 封包監測資料 (Frame check sequence)
|
8 bytes
| 6 bytes
| 6 bytes
| 2 bytes
| 46-1500 bytes
| 4 bytes
|
每一個 frame 都不可以超過1518bytes﹐這樣就可以確保任何一個工作站都不會佔用網路太久。工作站對網路廣播之前﹐都會先傾聽一下有沒其它人在使用網路﹐如果聽起來很安靜﹐則它會發送廣播。但要是網路上仍然嘈嘈的呢﹖(這個情形就是bus形態最擔心的)﹐這時候工作站就需等待了。
假如節點A和節點B相隔得太遠的話﹐當他們傾聽的時候可能都還沒聽得到對方有話要說﹐就都同時把封包出去﹐這就是所謂的碰撞(collision)了。如果當一個碰撞發生了﹐就會在網線產生一個頻率徊蕩( frequecy ripple)。如果第一個節點監測到有這樣的 ripple ﹐它就會發出一個高頻信號去清除所有其它信號。這個信號告訴所有節點碰撞已經發生﹐這樣全部節點都不會再發送封包了。這時候﹐每一個節點都會隨機的等待一段時間再重新進行廣播﹐總共可以進行16次嘗試大家才會最終放棄。不過其情形也不會好到哪裡﹐因為在大家等待之後﹐彼此都有封包要發送﹐誰都想先發送自己的封包﹐如果節點越多﹐距離越長﹐發生碰撞的機會也就越高。
情形就象上課時您要發言﹐得先看看有沒有其它同學在發言﹐如果已經有人在說話了﹐那你就先等他/她講完再舉手。要是兩個人都同時舉手﹐老師就會宣佈重新再舉手﹐這時候大家可以在一秒鐘之內再舉手﹔要是還是一樣﹐那麼可以再於兩秒之內任何時段舉手﹔再來就4秒、8秒、16秒....的延續下去﹐要試過16次都還一樣﹐沒辦法了﹐大家都不要說好了。
在網路上﹐我們稱這樣的方法為 CSMA/CD (Carrier-Sensing Multiple Access with Collision Detection)。要注意的是﹐所有這些處理過程都必須在Ethernet 網卡上面進行﹐也就是說﹐如果您要選用Ethernet形態﹐那麼你就必須全部使用Ethernet網卡。
Ethernet可以在bus, star 等物理形態上面使用。10baseT就是使用star的物理形態﹐但邏輯上卻是bus形態來的﹐同樣也是Ethernet﹐使用的是IEEE802.3標準。
Token Ring網路在物理上也和100BaseT Ethernet一樣使用star形態。只不過代替hub的是MAU而已﹐一個MAU可以連接八台電腦﹐然後還可以連接到另一個MUA。一塊Token Ring網卡上面﹐其中有端會帶有一個D-shell類型的接頭﹐而另一端則有一個odd-looking IBM接頭。在Token Ring上面無需使用終端電阻﹐網線的一頭接到網卡﹐另一頭接在MUA就可以了。
我們還記得在Ethernet系統上面使用廣播形式傳送封包﹐然而在Token Ring裡面﹐每一個節點都只會得到其前面的一個節點送來的信息。Token Ring的靈魂所在是一個叫做 Token Packet的封包。為了避免碰撞發生﹐Token Ring可以確保每次只能有一個工作站可以發送資料﹐它們使用token packet(或曰token stick)來達到這一目的。只有獲得這個Token packet的接點才可以發送資料。
舉個例子﹐同學們在班上為了避免同時有兩個人發言﹐於是就使用一個令牌﹐由一個同學傳給下一個同學﹐然後最後的同學傳回給最前面的同學。拿到令牌的同學﹐看看如果令牌是空的﹐就把說話寫在令牌上面(寫滿為止﹐如果不夠用﹐等下次再寫)﹐然後註明來源地址和目的地址﹐再將令牌傳給下一位同學。接到令牌的同學﹐會檢查目的地址﹐如果不是給自己的﹐就傳給下一位﹐如果地址是給自己的﹐則抄一份保存﹐原來的令牌照樣傳遞下去。因為令牌是繞著圓圈的傳遞﹐所以始終會到自己手上的。當那位原先發送信息的同學收回令牌﹐看到來源地址是自己的﹐就把令牌擦乾淨﹐然後把令牌交給下一位同學﹐就算他還有話要說﹐也要這樣做。如果下一位同學沒有東西要寫﹐就簡單的把令牌交給下再一位則可﹔如果有東西要寫﹐就重複剛才的規則。
Token Ring上使用的是類似的方法﹐只是略有不同而已﹕當一個節點獲得Token Packet並完成了信息準備之後﹐它會傳給下一個節點﹐如果沒有人接下來﹐就再傳一次﹐如果第二次都沒有人要﹐則給整個網路發送一個solicit successor fram的常規請求﹐詢問“有誰想要這一個Token啊﹖”﹐如果有節點回應這個請求﹐它就把Token直接傳到該地址。
不過同是使用Ring形態的FDDI則略有不同﹐也拿剛才的例子說明﹕凡是拿到令牌的同學﹐先把要說的東西寫在紙條上面﹐也註明是誰寫給誰的﹐然後把紙條夾在令牌上傳給下一位﹔要是沒有話要說就把令牌直接傳給下一位即可。等收到令牌的時候﹐就看看信息是否給自己的﹐如果是就抄一份保存下來﹐如果同時還有信息要送呢﹐再按格式填寫紙條﹐也夾在令牌上面傳給下一位同學。等令牌在繞回來的時候﹐檢查上面的那些紙條﹐如果發現發信人是自己的話﹐就把紙條拿下來﹐然後撕掉就行了。
在網路上﹐我們稱這種方法做﹕Token Passing。