TCP快速打開(英語:TCP Fast Open,簡稱TFO)是對計算機網路中傳輸控制協定(TCP)連線的一種簡化握手手續的拓展,用於提高兩端點間連線的打開速度。
基本介紹
- 中文名:TCP快速打開
- 外文名:TCP Fast Open
- 簡稱:TFO
- 領域:計算機
簡介,過程,請求Fast Open Cookie,實施TCP Fast Open,實現,替代品,
簡介
它通過握手開始時的SYN包中的TFO cookie(一個TCP選項)來驗證一個之前連線過的客戶端。如果驗證成功,它可以在三次握手最終的ACK包收到之前就開始傳送數據,這樣便跳過了一個繞路的行為,更在傳輸開始時就降低了延遲。這個加密的Cookie被存儲在客戶端,在一開始的連線時被設定好。然後每當客戶端連線時,這個Cookie被重複返回。
此Cookie通常採用一種分組密碼,私鑰由伺服器根據客戶端的IP位址保存,生成一個第三方難以仿冒的訊息認證碼標籤,即便第三方可以偽造源IP位址或從其他IP位址製造到同一個伺服器的連線。儘管使用了加密技術來生成cookie,但TFO並不著眼於提供比它所替換的三次握手有更多的安全性,並且不對所產生的TCP連線提供任何形式的加密保護或端點身份認證。它的目的不是為了抵擋中間人攻擊。
這個協定最早提出於2011年並在2012年2月時已為一個IETF網際網路草案,這項規範最終在2014年12月作為RFC 7413發布。
過程
請求Fast Open Cookie
- 客戶端傳送SYN數據包,該數據包包含Fast Open選項,且該選項的Cookie為空,這表明客戶端請求Fast Open Cookie;
- 支持TCP Fast Open的伺服器生成Cookie,並將其置於SYN-ACK數據包中的Fast Open選項以發回客戶端;
- 客戶端收到SYN-ACK後,快取Fast Open選項中的Cookie。
實施TCP Fast Open
以下描述假定客戶端在此前的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核心主線,從3.13版本開始默認打開。IPv6伺服器的TFO支持被合併進入3.16版本。
- FreeBSD自10.3和11.0版本開始支持TFO(僅支持服務端,未默認啟用需要手動修改配置,需要重新編譯核心)。
- Mozilla Firefox56將支持TFO。
- Exim(郵件傳輸代理)從4.88開始啟用TFO。
- BIND自9.11.0開始啟用。
替代品
TCP快速打開(TFO)類似一項1994年被稱作T/TCP(RFC 1644)的提議,但由於它未考慮安全原因而存在漏洞,所以未被廣泛使用。