通訊端與網路程式設計

TCP 通訊端(TCP socket)

想像打一通電話:你撥號、對方接起,然後你們有了一條專線,你說的每句話都依序送達、什麼都不會遺失,直到有一方掛斷。TCP 通訊端就是程式用的這條電話線。它是一段可靠、連線導向對話的端點,建立在 TCP 之上——這個傳輸協定保證你的位元組完整送達、順序正確、沒有重複。

你透過要一個串流通訊端來建立它(程式碼裡是 socket(AF_INET, SOCK_STREAM, 0))。在任何資料流動之前,兩端必須用 TCP 的三向交握(SYN、SYN-ACK、ACK)建立連線,這會同步雙方的起始序號。之後,一個 TCP 通訊端用完整四元組來辨識:來源 IP、來源埠、目的 IP、目的埠。一台在 TCP port 443 上傾聽的伺服器,正是靠這個把上千個同時的用戶端分開——每個用戶端的(IP、埠)配對形成不同的四元組。接著你 send 與 recv 位元組,核心在底下處理確認、重送遺失的區段、重新排序與流量控制,所以你的程式看到的是一條乾淨的串流。

為什麼重要:大多數熟悉的協定——HTTP/1 與 HTTP/2、電子郵件(SMTP、IMAP)、SSH、資料庫連線——都跑在 TCP 通訊端上,因為它們要的正是那種可靠、依序的傳遞。兩個誠實的提醒。第一,可靠性指的是傳遞,不是保密:TCP 通訊端本身不加密任何東西,那是上面的 TLS 在做的。第二,TCP 是一條沒有訊息邊界的位元組串流,所以即使傳遞可靠,你的程式仍得自己判斷一則訊息在哪裡結束、下一則從哪裡開始(訊息框架化)——TCP 會毫不在意地把你的多次寫入合併或拆開。

一台在 TCP port 5000 上的聊天伺服器有兩位使用者連著。他們的通訊端分別是(用戶A_IP, 51000, 伺服器_IP, 5000)與(用戶B_IP, 49500, 伺服器_IP, 5000)。伺服器 IP 與埠相同,但用戶端那側不同,便構成兩條各自獨立的串流。

一個傾聽埠、許多連線——四元組把它們分開。

可靠不代表保留訊息邊界。TCP 保證位元組依序送達,但不保證每次 recv 對應一次 send。請自己建立框架,否則你遲早會讀到一則訊息的一半,外加下一則的開頭。

又稱
stream socketSOCK_STREAMTCP 套接字串流通訊端