確認(acknowledgment)
當你在電話裡說了重要的話,對方回一句「收到」,那句「收到」就是一個確認——回傳給你、確認你的訊息已抵達的小訊號。在網路裡,確認(acknowledgment,ACK)正是如此:接收端回傳的一則短訊息,用來告訴寄件者它已成功收到哪些資料。沒有 ACK,一個朝網路喊話的寄件者永遠不會知道有沒有人接住它丟出去的東西。
TCP 使用累積確認:確認號說「我已收到直到這裡為止的每個位元組,我預期的下一個位元組是第 N 號」。所以一個 5001 的 ACK 意思是「我有位元組 1 到 5000;下一個請給我 5001」。寄件者看著 ACK 一個個回來;缺漏的 ACK(或一次逾時)揭露了某樣東西遺失、必須重送。TCP 還有一個洩漏天機的訊號:如果接收端收到亂序資料,它會重送同一個 ACK,而三個這樣的重複 ACK 強烈暗示某個區段遺失了,讓寄件者不必等計時器就能快速重傳。
為什麼重要:確認是讓可靠性成為可能的回饋——它閉合了寄件者與接收者之間的迴路。它們還身兼二職:源源不絕的 ACK 串流,正是 TCP 量測往返時間並據以送出新資料的依據。有個微妙之處值得釐清:ACK 確認的是傳輸層收到了位元組,而不是應用程式已讀取或處理了它們。此外,ACK 常被「搭便車」附在反方向流動的資料上,所以通常不需要額外的封包。
一台伺服器送出位元組 1–1000,再送 1001–2000。用戶端在第一段後回 ACK 1001,在第二段後回 ACK 2001——每個 ACK 都點名它接下來想要的位元組。如果只有第二段遺失,伺服器會一直看到 ACK 1001,便知道要從那裡重送。
累積 ACK 點名的是「預期的下一個位元組」,不是「最後收到的」。
ACK 表示傳輸層緩衝了那些位元組,不表示應用程式已消化它們。此外,重複的 ACK 是一種資訊、不是錯誤——三個重複 ACK 是 TCP 的快速丟失訊號。