TCP Fast Open知识
TCP Fast Open定義
TCP Fast Open(TFO)是用來加速連續TCP連接的數據交互的TCP協議擴展,原理如下:在TCP三次握手的過程中,當用戶首次訪問Server時,發送SYN包,Server根據用戶IP生成Cookie(已加密),并與SYN-ACK一同發回Client;當Client隨后重連時,在SYN包攜帶TCP Cookie;如果Server校驗合法,則在用戶回復ACK前就可以直接發送數據;否則按照正常三次握手進行。
?
起源
由Google于2011年的論文(http://conferences.sigcomm.org/co-next/2011/papers/1569470463.pdf)中提出,IPV4的TFO已經合入Linux Kernel Mainline,Client內核版本為3.6;Server內核版本為3.7。
Google研究發現TCP三次握手是頁面延遲時間的重要組成部分,所以他們提出了TFO:在TCP握手期間交換數據,這樣可以減少一次RTT。根據測試數據,TFO可以減少15%的HTTP傳輸延遲,全頁面的下載時間平均節省10%,最高可達40%。
目前互聯網上頁面平均大小為300KB,單個object平均大小及中值大小分別為7.3KB及2.4KB。所以在這種情況下,多一次RTT無疑會造成很大延遲。
2011年6月,對Google webServer進行連續7天數十億次針對80端口的請求分析,包括搜索、Gmail、圖片等多個服務。其中cold requests為:新連接上的請求;warm requests為已有連接上的請求;All requests為所有連接上的請求(cold requests + warm requests)。cold requests及all requests中TCP握手時間在整個延遲時間中的占比如圖 1 所示
圖 1 Cold Req及All Req的三次握手在整個連接生命周期的時間百分比
?
分析結果顯示,在cold requests中,TCP握手時間占延遲時間的8%-28%;即使統計所有的請求,TCP握手時間也占到了延遲時間的5%-7%。
谷歌對谷歌瀏覽器的進行了28天的連續數據分析(通過了用戶授權):數據不僅僅是針對谷歌服務,也涉及到所有網站的請求。通過對上十億條記錄的分析,發現即使使用了Http1.1的keep-alive功能,依然有33%的請求是在新連接上發起的。可能原因:為了加快下載速度,新建數10個連接;主機和NAT也會主動斷開閑置的keep-alive連接;為了省電,手機瀏覽器關閉閑置的連接。
為了理解TCP的三次握手對整個連接交互的影響,將分析數據進行繪圖,如圖 2所示
?
圖 2 Http請求延時的累積分布函數圖(CDF)
?
其中,X軸為網絡交互延時(單位為s), Y軸為以百分比表示的HTTP請求的累積分布;All Req為三次握手在所有請求中的時間占比; Cold Req為新連接上的三次握手的時間占比; Cold Req no Hsk代表去除了三次握手時間的Cold Req的時間占比。
Cold Req基本比All Req慢50%(DNS查找、慢啟動、SSL握手、TCP握手導致),而TCP握手時間在Cold Req延遲時間中往往占比了25%。
因此,Google設計了TCP Fast Open.
?
詳解
-
流程
TCP Fast Open流程圖如圖 3所示
?
圖 3 TCP Fast Open 流程圖
如圖 3所示,TFO的的流程如下:
當連接斷掉,重連后的流程如下:
? ? ? ? 如果驗證成功,向用戶發送SYN+ACK,在用戶回復ACK之前,便可以向用戶傳輸數據;
? ? ? ? 如果驗證失敗,則丟棄此TFO請求攜帶的數據,回復SYN-ACK確認SYN Seq,完成正常的三次握手。
? ? ? ??如果Cookie在網絡傳輸的過程中被丟棄,Client在RTO后,發起普通的TCP連接,流程如圖 4所示
圖 4 Cookie被網絡丟棄
?
3. 如果在SYN包中的數據被接受,那么Server可以在收到Client的ACK之前回復該請求的響應報文
4. ClientACKServer的SYN。如果Client的數據沒有得到Server的ACK,那么Client會通過ACK重傳該請求。
5. 隨后的操作和普通的TCP連接一致
建立了TFO連接而又沒有完成TCP連接的請求在Server端被稱為pending TFO connection,當pending的連接超過上限值,Server會關閉TFO,后續的請求會按正常的三次握手處理。
如果一個帶有TFO的SYN請求如果在一段時間內沒有收到回應,用戶會重新發送一個標準的SYN請求,不帶任何其他數據。
?
-
Cookie
Cookie是用來驗證Client的IP所有權的加密字符串。Server負責產生及驗證Cookie。Client緩存Cookie以及在隨后的連接初始化階段將Cookie返回給Server。
Server通過加密Client的源IP產生16字節長度的Cookie(通過AES-128算法)。加密和解密Cookie很快,可以和正常的SYN及SYN-ACK包的處理時間差不多。
為了確保安全及用戶IP會變(如DHCP),Cookie值會隔一段時間變化一次。
Cookie結構如圖 5 所示
?
圖5?Cookie結構
???????? 如圖 5所示,如果沒有Cookie或者Cookie值為空,則表明是Client向Server請求Cookie;如果Cookie有值,表明是Server向Client發送Cookie或者Client通過TFO執行Fast Opem.
?
-
TFO與Wireshark
通過Wireshark抓包可以看TFO流程,如圖6所示:
圖6?Wireshark抓包與TFO
Fast Open Cookie選項在TCP Options中,從No.7包中可以看到,Fast Open Cookie的Kind為34, 長度為10,Cookie為0x1a39d8e2100b247e。
?
-
開啟TFO
在Linux支持TFO的內核版本下(Client內核版本為3.6;Server內核版本為3.7),在sysctl.config(vim /etc/sysctl.conf)中添加:
net.ipv4.tcp_fastopen = 3其中1表示客戶端開啟,2表示服務端開啟,3表示客戶端和服務器同時開啟
?
-
示例代碼
Server主要代碼:
sfd = socket(AF_INET, SOCK_STREAM, 0);?? // Create socket
bind(sfd, ...);????????????????????????? // Bind to well known address???
int qlen = 5;??????????????????????????? // Value to be chosen by application
setsockopt(sfd, SOL_TCP, TCP_FASTOPEN, &qlen, sizeof(qlen));???
listen(sfd, ...);??????????????????????? // Mark socket to receive connections
cfd = accept(sfd, NULL, 0);????????????? // Accept connection on new socket
// read and write data on connected socket cfd
close(cfd);
注意:Server需要設置TCP_FASTOPEN屬性
?
Client主要代碼
sfd = socket(AF_INET, SOCK_STREAM, 0);???
sendto(sfd, data, data_len, MSG_FASTOPEN, (struct sockaddr *) &server_addr, addr_len);
// Replaces connect() + send()/write()???
// read and write further data on connected socket sfd
close(sfd);
注意:Client不能用connect,只能用sendto及sendmsg
?
TFO性能
?為了驗證TFO的性能,Google做了一些實驗。????????
-
頁面加載時間
Google對amazon.com、nytimes.com、wsj.com、TCP Wikipedia page等網站進行了使用TPO及不使用TPO進行了測試,設置一系列的RTT時間:20ms、100ms、200ms,記錄頁面的加載時間,每個頁面采集120個數據。
測試結果如圖 7 所示,(PLT 為Page load time)
圖 7 頁面加載時間
?
如圖 7所示,RTT時間越大,TFO的效果越明顯。當RTT為200ms時,改善達到了11%-41%。
?
-
Server CPU
由于Server產生Cookie時需要加密,驗證Cookie時需要解密,Google也測試了TFP開啟時,Server的CPU使用率,如圖 8所示
?
圖 8 CPU使用率
?
如圖8所示,當開啟TFO時,CPU的使用率并不高,在某些區間甚至低于普通的TCP。
?
安全性
在TFO下,依然存在一些問題,如偽造TFO SYN攻擊(通過DHCP及NAT、Moles獲取有效的Cookies),這種場景下,Server資源會被攻擊耗盡。
圖 9顯示了TFO的SYN-flood攻擊和普通的TCP SYN-flood攻擊對比情況
圖 9 SYN-Flood攻擊對比
?
結論
?
參考資料
總結
以上是生活随笔為你收集整理的TCP Fast Open知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TIME_WAIT简介
- 下一篇: HTTP 2.0 协议