9.3. 纜線與訊框¶
在相機上,堆疊中最底層的兩層最容易被視為理所當然,因為它們所做的一切都發生在晶片內部,而且相機會自行處理它們,完全不需要任何 Python 程式碼參與。不過它們仍然值得簡短地走一遍,因為它們能說明「區域網路」是什麼意思,以及與其餘基礎設施之間的邊界從哪裡開始。
9.3.1. 實體層¶
最底層是實際的訊號傳遞——也就是承載位元在兩個裝置之間傳輸的電線、光纖或無線電波。乙太網路透過雙絞線纜線,以固定速率將每個位元編碼為電壓的轉變。Wi-Fi 則將同樣的位元調變到 2.4 GHz 或 5 GHz 頻段的無線電載波上。兩者都會在兩件硬體之間產生一連串的二進位數字;兩者也都屬於相機晶片會自行處理、軟體無需操心的那類細節。
從 Python 指令碼的角度來看,實體層就是「連線已建立」或「連線已斷開」。network 模組會透過 Wi-Fi 介面上的 isconnected() 方法、以及有線乙太網路介面上的連線狀態來回報這個狀態。除此之外,這一層所做的其他一切都是隱藏起來的。
9.3.2. 連結層¶
再往上一層是 連結層——也就是在共用同一個實體區段的兩個裝置之間傳送一段位元組(也就是一個 訊框)的規則。連結層在原始訊號之上加入了兩樣東西:
硬體定址。 每個網路介面都附帶一個獨一無二的 48 位元識別碼,稱為 MAC 位址(媒體存取控制,Media Access Control)。在乙太網路上,它被燒錄在晶片裡;在 Wi-Fi 上,它是同一類識別碼,被燒錄在無線模組裡。MAC 位址正是 交換器(switch,即附近裝置插入的、具有多個乙太網路埠的盒子)用來決定某個訊框應從哪個埠送出的依據。Wi-Fi 存取點則為其通道上的無線裝置扮演相同的角色。
訊框封裝。 較高層往下交付的位元組會被封裝成一個訊框,前面有一個小小的標頭,接著是酬載,最後是一個檢查碼。標頭攜帶來源與目的地 MAC 位址;檢查碼讓接收方能夠偵測出位元組在傳輸途中遭到損毀的訊框。未通過檢查的訊框會被靜默地丟棄——任何在意可靠性的一方都必須在更高層把它補回來。
區域區段 是指任何一組能夠直接看到彼此訊框的裝置——一台交換器上的有線埠、與一個 Wi-Fi 存取點關聯的所有裝置,或是一小群互相連接的交換器。連結層無法觸及該區段之外。一旦目的地位於不同的區段上,訊息就必須交付給上面那一層。
9.3.3. 相機所開放的部分¶
相機為它所擁有的每個網路介面都各有一個 MAC 位址——若相機支援無線功能就有一個 Wi-Fi 的、若主機板有對應的埠就有一個乙太網路的。當應用程式需要讀取位址時,network 模組會透過應用程式正在使用的介面物件上的 network_interface.config("mac") 來提供存取。某些應用程式確實有此需求,例如要將裝置註冊到機群管理系統中。除此之外,這是連結層交給 Python 控制的唯一一個旋鈕。
其他的一切——訊框封裝、電線或空氣中實際的 MAC 流量、相機與存取點之間關於使用哪個通道與速率的協商——全都發生在無線或乙太網路硬體內部。下一頁 會介紹 Python 指令碼在連結層中唯一有發言權的地方:告訴相機要加入哪個網路。