TCP快速打开

TCP快速打开（英語：TCP Fast Open，简称TFO）是对计算机网络中传输控制协议（TCP）连接的一种简化握手手续的拓展，用于提高两端点间连接的打开速度。 它通过握手开始时的SYN包中的TFO cookie（一个TCP选项）来验证一个之前连接过的客户端。如果验证成功，它可以在三次握手最终的ACK包收到之前就开始发送数据，这样便跳过了一个绕路的行为，更在传输开始时就降低了延迟。这个加密的Cookie被存储在客户端，在一开始的连接时被设定好。然后每当客户端连接时，这个Cookie被重复返回。 此Cookie通常采用一种分组密码，私钥由服务器根据客户端的IP地址保存，生成一个第三方难以仿冒的訊息鑑別碼标签，即便第三方可以伪造源IP地址或从其他IP地址制造到同一个服务器的连接。尽管使用了加密技术来生成cookie，但TFO并不着眼于提供比它所替换的三次握手有更多的安全性，并且不对所产生的TCP连接提供任何形式的加密保护或端点身份认证。它的目的不是为了抵挡中间人攻击。 这个协议最早提出于2011年 并在2012年2月时已为一个IETF互联网草案， 这项规范最终在2014年12月作为RFC 7413发布。 客户端发送SYN数据包，该数据包包含Fast Open选项，且该选项的Cookie为空，这表明客户端请求Fast Open Cookie； 支持TCP Fast Open的服务器生成Cookie，并将其置于SYN-ACK数据包中的Fast Open选项以发回客户端； 客户端收到SYN-ACK后，缓存Fast Open选项中的Cookie。 以下描述假定客戶端在此前的TCP連接中已完成請求Fast Open Cookie的過程並存有有效的Fast Open Cookie。 客户端发送SYN数据包，该数据包包含数据（对于非TFO的普通TCP握手过程，SYN数据包中不包含数据）以及此前记录的Cookie； 支持TCP Fast Open的服务器会对收到Cookie进行校验：如果Cookie有效，服务器将在SYN-ACK数据包中对SYN和数据进行确认（Acknowledgement），服务器随后将数据递送至相应的应用程序；否则，服务器将丢弃SYN数据包中包含的数据，且其随后发出的SYN-ACK数据包将仅确认（Acknowledgement）SYN的对应序列号； 如果服务器接受了SYN数据包中的数据，服务器可在握手完成之前发送数据； 客户端将发送ACK确认服务器发回的SYN以及数据，但如果客户端在初始的SYN数据包中发送的数据未被确认，则客户端将重新发送数据； 此后的TCP连接和非TFO的正常情况一致。 注：客户端在请求并存储了Fast Open Cookie之后，可以不断重复TCP Fast Open直至服务器认为Cookie无效（通常为过期）。 TFO的实现包括： TFO的IPv4支持在3.6（客户端）和3.7（服务端）版本中被合并进Linux内核主线。IPv6服务器的TFO支持被合并进入3.16版本。 FreeBSD自10.3版本（支援服務端）和12.0版本（支援用戶端）开始支持TFO。 Mozilla Firefox 56支持TFO。 Google Chrome和Chromium浏览器在Linux上提供TFO支持，包括Chrome OS和Android。 Exim（邮件传输代理）从4.88开始启用TFO。 BIND自9.11.0开始启用。 苹果公司的iOS 9和OS X 10.11支持TCP快速打开，但并未为各连接默认启用。 Microsoft Edge从Windows 10 Preview build 14352开始支持TFO。 TCP快速打开（TFO）类似一项1994年被称作T/TCP（RFC 1644）的提议，但由于它未考虑安全原因而存在漏洞，所以未被广泛使用。 SPDY SYN cookies TCP Cookie 传输 Kerrisk, Michael. TCP Fast Open: expediting web services. LWN.net. 2012-08-01 [2014-12-03]. （原始内容存档于2014-12-05）.  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）.  Cheng Y, Chu J, Radhakrishnan S, Jain A. TCP Fast Open. IETF. 2013-01-26. I-D draft-ietf-tcpm-fastopen-06.  Yuchung Cheng, Jerry Chu, Sivasankar Radhakrishnan, and Arvind Jain. TCP Fast Open. IETF. December 2014 [10 January 2015]. （原始内容存档于2015-01-01）.  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  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  Linux Kernel 3.13. kernelnewbies.org. 19 January 2014 [11 February 2014]. （原始内容存档于2014-01-25）.  |section=被忽略 (帮助) Linux Kernel 3.16. kernelnewbies.org. 3 August 2014 [14 September 2014]. （原始内容存档于2014-12-15）.  |section=被忽略 (帮助) [base] Revision 292823. svnweb.freebsd.org. [2017-08-06]. （原始内容存档于2021-05-27） （英语）.  [base] Revision 292706. svnweb.freebsd.org. [2017-08-06]. （原始内容存档于2018-02-18） （英语）.  1188435 - Support TCP fastopen. bugzilla.mozilla.org. [2017-08-06]. （原始内容存档于2017-09-09） （英语）.  [exim] Exim 4.88 released. lists.exim.org. [2017-08-06]. （原始内容存档于2021-05-27） （英语）.  Release Notes for BIND Version 9.11.0. [2016-10-05]. （原始内容存档于2016-10-21）.  Your App and Next Generation Networks. Apple Inc. 2015 [2016-12-10]. （原始内容存档于2015-06-15）.  Windows 10 build 14352 - New web platform features. Microsoft. [2016-05-27]. （原始内容存档于2016-06-30）.