9.1. 為什麼需要網路¶
硬體控制讓相機得以與另一條特定線路上的另一個特定裝置對話。相機與單一伴隨主機板之間的 UART。相機與掛在同一條短匯流排上的感測器之間的 I2C。共用一條穩健匯流排的一小組模組之間的 CAN。每種情況都遵循相同的形態:兩方(或一小群已知的對象)、一個共用媒介,以及它們之間對該媒介上位元組意義的一項協議。
9.1.1. 這種形態無法擴展¶
只要兩端彼此鄰近、兩端事先皆已知,且指令碼能自行挑選要透過哪條線路對話,點對點模式就行得通。一旦上述任一限制被打破,僅靠接線就不夠了。
對象眾多。 五十台相機向一台伺服器回報的網路無法以一對一接線;伺服器上沒有足夠的 UART,而且佈線距離也無法實現。
對象不在同一條線路上。 工廠裡的一台相機與城鎮另一頭辦公室裡的一個儀表板,無法共用一條序列纜線。兩棟建築之間必須透過兩者間早已存在的任何基礎設施建立某條路徑。
對象事先未知。 將結果發布到雲端的相機,並不會在接線圖中挑選它要與哪一台伺服器對話;雲端的位址是指令碼在執行階段查詢並據以將資料路由過去的東西。
一條纜線上有眾多程式。 今天的筆記型電腦同時執行著瀏覽器、聊天程式、視訊通話與備份,全都同時透過同一個網路介面通訊。這條線路無法像 UART 那樣被某一個對話「獨佔」。
上述每一種失敗情況都是不同種類的定址問題。要一併解決它們,所需的不只是一條線路與一個鮑率。
9.1.2. 網路是什麼¶
網路是一種基礎設施,讓大量電腦中的任何一台都能與任何另一台交換訊息,而無需每一對都各自擁有專屬的連結。有三項特性使網路不只是一條巨大的序列纜線:
共用媒介。 許多裝置連接到同一條纜線、交換器或無線電頻道。它們輪流使用或進行多工,使得不只一個對話能容納在同一條實體連結上。
邏輯位址。 每個裝置都有一個號碼,以與它插在哪條纜線上無關的方式識別它。傳送訊息意味著把該號碼寫在訊息上,而不是連接某條特定的線路。
路由。 當傳送端與接收端不在同一個本地網段上時,介於它們之間的基礎設施會逐跳地載送訊息。端點並不知道路徑;它們只知道彼此的位址。
辦公室 Wi-Fi 上的一台筆記型電腦要連到遠端資料中心的一台伺服器,三者都會用到。Wi-Fi 連結是共用的無線電媒介;筆記型電腦與伺服器各自擁有自己的邏輯位址;訊息會穿越介於兩者之間的任何基礎設施,一次轉送一跳。使用者點一個連結,筆記型電腦送出一個封包,其餘的就交由網路處理。
9.1.3. 那相機呢?¶
相機在網路上扮演的角色與筆記型電腦完全相同。它在加入網路時取得一個邏輯位址、將外送訊息定址到其他裝置的邏輯位址,並讓基礎設施為它們路由。
相較於硬體控制章節有所改變的是介面。指令碼不再是開啟一個 UART 實例並向它寫入位元組,而是開啟一個socket並向它寫入位元組。socket 是進入網路的一個端點,就如同 UART 實例是進入一條線路的一個端點。介於 socket 與線路之間的部分 -- 影格、封包、路由表、交換器、無線電 -- 全都位於底層,對 Python 程式碼而言大多是看不見的。
接下來的頁面會一層一層地把這些部分講清楚,好讓「開啟一個 socket 並傳送位元組」這個抽象感覺理所當然,而非像魔法一樣。