TCP快速打開

是对传输控制协议连接的一种用于提高两终点间连续连接打开速度的一种拓展。

TCP快速打開(英語:TCP Fast Open,簡稱TFO)是對計算機網絡中傳輸控制協議(TCP)連接的一種簡化握手手續的拓展,用於提高兩端點間連接的打開速度。

它通過握手開始時的SYN包中的TFO cookie(一個TCP選項)來驗證一個之前連接過的客戶端。如果驗證成功,它可以在三次握手最終的ACK包收到之前就開始發送數據,這樣便跳過了一個繞路的行為,更在傳輸開始時就降低了延遲。這個加密的Cookie被存儲在客戶端,在一開始的連接時被設定好。然後每當客戶端連接時,這個Cookie被重複返回。[1]

此Cookie通常採用一種分組密碼,私鑰由服務器根據客戶端的IP地址保存,生成一個第三方難以仿冒的訊息鑑別碼標籤,即便第三方可以偽造源IP地址或從其他IP地址製造到同一個服務器的連接。儘管使用了加密技術來生成cookie,但TFO並不着眼於提供比它所替換的三次握手有更多的安全性,並且不對所產生的TCP連接提供任何形式的加密保護或端點身份認證。它的目的不是為了抵擋中間人攻擊。

這個協議最早提出於2011年[2] 並在2012年2月時已為一個IETF互聯網草案,[3] 這項規範最終在2014年12月作為RFC 7413發布。[4]

過程

  1. 客戶端發送SYN數據包,該數據包包含Fast Open選項,且該選項的Cookie為空,這表明客戶端請求Fast Open Cookie;
  2. 支持TCP Fast Open的服務器生成Cookie,並將其置於SYN-ACK數據包中的Fast Open選項以發回客戶端;
  3. 客戶端收到SYN-ACK後,緩存Fast Open選項中的Cookie。

實施TCP Fast Open

以下描述假定客戶端在此前的TCP連接中已完成請求Fast Open Cookie的過程並存有有效的Fast Open Cookie。

  1. 客戶端發送SYN數據包,該數據包包含數據(對於非TFO的普通TCP握手過程,SYN數據包中不包含數據)以及此前記錄的Cookie;
  2. 支持TCP Fast Open的服務器會對收到Cookie進行校驗:如果Cookie有效,服務器將在SYN-ACK數據包中對SYN和數據進行確認(Acknowledgement),服務器隨後將數據遞送至相應的應用程序;否則,服務器將丟棄SYN數據包中包含的數據,且其隨後發出的SYN-ACK數據包將僅確認(Acknowledgement)SYN的對應序列號;
  3. 如果服務器接受了SYN數據包中的數據,服務器可在握手完成之前發送數據;
  4. 客戶端將發送ACK確認服務器發回的SYN以及數據,但如果客戶端在初始的SYN數據包中發送的數據未被確認,則客戶端將重新發送數據;
  5. 此後的TCP連接和非TFO的正常情況一致。

註:客戶端在請求並存儲了Fast Open Cookie之後,可以不斷重複TCP Fast Open直至服務器認為Cookie無效(通常為過期)。[4]

實現

TFO的實現包括:

  • TFO的IPv4支持在3.6(客戶端)和3.7(服務端)版本中被合併進Linux內核主線[5][6][7]。IPv6服務器的TFO支持被合併進入3.16版本。[8]
  • FreeBSD自10.3版本[9](支援服務端)和12.0版本(支援用戶端)開始支持TFO[10]

替代品

TCP快速打開(TFO)類似一項1994年被稱作T/TCPRFC 1644)的提議,但由於它未考慮安全原因而存在漏洞,所以未被廣泛使用。

參見

參考文獻

  1. ^ Kerrisk, Michael. TCP Fast Open: expediting web services. LWN.net. 2012-08-01 [2014-12-03]. (原始內容存檔於2014-12-05). 
  2. ^ Radhakrishnan S, Cheng Y, Chu J, Jain A, Raghavan B. TCP Fast Open (PDF). ACM CoNEXT. 2011-12-06 [2014-12-03]. (原始內容存檔 (PDF)於2012-10-29). 
  3. ^ Cheng Y, Chu J, Radhakrishnan S, Jain A. TCP Fast Open. IETF. 2013-01-26. I-D draft-ietf-tcpm-fastopen-06. 
  4. ^ 4.0 4.1 Yuchung Cheng, Jerry Chu, Sivasankar Radhakrishnan, and Arvind Jain. TCP Fast Open. IETF. December 2014 [10 January 2015]. (原始內容存檔於2015-01-01). 
  5. ^ Kerrisk, Michael. TCP Fast Open: expediting web services. LWN.net. 2012-08-01 [2014-12-03]. (原始內容存檔於2014-12-05). The client-side support has been merged for Linux 3.6 
  6. ^ Vaughan-Nichols, Steven J. Linux 3.7 arrives, ARM developers rejoice. Linux and Open Source (ZDNet). 2012-12-11 [2014-12-03]. (原始內容存檔於2014-11-05). Linux 3.7. TCP Fast Open will now be supported on servers 
  7. ^ Linux Kernel 3.13. kernelnewbies.org. 19 January 2014 [11 February 2014]. (原始內容存檔於2014-01-25).  |section=被忽略 (幫助)
  8. ^ Linux Kernel 3.16. kernelnewbies.org. 3 August 2014 [14 September 2014]. (原始內容存檔於2014-12-15).  |section=被忽略 (幫助)
  9. ^ [base] Revision 292823. svnweb.freebsd.org. [2017-08-06]. (原始內容存檔於2021-05-27) (英語). 
  10. ^ [base] Revision 292706. svnweb.freebsd.org. [2017-08-06]. (原始內容存檔於2018-02-18) (英語). 
  11. ^ 1188435 - Support TCP fastopen. bugzilla.mozilla.org. [2017-08-06]. (原始內容存檔於2017-09-09) (英語). 
  12. ^ [exim] Exim 4.88 released. lists.exim.org. [2017-08-06]. (原始內容存檔於2021-05-27) (英語). 
  13. ^ Release Notes for BIND Version 9.11.0. [2016-10-05]. (原始內容存檔於2016-10-21). 
  14. ^ Your App and Next Generation Networks. Apple Inc. 2015 [2016-12-10]. (原始內容存檔於2015-06-15). 
  15. ^ Windows 10 build 14352 - New web platform features. Microsoft. [2016-05-27]. (原始內容存檔於2016-06-30).