傳輸層

TCP(傳輸控制協定)

/ tee-see-pee /

如果 UDP 是明信片,TCP 就是有逐字稿的電話通話。開講前兩端先打招呼、約定交談(一條連線);然後一方說的每句話都會依序送到另一方,不漏字、不重複,彷彿兩個程式之間架了一根完美、依序的管子。TCP 把網際網路那種會丟失、會亂序、盡力而為的傳遞,藏在一個乾淨可靠的位元組串流背後。

它靠一組相互配合的機制做到這點。連線以三向交握開啟,藉此同步兩端各自的起始序號。每個位元組都用序號編號;接收端回傳確認,說明它已收到哪些位元組;遺失的資料靠缺漏的確認或逾時來偵測,並予以重送。滑動視窗讓許多位元組能同時在傳輸途中以求速度,流量控制(廣告出去的接收視窗)讓快的寄件者不致灌爆慢的接收者,壅塞控制則讓寄件者不致壓垮網路。連線最後以 FIN 交換禮貌地關閉。

為什麼重要:TCP 承載了網際網路絕大部分的流量——網頁、電子郵件、檔案傳輸等等——正是因為應用程式渴望「就把我的位元組依序、完整地給我」。這裡有兩個重要的誠實提醒。第一,TCP 可靠但不安全:它本身不加密也不鑑別任何東西;那是由 TCP 之上的 TLS 提供(合起來給出 HTTPS)。第二,TCP 的依序保證會造成行頭阻塞——一個遺失的區段會卡住排在它後面的一切的傳遞——這正是 QUIC 出現的動機之一。

下載一個 10 MB 的檔案時,你的機器和伺服器先做 SYN、SYN-ACK、ACK 來開啟連線。接著伺服器串流出帶序號的位元組;你的機器確認已收到的部分;任何因小故障而遺失的區段都會被重送,所以你存下的檔案與原檔逐位元組完全相同。

交握、帶序號的位元組、確認、重送:一根可靠的管子。

可靠不等於安全,也不等於對每種工作負載都快。TCP 本身不加密任何東西,而它嚴格的依序傳遞會傷害對延遲敏感的應用程式——這正是有些人選 UDP 或 QUIC 的原因。

又稱
Transmission Control Protocol傳輸控制協定