9.8. 連接埠¶
IP 位址說明的是一個封包要送往哪一台 主機。一台現代主機會同時執行許多程式,例如網頁瀏覽器、聊天用戶端、視訊通話、備份工作,而這些程式都在並行地傳送與接收封包。IP 層沒有辦法區分它們;它只是把每個抵達的封包交給「該主機」。必須有某種機制來決定哪個封包屬於哪個程式。
連接埠號碼 就是答案。在傳輸層,每個封包除了 IP 標頭之外都帶有兩個額外欄位:來源連接埠 與 目的連接埠。每個都是一個 16 位元整數,因此每台主機共有 65535 個可能的連接埠號碼。與 IP 位址結合後,連接埠便能識別一台主機 內部 的某個特定端點,也就是某個特定程式的某個特定通訊。
許多程式共用同一個 IP 位址;目的連接埠會將每個抵達的封包路由到正確的程式。¶
9.8.1. 知名連接埠¶
前 1024 個連接埠號碼依慣例保留給標準服務使用。讀者會遇到的幾個如下:
22 -- SSH(Secure Shell 協定,用於加密的遠端登入)。
53 -- DNS,網域名稱系統(Domain Name System,於 名稱與 DNS 中介紹)。
80 -- HTTP,超文本傳輸協定(Hypertext Transfer Protocol),網頁所使用的未加密協定。
123 -- NTP,網路時間協定(Network Time Protocol,裝置如何從時間伺服器設定其時鐘)。
443 -- HTTPS,透過 TLS(Transport Layer Security,傳輸層安全性,網際網路協定的標準加密外層)承載的 HTTP,也就是瀏覽器中每個顯示鎖頭圖示的網頁背後所使用的協定。
正是這套慣例,讓瀏覽器得以連線到 http://example.com 而無需指定連接埠,因為它會假設使用 80,那是 HTTP 的知名連接埠。相機連線到網頁伺服器時也是如此。
在 1024 以上,連接埠號碼不受限制,任何程式都可以佔用一個。資料庫伺服器(PostgreSQL 用 5432,MySQL 用 3306)、應用程式伺服器以及自訂協定,全都落在這個較高的範圍中某處。
9.8.2. 臨時連接埠¶
伺服器在一個已知的連接埠上監聽。用戶端則在自己這一端使用一個 不同的 連接埠,每條對外連線都重新挑選。
當相機連線到網頁伺服器的連接埠 443 時,這次通訊發生於
camera IP : <some-port> <--> server IP : 443
<some-port> 是一個 臨時連接埠,MicroPython 會從一個高號碼範圍中挑選一個未使用的號碼,在連線期間使用它,並在之後釋放它。指令碼不需要在意挑中的是哪個號碼;socket 層會處理這件事。
9.8.3. 監聽與通訊¶
一個連接埠所扮演的角色,取決於它位於通訊的哪一側。有兩種不同的情況:
監聽 連接埠屬於一個想要 接收 未經邀請之連線的程式。該程式告訴 MicroPython「任何位址指向我在連接埠 80 的傳入封包都歸我」,然後等待。伺服器就是這麼做的。
已連線 連接埠屬於一個想要 發起 通訊的程式。該程式挑選(或請 MicroPython 挑選)一個臨時連接埠,送出一個以該埠為來源連接埠、以伺服器知名連接埠為目的連接埠的封包,並在這次通訊的其餘過程中使用同一組連接埠配對。
單一程式可以同時做這兩件事,為每個角色各持有不同的連接埠。一台相機可能在連接埠 8000 上監聽來自設定使用者介面的傳入 HTTP 連線,同時 在連接埠 443 上維持一條連往遠端伺服器的對外 HTTPS 連線。這兩個角色不會互相干擾,因為每次通訊都由完整的 (src IP, src port, dst IP, dst port) 四元組來識別,而沒有任何兩次通訊會共用相同的四元組。
9.8.4. 連接埠帶來了什麼¶
有了連接埠,傳輸層終於能夠解決 程式對程式 的遞送問題。如今一個封包所攜帶的資訊,已足以讓它不只被路由到正確的 主機(透過 IP 位址),更能被路由到該主機內部正確的 socket(透過連接埠號碼)。
接下來的兩頁將介紹傳輸層在這套定址機制之上所提供的兩種型態:UDP(使用者資料包協定,User Datagram Protocol,每個封包各自獨立、不提供任何保證)與 TCP(傳輸控制協定,Transmission Control Protocol,一種連線導向、可靠且有序的串流)。