訊號的傳輸總要符合一定的協議(protocol)。比如說長城上放狼煙,是因為人們已經預先設定好狼煙這個物理訊號代表了「敵人入侵」這一抽象訊號。這樣乙個「狼煙=敵人入侵」就是乙個簡單的協議。協議可以更複雜,比如摩爾斯碼(morse code),使用簡訊號和長訊號的組合,來代表不同的英文本母。比如sos(***---***, *代表簡訊號,-代表長訊號)。這樣"***= s, ---=o"就是摩爾斯碼規定的協議。然而更進一層,人們會知道sos是求助資訊,原因是我們有「sos=求救」這個協議存在在腦海裡。所以"***---***=sos=求救"是乙個由兩個協議組成的分層通訊系統。
使用morse code的電報機
計算機之間的通訊也要遵循不同層次的協議,來實現計算機的通訊。
物理層(physical layer)
所謂的物理層,是指光纖、電纜或者電磁波等真實存在的物理媒介。這些媒介可以傳送物理訊號,比如亮度、電壓或者振幅。對於數字應用來說,我們只需要兩種物理訊號來分別表示0和1,比如用高電壓表示1,低電壓表示0,就構成了簡單的物理層協議。針對某種媒介,電腦可以有相應的介面,用來接收物理訊號,並解讀成為0/1序列。
連線層(link layer)
在連線層,資訊以幀(frame)為單位傳輸。所謂的幀,是一段有限的0/1序列。連線層協議的功能就是識別0/1序列中所包含的幀。比如說,根據一定的0/1組合識別出幀的起始和結束。在幀中,有收信位址(source, src)和送信位址(destination, dst),還有能夠探測錯誤的校驗序列(frame check sequence)。當然,幀中最重要的最重要是所要傳輸的資料 (payload)。這些資料往往符合更高層協議,供網路的上層使用。與資料相配套,幀中也有資料的型別(type)資訊。連線層協議不關心資料中到底包含什麼。幀就像是乙個信封,把資料報裹起來。
乙太網(ethernet)和wifi是現在最常見的連線層協議。通過連線層協議,我們可以建立局域的乙太網或者wifi區域網,並讓位於同一區域網路中的兩台計算機通訊。連線層就像是乙個社群的郵差,他認識社群中的每一戶人。社群中的每個人都可以將一封信(幀)交給他,讓他送給同一社群的另一戶人家。
連線層:社群小郵差
網路層(network layer)
不同的社群之間該如何通訊呢? 換句話說,如何讓wifi上的一台計算機和乙太網上的另一台計算機通訊呢?我們需要乙個「中間人」。這個「中間人」必須有以下功能: 1. 能從物理層上在兩個網路的接收和傳送0/1序列,2. 能同時理解兩種網路的幀格式。路由器(router)就是為此而產生的「翻譯」。乙個路由器有多個網絡卡(nic,network inte***ce controller),每個nic可以接入多個網路,並理解相應的連線層協議。在幀經過路由到達另乙個網路的時候,路由會讀取幀的資訊,並改寫以傳送到另乙個網路。所以路由器就像是在兩個社群都有分支的郵局。乙個社群的郵差將信送到本社群的郵局分支,而郵局會通過自己在另乙個地區的分支將信轉交給另乙個社群的郵差手中,並由另乙個社群的郵差最終送到目的地。
通過路由連線的wifi和乙太網
整個通訊過程如下:
wifi上的計算機1 -> 路由wifi介面 -> 路由乙太網介面
-> 乙太網上的計算機2
(藍色表示wifi網路,綠色表示以太網路)
在連線層,我們的乙個幀中只能記錄src和dst兩個位址。而上面的過程需要經過四個位址 (計算機1,wifi介面,乙太網介面,計算機2)。顯然,僅僅靠連線層協議無法滿足我們的需要。由於連線層協議開發在先,我們無法改動連線層協議,只能在連線層的資料(payload),也就是信紙內部下功夫了。ip協議應運而生。
計算機1,路由器和計算機2都要懂得ip協議。當計算機1寫信的時候,會在信紙的開頭寫上這封信的出發位址和最終到達位址 (而不是在信封上),而在信封上寫上要送往郵局。wifi網的郵差將信送往郵局。在郵局,信被開啟,郵局工作人員看到最終位址,於是將信包裝在乙個新的信封中,寫上出發地為郵局,到達地為計算機2,並交給乙太網的郵差,由乙太網的郵差送往計算機2。
(ip協議還要求寫如諸如校驗等資訊,交通狀況等資訊,以保護通訊的穩定性。)
轉交給郵局
在連線層,郵差只負責在本社群送信,所以信封上的位址總是「第一條街第三座房子」或者說「中心十字路口拐角的小房子」這樣一些本地人才了解的位址描述,這給郵局的工作帶來不便。所以郵局要求,信紙上寫的位址必須是乙個符合官方規定的「郵編」,也就是ip位址。這個位址為世界上的每乙個房子編號(郵編)。當信件送到郵局的時候,郵局根據郵編,就能查到對應的位址描述,從而能順利改寫信封上的資訊。
每個郵局一般連線多個社群,而乙個社群也可以有多個郵局,分別通往不同的社群。有時候一封信要通過多個郵局轉交,才能最終到達目的地,這個過程叫做route。郵局將分離的區域網路連線成了internet,並最終構成了覆蓋全球的網際網路。
傳輸層(transport layer)
上面的三層協議讓不同的計算機之間可以通訊。但計算機中實際上有許多個程序,每個程序都可能有通訊的需求(參看linux程序基礎和linux程序間通訊)。這就好像一所房子裡住了好幾個人(程序),如何讓信精確的送到某個人手裡呢?遵照之前相同的邏輯,我們需要在信紙上寫上新的資訊,比如收信人的姓名,才可能讓信送到。所以,傳輸層就是在信紙的空白上寫上新的「收信人」資訊。每一所房子會配備乙個管理員(傳輸層協議)。管理員從郵差手中接過信,會根據「收信人」,將信送給房子中的某個人。
管理員傳輸層協議,比如tcp和udp,使用埠號(port number)來識別收信人(某個程序)。在寫信的時候,我們寫上目的地的埠。當信到達目的地的管理員手中,他會根據傳輸層協議,識別埠號,將信送給不同的人。
tcp和udp協議是兩種不同的傳輸層協議。udp協議類似於我們的信件交流過程。tcp協議則好像兩個情人間的頻繁通訊。乙個小情人要表達的感情太多,以致於連續寫了好幾封信。而另一方必須將這些信按順序排列起來,才能看明白全部的意思。tcp協議還有控制網路交通等功能。
通過上面的幾層協議,我們已經可以在任意兩個人(程序)之間進行通訊。然而每個人實際上從事的是不同的行業。有的人是律師,有的人外交官。比如說律師之間的通訊,會用嚴格的律師術語,以免產生糾紛。再比如外交官之間的通訊,必須符合一定的外交格式,以免發生外交誤會。再比如間諜通過暗號來傳遞加密資訊。應用層協議是對信件內容進一步的用語規範。應用層的協議包括用於web瀏覽的http協議,用於傳輸檔案的ftp協議,用於email的imap等等。
外交通訊
總過網路分層,我們從原始的0/1序列抽象出
本地位址(郵差)、郵編(郵局)、收信人(管理員)、收信人行業(用語規範)
這些概念。這些概念最終允許網際網路上的分布於兩台計算機的兩個程序相互通訊。
寫信人必須按照各層的協議,封裝好整個信封 (encapsulation);而收信人則按照相反的順序,來拆開這個信封。整個過程是可讀資訊 -> 二進位制 -> 可讀資訊。計算機只能理解和傳輸0/1序列,而計算機的使用者則總是輸入和輸出可讀資訊。網路協議保證了可讀資訊在整個轉換和傳輸過程中的完整性。
計算機協議本身還有更多的細節需要深入。這篇文章只是從分層的角度描述各個層次所實現的功能。
協議森林01 郵差與郵局 網路協議概觀
訊號的傳輸總要符合一定的協議 protocol 比如說長城上放狼煙,是因為人們已經預先設定好狼煙這個物理訊號代表了 敵人入侵 這一抽象訊號。這樣乙個 狼煙 敵人入侵 就是乙個簡單的協議。協議可以更複雜,比如摩爾斯碼 morse code 使用簡訊號和長訊號的組合,來代表不同的英文本母。比如sos 代...
協議森林01 郵差與郵局 網路協議概觀
訊號的傳輸總要符合一定的協議 protocol 比如說長城上放狼煙,是因為人們已經預先設定好狼煙這個物理訊號代表了 敵人入侵 這一抽象訊號。這樣乙個 狼煙 敵人入侵 就是乙個簡單的協議。協議可以更複雜,比如摩爾斯碼 morse code 使用簡訊號和長訊號的組合,來代表不同的英文本母。比如sos 代...
TCP IP協議詳解 郵差與郵局 2
訊號的傳輸總要符合一定的協議 protocol 比如說長城上放狼煙,是因為人們已經預先設定好狼煙這個物理訊號代表了 敵人入侵 這一抽象訊號。這樣乙個 狼煙 敵人入侵 就是乙個簡單的協議。協議可以更複雜,比如摩爾斯碼 morse code 使用簡訊號和長訊號的組合,來代表不同的英文本母。比如sos 代...