TCP 與 UDP 之比較(TCP versus UDP)
/ TCP -> TEE-CEE-PEE, UDP -> YOO-DEE-PEE /
把東西送到城市另一頭有兩種方式。你可以打電話給某人:你撥號、對方接起、你們有一條雙向線路,你說的一切都按順序抵達、什麼都不會遺失,講完再掛斷。或者你可以把明信片丟進郵筒:不必建立連線、不保證會抵達、也不保證明信片會按你寄出的順序抵達,但又快又便宜。TCP 是那通電話;UDP 是那張明信片。兩者都騎在 IP 之上,而 IP 本身就只是不可靠的明信片。
TCP(傳輸控制協定)是連線導向且可靠的:雙方先建立一條連線,然後交換一道有順序、無缺口的位元組串流。若有一段在途中遺失,TCP 會偵測到並重傳;若各段抵達順序錯亂,TCP 會重新排序;當網路壅塞時它也會放慢。你得到的是兩個程式之間有一條乾淨管線的舒適錯覺。UDP(使用者資料包協定)是無連線、盡力而為的:你交給它一個資料包(datagram,一塊自成一體的位元組),定址到某個 IP 與連接埠,它便試著送一次。資料包可能遺失、重複或以不同順序抵達,而 UDP 不會告訴你——但它幾乎不加任何額外負擔,也不必等待。
為何重要:這個選擇形塑了其上的一切。當正確性重要、稍有延遲無妨時用 TCP——網頁、檔案、電子郵件、ssh。當速度與低延遲勝過完整性、且你願意自己處理遺失時用 UDP——即時影音、遊戲、DNS 查詢。一個誠實的重點:TCP 的「可靠」是指「送達、否則連線中斷」,而不是「瞬間」、也不是「不可能失敗」;而且 TCP 給你的是一道沒有訊息邊界的位元組串流,UDP 則把每個資料包當成一個完整單位保留下來。
載入網頁用的是 TCP——你要的是頁面的每一個位元組,按順序到齊,就算多花一點時間也行。視訊通話用的是 UDP——若有一格畫面遺失,與其讓通話凍結著等舊資料,不如跳過它、直接顯示下一格即時畫面。
TCP=可靠且有序的電話;UDP=快速、盡力而為的明信片。底下都是同一個 IP。
TCP 可靠並不代表它安全或私密——除非你加上加密(TLS,稍後再談),否則位元組在線路上仍可被讀取。可靠與安全是兩件不同的事。