原文地址:https://learn-linux.readthedocs.io
QQ交流群:Linux網絡編程,群號:183196643
歡迎關注我們的公眾號:小菜學編程 (coding-fan)
我們以一個非常簡單的例子開始:
兩服務器通訊問題

如上圖,有兩台服務器,分別是 Server 1 和 Server 2 。 我們先做一個假設:計算機網絡現在還沒有被發明出來, 作為計算機科學家的你,想在這兩台服務器間傳遞數據,怎么辦?
這時,你可能會想到,用一根電纜把兩台服務器連接起來:

物理課大家都學過,電線可以分為 低電平 和 高電平 。 電平可以高低變化,這樣不就可以傳遞信息了么: 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 ? 那么,沖突要怎么解決呢?
解決方式也簡單,只需在硬件層面實現一種機制:在檢測到兩台服務器同時發送數據時,及時喊停,並協商到底由哪一方先發。
總結
本節討論了一個最簡單的模型,解決兩台服務器之間的通訊問題。 通過電纜,在兩台機器間建立了一個理想的比特流傳輸信道。 這其實就是網絡分層結構中最底層——物理層的作用:
- 傳輸比特流
- 依賴物理(電氣)特性
這一層對開發人員來說,基本上是透明的,我們只需將其理解成一個比特流傳輸信道即可。 至於細節問題,高低電平啦,信號啦,各種物理特性啦,通通留給電子工程師去關心好啦!
進度

下一步
下一節,我們將通過 多服務器通訊問題 進入 數據鏈路層 的學習。
訂閱更新,獲取更多學習資料,請關注我們的 微信公眾號 :


