我們以一個非常簡單的例子開始:
兩服務器通訊問題
如上圖,有兩臺服務器,分別是?Server?1
?和?Server?2
?。 我們先做一個假設:計算機網絡現在還沒有被發明出來, 作為計算機科學家的你,想在這兩臺服務器間傳遞數據,怎么辦?
原文地址:https://learn-linux.readthedocs.io 。
QQ交流群:Linux網絡編程,群號:183196643
歡迎關注我們的公眾號:小菜學編程 (coding-fan)
這時,你可能會想到,用一根電纜把兩臺服務器連接起來:
物理課大家都學過,電線可以分為?低電平?和?高電平?。 電平可以高低變化,這樣不就可以傳遞信息了么:?Server?1
?控制電纜電平的高低,?Server?2
?檢測電平的高低,這樣就實現了?Server?1
?往?Server?2
?發送數據啦!
更進一步,可以將高低電平抽象成數學語言:我們用低電平表示?0
?,高電平表示?1
?,這樣就得到一個理想化的信道:
通過信道,雙方可以傳遞一些?01
?比特流。 例子中,我們傳輸的比特流是?1111010101...
?(從右往左看)。 比特流可以編碼任意信息: 比如,我們用?1111
?表示告訴對方本地開機了,用?0000
?告訴對方本地準備關機了。
到目前為止,我們是不是萬事具備了呢? 一個比特流信道成為現實?——理論上是這樣子的。 但是,現實世界往往要比理想化的模型復雜一些。
發送控制
首先,如上圖,信道是無窮無盡的。 因為,信道狀態要么為?0
?,要么為?1
?,沒有一種表示空閑的特殊狀態。
舉個例子,如上圖,?Server?1
?向?Server?2
?發送比特序列?101101001101
?(從右往左讀)。 最后一個比特是?1
?,對應的電平是高電平。 發送完畢后,由于沒有沒有其他地方改變電纜的電平,所以還是維持高電平狀態。 也就是說,信道看起來還是按照既定節拍,源源不斷地發送?1
?(灰色部分),?Server?2
?怎么檢測結尾在哪里?
我們可以定義一些特殊的比特序列,用于定義開頭結尾:?101010
?表示開頭,?010101
?表示結尾。
這時,?Server?1
?先發送?101010
?(紅色),告訴?Server?2
?我要開始發數據了; 然后,?Server?1
?開始發送數據?1101011
?(黑色部分); 最后,?Server?1
?發送?010101
?(綠色),告訴?Server?2
?數據發送完畢。 注意到,平時信道為?1
?(灰色),也就是代表空閑狀態。
沖突仲裁
如果兩臺服務器同時往信道里發送數據,會發生什么事情呢?
肯定沖突了嘛!一臺發?0
?,一臺發?1
?,那你說信道到底是?0
?還是?1
?? 那么,沖突要怎么解決呢?
解決方式也簡單,只需在硬件層面實現一種機制:在檢測到兩臺服務器同時發送數據時,及時喊停,并協商到底由哪一方先發。
總結
本節討論了一個最簡單的模型,解決兩臺服務器之間的通訊問題。 通過電纜,在兩臺機器間建立了一個理想的比特流傳輸信道。 這其實就是網絡分層結構中最底層——物理層的作用:
- 傳輸比特流
- 依賴物理(電氣)特性
這一層對開發人員來說,基本上是透明的,我們只需將其理解成一個比特流傳輸信道即可。 至于細節問題,高低電平啦,信號啦,各種物理特性啦,通通留給電子工程師去關心好啦!
進度
下一步
下一節,我們將通過?多服務器通訊問題?進入?數據鏈路層?的學習。
訂閱更新,獲取更多學習資料,請關注我們的?微信公眾號?: