TCP延遲確認

TCP延遲確認(英語:TCP delayed acknowledgment)是傳輸控制協議所使用的技術,用於改善網絡性能。該技術可以將若干ACK報文組合在一起成為單個報文,從而減少協議開銷。但是在某些情況下,該技術可能會降低應用程式性能。

方法和優點

RFC1122頁面存檔備份,存於互聯網檔案館)所說,一個主機可以延遲發送ACK報文高達500毫秒。此外,以每完整的數據包為一段,ACK報文必須每兩段發送一次。

延遲的ACK可以使應用程式有機會更新TCP接收窗口,也可以立即發送ACK報文。對於某些協議(如Telnet),通過將ACK、窗口更新和響應數據組合到一個段中,可以將伺服器發送的響應數量減少3倍。 [1]

問題

延遲ACK引入的額外等待時間在與某些應用程式和配置交互時可能導致進一步的延遲。如果發送方正在使用Nagle的算法,則數據將由發送方排隊,直到收到ACK。如果發送方未發送足夠的數據來填充最大分段大小(例如,如果它執行兩次小的寫操作,然後執行阻塞讀取),則傳輸將暫停到ACK延遲超時。

Linux內核從版本2.4.4開始支持禁用延遲ACK的TCP_QUICKACK套接字選項。 [2]由此可以得知,如果發送方的套接字層的數據少於一個完整數據包,根據Nagle的算法,在收到已發送數據的ACK之前,是不會發送這段數據的。與此同時,接收方的應用層在獲取所有數據之前不會發送響應;如果接收方啟用了延遲的ACK,則它的套接字層將不會發送ACK,直到達到超時。

如果應用程式以較小的塊發送數據並期望定期ACK,則可能發生這種負面交互。為防止此延遲,應用程式層需要連續發送數據而無需等待ACK,或者Nagle的算法可能被發送方的應用程式禁用。

參考

  1. ^ http://tools.ietf.org/html/rfc1122#page-96頁面存檔備份,存於互聯網檔案館
  2. ^ tcp(7) in Linux. manpages.info. [9 May 2018]. (原始內容存檔於2019-01-31) (英語).