編輯嚴選
你有沒有想過實際網路資訊是如何傳輸的?-用白話範例說CSMA/CA與CSMA/CD給你聽

2020/06/10閱讀時間約 7 分鐘
在學習網際網路技術中,不管是有線技術(e.g. 802.3 ethernet)或是無線技術(e.g. 802.11 wireless nertwork)都必須要了解「網路設備是如何把訊息傳送到實體媒介上」的觀念,而這也就是CSMA/CA與CSMA/CD存在的意義。
Collision Detection 與 Collision avoidance的不同
CSMA的全名為Carrier Sense Multiple Access,中文翻譯為載波偵聽多路存取(非常直白),Carrier Sense中的Carrier指的是媒介中傳遞的訊號,所以整體白話的來說就是「監聽媒介上的訊號」。那在什麼時候監聽呢?監聽則會發生在傳輸前與傳輸的過程中。那Multiple Access 則指的是「多個裝置可以同時存取媒介」
那我們了解完了CSMA的意思之後,那CA(碰撞避免)跟CD(碰撞偵測)的差異又是什麼?碰撞偵測的機制應用在於那些「容易聽到碰撞的網路環境」,比如說以同軸電纜或是雙絞線基於乙太網路(ethernet)技術架設的區域網路(大家都連在同一條線上),只要監聽媒介,就可以聽到傳輸訊號;而碰撞偵測則適用於那些「不容易聽到碰撞的網路環境」,比如說無線網路,可能會發生像是隱藏節點這樣的問題。
那這設計這兩個機制的前提都是一樣的,只為了解決一個問題,也就是:
如何讓多台裝置,在一個共享的媒介上有效的存取資料
那我們就來簡單了解CSMA/CD以及CSMA/CA的機制吧!

CSMA/CD

CSMA/CA的步驟

  1. 首先在電腦或網路設備要傳送資料前,先偵測媒介上是否有訊號傳輸,如果有訊號,就等到訊號結束;如果沒有就開始傳輸訊號。
  2. 傳輸訊號的同時也要監聽是不是有其他訊號同時傳送而導致訊號碰撞。
  3. 如果發生碰撞了,則馬上停止傳送,並且接著傳送一個不是資料訊號的一個「擾亂訊號」(Jamming signal),讓訊號碰撞持續,此用意在於讓所有連接同樣共享媒介的裝置都可以明確的聽到訊號碰撞的發生;而如果沒有發生碰撞,直到最後一個位元傳送完畢後則代表傳送成功。
  4. 那在傳送完擾亂訊號後,傳送裝置則會隨機的等待一段時間再重新由第一個步驟開始,而每碰撞一次,代表資料沒有成功傳送,就會裝置內的計數器就會加一,直到嘗試失敗16次後就不再傳送,則代表此次傳送失敗。
如果以好懂一點的比喻來說,這樣的機制如果應用在一個多人語音群聊的通話裡面大概會像這樣:
  1. 我想要講話,我先聽有沒有人在講話,如果有人講我就不講,沒有人講話我就開始講。
  2. 我在講話的時候,我同時也在聽別人有沒有插嘴
  3. 如果有人插嘴,我聽到了,我就不會繼續話題,然後接著跟大家說「請大家不要同時講話好嗎?」,而那個插嘴的人聽到也會中斷話題然後也說「請大家不要同時講話喔!」。
  4. 然後我跟那個講話的人都會等一小段時間(Backoff time),然後我就會再聽看看有沒有人要講話,然後嘗試繼續剛剛的話題。如果我一直被打斷超過16次,我就會不爽,就不會想要繼續剛才的話題了

CSMA/CA

無線網路的基本概念

在我們實際開始說明步驟之前,我們需要說明幾個無線網路與有線網路的差別
無線網路因為是透過空氣中的電波傳輸資料,相較於有線網路的傳輸媒介,無線電波更容易受到干擾,因此為確保正確傳輸,每當傳輸一個裝置收到另外一個裝置傳送的資料,他就要回傳一個「確認封包」(Ack Frame)給發送的裝置,讓發送裝置知道他有成功傳送,反之則表示沒有成功傳送
Atomic operation
有這樣基本的觀念後,讓我們來看看CSMA/CA有什麼不同。

CSMA/CA的步驟

  1. 跟CSMA/CD一樣,首先在電腦或網路設備要傳送資料前,先偵測媒介上是否有訊號傳輸,如果有訊號,就等到訊號結束;而如果沒有偵測到訊號,我會等一個訊框間隔時間(IFS, Interframe space),如果還是沒有聽到任何訊號才會嘗試傳送
  2. 那在傳送的機制也相當特別,因為不是直接傳送,而是再隨機倒數一個時間,當我倒數的時間到了,我才真正的把訊號傳送到媒介上。也就是透過這個IFS以及隨機等待的時間(Backoff time),來嘗試做到「碰撞避免」。
  3. 那在傳送的同時,傳送裝置也會同時監聽,但是當封包傳送後就會完整傳送不會中斷。另外在封包內會保留一個「通道保留時間」(NAV),用意是讓聽到這一個封包的裝置會知道他該停止傳送多久時間
  4. 然後當傳送完成後,傳送裝置會等待一小段時間接收確認封包(Ack),如果有收到,就表示傳送成功,反之則沒有,則裝置會再回到步驟一再次嘗試。而每一次傳送過後沒有收到確認封包,代表資料沒有成功傳送,就會裝置內的計數器就會加一,直到嘗試失敗一定次數後就不再傳送,則代表此次傳送失敗。
同樣的,我們也用一個比較好懂的比喻來說,這樣的機制如果用在一群正在露營的人們大概會像這樣:
  1. 現在快要接近晚餐時間,所以要來準備食材,大家都在露營區不同的地方做事,所以當我想叫一位朋友幫我拿某樣東西,我會先聽一下是不是有人在講話,不管是在露營的其他遊客或是一起來的朋友們,當沒有人在說話時,我會深吸一口氣準備大聲說話(等待訊框間隔時間)
  2. 那我吸飽氣後,我會隨機再等一下(Backoff time),再次確保沒有人在講話後,我就會大聲的喊出「大家先不要講話10秒鐘(NAV),林登請幫我拿東西過來!」,只要在這個範圍能夠聽到我說話的人,就都不會講話10秒(通道保留時間),除了我要講話的對象林登。
  3. 當林登聽到後,林登就會回應說「聽到了!」(確認封包),那收到林登的確認後,我就不會再呼叫一次;反之如果我沒有聽到,我就會再次嘗試,直到我喊的很累了之後,我就決定不再喊了。
透過這樣的方法看似解決了無線傳輸上的問題,但是如果碰到下面這樣的狀況,我們又該怎麼辦呢?

隱藏節點問題

這次的狀況是,阿綠跟阿菊想要跟位中間的林登講話,但是他們彼此聽不到對方說話,所以當阿綠嘗試想要跟林登說話的時候,他也就不會察覺可能阿菊也正要跟林登講話,或是林登因為聽到阿菊正在跟別人說話而不能說話。那此時該怎麼辦呢?
隱藏結點問題(Hidden node problem)
我們可以透過多幾個溝通的步驟來解決這個問題:
  1. 如果阿綠想要跟林登溝通,在實際說出他要講的話之前,他會先跟林登確認他能不能說話,所以他在確認沒有人說話後,就會吸飽氣,然後嘗試跟林登說「大家先不要講話5秒,林登我要跟你說話!」(RTS, Request to send)
  2. 當林登聽到後,而剛好也可以說話,那他也會在別人沒有說話的期間,吸飽氣,大聲跟阿綠說「大家先不要講話10秒,阿綠你可以說!」(Clear to Send)而這時的阿菊,因為聽到了林登跟阿綠說的話,他就會先安靜10秒鐘
  3. 當阿綠聽到了林登的回覆,他就會吸飽氣,然後開始講他想要講的話,那內容大概會像這樣:「大家還是繼續不要講話10秒,林登我跟你說....」
  4. 當林登聽到了阿綠說完他想要講的之後,林登就會回覆阿綠說「阿綠我知道了,大家可以開始講話了!」(確認封包)
如此一來就可以解決這樣隱藏節點的問題了,是不是很聰明呢?

經過這樣簡單的範例說明,是不是感覺這些網路傳送訊息的機制不再這麼艱澀難懂,反而更像是我們早就已經知道的溝通方式呢?雖然實際的細節有很多,但我希望能透過淺顯易懂的說明,讓讀到這篇文章的你能夠了解其中的奧秘所在。
如果你對這樣的內容有興趣,可以幫我按個愛心,我們之後會繼續分享更多有關網路技術的內容喔!艾克森跟你說,網路技術其實很有趣喔!
為什麼會看到廣告
林登(Lyndon)
林登(Lyndon)
是個朝著全職podcaster與文字工作者前進的軟體測試工程師。 要學習一項技能最好的方式就是直接去做,所以我來到了方格子學習寫作,希望你看著我分享,陪著我成長。
留言0
查看全部
發表第一個留言支持創作者!