我們以一個非常簡單的例子開始:
兩伺服器通訊問題
如上圖,有兩臺伺服器,分別是 Server 1
和 Server 2
。 我們先做一個假設:計算機網路現在還沒有被髮明出來, 作為電腦科學家的你,想在這兩臺伺服器間傳遞資料,怎麼辦?
原文地址: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
? 那麼,衝突要怎麼解決呢?
解決方式也簡單,只需在硬體層面實現一種機制:在檢測到兩臺伺服器同時傳送資料時,及時喊停,並協商到底由哪一方先發。
總結
本節討論了一個最簡單的模型,解決兩臺伺服器之間的通訊問題。 通過電纜,在兩臺機器間建立了一個理想的位元流傳輸通道。 這其實就是網路分層結構中最底層——物理層的作用:
- 傳輸位元流
- 依賴物理(電氣)特性
這一層對開發人員來說,基本上是透明的,我們只需將其理解成一個位元流傳輸通道即可。 至於細節問題,高低電平啦,訊號啦,各種物理特性啦,通通留給電子工程師去關心好啦!
進度
下一步
下一節,我們將通過 多伺服器通訊問題 進入 資料鏈路層 的學習。
訂閱更新,獲取更多學習資料,請關注我們的 微信公眾號 :