{"id":1061,"date":"2018-05-17T07:17:54","date_gmt":"2018-05-17T07:17:54","guid":{"rendered":"http:\/\/www.ipcpu.com\/?p=1061"},"modified":"2018-09-19T07:24:18","modified_gmt":"2018-09-19T07:24:18","slug":"tfotcp-fast-open","status":"publish","type":"post","link":"https:\/\/c.ipcpu.com\/2018\/05\/tfotcp-fast-open\/","title":{"rendered":"TFO(TCP Fast Open)\u4ecb\u7ecd"},"content":{"rendered":"

\u4e00\u3001TFO\u6982\u8ff0<\/h2>\n

\u4e3a\u4e86\u6539\u5584web\u5e94\u7528\u76f8\u5e94\u65f6\u5ef6\uff0cgoogle\u53d1\u5e03\u4e86\u901a\u8fc7\u4fee\u6539TCP\u534f\u8bae\u5229\u7528\u4e09\u6b21\u63e1\u624b\u65f6\u8fdb\u884c\u6570\u636e\u4ea4\u6362\u7684TFO(TCP fast open\uff0cRFC 7413)\u3002<\/p>\n

TFO\u5141\u8bb8\u5728TCP\u63e1\u624b\u671f\u95f4\u53d1\u9001\u548c\u63a5\u6536\u521d\u59cbSYN\u5206\u7ec4\u4e2d\u7684\u6570\u636e\u3002\u5982\u679c\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u5668\u90fd\u652f\u6301TFO\u529f\u80fd\uff0c\u5219\u53ef\u4ee5\u51cf\u5c11\u5efa\u7acb\u5230\u540c\u4e00\u670d\u52a1\u5668\u7684\u591a\u4e2aTCP\u8fde\u63a5\u7684\u5ef6\u8fdf\u3002\u8fd9\u662f\u901a\u8fc7\u5728\u521d\u59cbTCP\u63e1\u624b\u4e4b\u540e\u5728\u5ba2\u6237\u7aef\u4e0a\u5b58\u50a8TFO cookie\u6765\u5b9e\u73b0\u7684\u3002\u5982\u679c\u5ba2\u6237\u7aef\u7a0d\u540e\u91cd\u65b0\u8fde\u63a5\uff0c\u5219\u6b64TFO cookie\u5c06\u53d1\u9001\u5230\u670d\u52a1\u5668\uff0c\u4ece\u800c\u5141\u8bb8\u8fde\u7eed\u7684TCP\u63e1\u624b\u8df3\u8fc7\u4e00\u4e2a\u5f80\u8fd4\u5ef6\u8fdf\uff0c\u4ece\u800c\u51cf\u5c11\u5ef6\u8fdf\u3002<\/p>\n

\u4e8c\u3001TFO\u539f\u7406\u56fe<\/h2>\n

\u666e\u901a\u7684TCP\u8fde\u63a5\u8fc7\u7a0b\u5982\u4e0b\u56fe\u6240\u793a
\n
\n\u800cTFO\u7684\u8fde\u63a5\u8fc7\u7a0b\u5982\u4e0b
\n
\n\u5f53\u5ba2\u6237\u7aef\u65ad\u5f00\u4e00\u6bb5\u65f6\u95f4\u540e\uff0c\u518d\u6b21\u8fde\u63a5\u8fc7\u7a0b\u5982\u4e0b
\n<\/p>\n

\u53ef\u4ee5\u770b\u51fa\u4f7f\u7528TFO\u540e\uff0c\u8fde\u63a5\u65f6\u95f4\u5c11\u4e86\u4e00\u4e2aRTT\u7684\u5ef6\u8fdf\u3002<\/p>\n

\u4e09\u3001TFO\u7684\u5f00\u542f<\/h2>\n

TFO\u529f\u80fd\u5728Linux 3.7 \u5185\u6838\u4e2d\u5f00\u59cb\u96c6\u6210\uff0c\u56e0\u6b64RHEL7\/CentOS7\u662f\u652f\u6301\u7684\uff0c\u4f46\u9ed8\u8ba4\u6ca1\u6709\u5f00\u542f\uff0c\u4f7f\u7528\u4ee5\u4e0b\u65b9\u5f0f\u5f00\u542f\uff1a<\/p>\n

\n
echo 3 > \/proc\/sys\/net\/ipv4\/tcp_fastopen\r\n#3\u7684\u610f\u601d\u662f\u5f00\u542fTFO\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u5668\u7aef\r\n#1\u8868\u793a\u5f00\u542f\u5ba2\u6237\u7aef\uff0c2\u8868\u793a\u5f00\u542f\u670d\u52a1\u5668\u7aef<\/code><\/pre>\n<\/div>\n

\u9664\u4e86\u5185\u6838\u7684\u652f\u6301\uff0c\u5e94\u7528\u7a0b\u5e8f\u4e5f\u8981\u5f00\u542f\u652f\u6301\uff0c\u4f8b\u5982nginx\uff081.5.8+\uff09\u5f00\u542f\u65b9\u6cd5\u5982\u4e0b\uff1a<\/p>\n

\n
 server {\r\n        listen 80 backlog=4096 fastopen=256 default;\r\n        server_name _;<\/code><\/pre>\n<\/div>\n

\u56db\u3001TFO\u7684\u5ba2\u6237\u7aef\u652f\u6301\u60c5\u51b5<\/h2>\n

Linux 3.7 \u4ee5\u540e\u7684\u5185\u6838\uff0c\u53ef\u4ee5\u624b\u52a8\u5f00\u542f\u30023.13\u4ee5\u540e\u7684\u5185\u6838\u9ed8\u8ba4\u5f00\u542f\uff08\u9ed8\u8ba4\u4e3a1\uff09\u3002
\nWindows10 \u9ed8\u8ba4\u5f00\u542f1607+\uff08\u81ea\u52a8\u66f4\u65b0\u6253\u5f00\u7684\u60c5\u51b5\u4e0b\uff09
\nwindows\u9ed8\u8ba4\u7684Edge\u6d4f\u89c8\u566814352\u4ee5\u540e\u7684\u7248\u672c\u3002
\nChrome\u6d4f\u89c8\u5668\u5728Linux\u3001 Android\u4e0a\u7684\u7248\u672c\u3002\u5728windows\u4e0a\u7248\u672c\u4e0d\u652f\u6301\u3002
\nFirefox\u6d4f\u89c8\u5668\u9ed8\u8ba4\u5173\u95ed\uff0c\u53ef\u4ee5\u624b\u52a8\u5f00\u542f\u3002
\nApple\u7684 iOS 9 \u548c OS X 10.11 \u53ef\u4ee5\u652f\u6301\uff0c\u4f46\u53ef\u80fd\u9ed8\u8ba4\u672a\u542f\u7528\u3002
\nlinux\u4e0b\u7684curl 7.49\u4ee5\u540e\u7684\u7248\u672c\u652f\u6301\u3002<\/p>\n

\u4e94\u3001TFO\u7684\u6d4b\u8bd5<\/h2>\n

\u6211\u4eec\u5728\u670d\u52a1\u5668\u7aef\u5f00\u542fTFO\uff0c\u5e76\u914d\u7f6enginx\u652f\u6301TFO\u3002
\n\u5ba2\u6237\u7aef\u5f00\u542fTFO\uff0c\u5347\u7ea7curl\u52307.61\u7248\u672c\u3002\u7136\u540e\u4f7f\u7528curl\u8bbf\u95eeHTTP\u9875\u9762\u8fdb\u884c\u6d4b\u8bd5\u3002
\n\u5ba2\u6237\u7aef\u5982\u4e0b<\/p>\n

\n
# curl -s -o\/dev\/null --tcp-fastopen http:\/\/10.140.10.16\/\r\n\u4f7f\u7528ip tcp_metrics show\u53ef\u4ee5\u770b\u5230cookie\r\n# ip tcp_metrics show | grep \"fo_cookie\"\r\n10.140.10.16 age 41.955sec tw_ts 282422045\/42sec ago rtt 250us rttvar 250us cwnd 10 metric_5 2380 metric_6 1190 fo_mss 1460 fo_cookie 1640a20f99195995<\/code><\/pre>\n<\/div>\n

\u670d\u52a1\u5668\u7aef\u6293\u5305\u5982\u4e0b\uff0c\u53ef\u4ee5\u770b\u5230\u53d1\u51fa\u7684cookie\uff0c1640a20f99195995\u3002<\/p>\n

\n
20:17:10.533466 IP 10.140.12.45.28722 > 10.140.10.16.80: Flags [S], seq 1532602092, win 29200, options [mss 1460,sackOK,TS val 982198124 ecr 0,nop,wscale 9,tfo cookiereq,nop,nop], length 0\r\n20:17:10.533518 IP 10.140.10.16.80 > 10.140.12.45.28722: Flags [S.], seq 108109466, ack 1532602093, win 28960, options [mss 1460,sackOK,TS val 282422044 ecr 982198124,nop,wscale 9,tfo cookie 1640a20f99195995,nop,nop], length 0<\/code><\/pre>\n<\/div>\n


\n\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u53ef\u4ee5\u67e5\u770bTFO\u8fde\u63a5\u7684\u7edf\u8ba1\u4fe1\u606f<\/p>\n

\n
# grep '^TcpExt:' \/proc\/net\/netstat | cut -d ' ' -f 87-92 | column -t\r\nTCPOFOMerge TCPChallengeACK TCPSYNChallenge TCPFastOpenActive TCPFastOpenActiveFail TCPFastOpenPassive\r\n9306 29958 2457 0 0 11<\/code><\/pre>\n<\/div>\n

\u516d\u3001\u5176\u4ed6\u95ee\u9898<\/h2>\n

\u4ee5\u4e0b\u95ee\u9898\u5c1a\u672a\u89e3\u51b3\uff1a<\/p>\n

    \n
  1. \u5ba2\u6237\u7aef\u7684TFOcookie\u591a\u957f\u65f6\u95f4\u540e\u5220\u9664\uff0c\u8c01\u6765\u7ef4\u62a4\u548c\u5220\u9664\uff1f<\/li>\n
  2. nginx\u7684TFO\u961f\u5217\u5177\u4f53\u662f\u4ec0\u4e48\u610f\u601d\uff1f\u961f\u5217\u6ee1\u4e86\u4f1a\u600e\u6837\uff1f\u6570\u503c\u8bbe\u5b9a\u591a\u5c11\u5408\u9002\uff1f
    \n\u961f\u5217\u662fRFC7413\u4e2d\u7684\u4e00\u79cd\u5bf9\u670d\u52a1\u5668\u7684\u5b89\u5168\u4fdd\u62a4\u673a\u5236\uff0c\u8d85\u51fa\u961f\u5217\u7684\u6570\u636e\u5305\uff0c\u4f1a\u964d\u7ea7\u5230\u666e\u901a\u7684\u65e0cookie\u8fde\u63a5\u65b9\u5f0f\uff0c\u5373TFO\u529f\u80fd\u5931\u6548\u3002\u4f46\u8fd9\u4e2a\u6570\u503c\u5177\u4f53\u8bbe\u7f6e\u591a\u5c11\u4e0d\u592a\u597d\u5b9a\u3002<\/li>\n<\/ol>\n

    \u4e03\u3001\u53c2\u8003\u8d44\u6599<\/h2>\n

    http:\/\/martinbj2008.github.io\/2016\/11\/23\/what-is-tfo\/<\/a>
    \n
    https:\/\/zhuanlan.zhihu.com\/p\/36239657<\/a>
    \n
    http:\/\/abcdxyzk.github.io\/blog\/2018\/07\/30\/kernel-tcp_metric\/<\/a>
    \n
    https:\/\/tools.ietf.org\/html\/rfc7413<\/a><\/p>\n

    <\/p>\n

    <\/div>\n
    <\/div>\n
    \n
    <\/div>\n
    <\/div>\n
    <\/div>\n
    <\/div>\n
    <\/div>\n<\/div>\n
    \n
    <\/div>\n
    <\/div>\n
    <\/div>\n
    <\/div>\n
    <\/div>\n<\/div>\n

    <\/wiz_tmp_tag><\/p>\n

    \u8f6c\u8f7d\u8bf7\u6ce8\u660e\uff1aIPCPU-\u7f51\u7edc\u4e4b\u8def<\/a> » TFO(TCP Fast Open)\u4ecb\u7ecd<\/a><\/p>","protected":false},"excerpt":{"rendered":"

    \u4e00\u3001TFO\u6982\u8ff0 \u4e3a\u4e86\u6539\u5584web\u5e94\u7528\u76f8\u5e94\u65f6\u5ef6\uff0cgoogle\u53d1\u5e03\u4e86\u901a\u8fc7\u4fee\u6539TCP\u534f\u8bae\u5229\u7528\u4e09\u6b21\u63e1\u624b\u65f6\u8fdb\u884c\u6570\u636e\u4ea4\u6362\u7684TFO(TCP fast open\uff0cRFC 7413)\u3002 TFO\u5141\u8bb8\u5728TCP\u63e1\u624b\u671f\u95f4\u53d1\u9001\u548c\u63a5\u6536\u521d\u59cbSYN\u5206\u7ec4\u4e2d\u7684\u6570\u636e\u3002\u5982\u679c\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u5668\u90fd\u652f\u6301TFO\u529f\u80fd\uff0c\u5219\u53ef\u4ee5\u51cf\u5c11\u5efa\u7acb\u5230\u540c\u4e00\u670d\u52a1\u5668\u7684\u591a\u4e2aTCP\u8fde\u63a5\u7684\u5ef6\u8fdf\u3002\u8fd9\u662f\u901a\u8fc7\u5728\u521d\u59cbTCP\u63e1\u624b\u4e4b\u540e\u5728\u5ba2\u6237\u7aef\u4e0a\u5b58\u50a8TFO cookie\u6765\u5b9e\u73b0\u7684\u3002\u5982\u679c\u5ba2\u6237\u7aef\u7a0d\u540e\u91cd\u65b0\u8fde\u63a5\uff0c\u5219\u6b64TFO cookie\u5c06\u53d1\u9001\u5230\u670d\u52a1\u5668\uff0c\u4ece\u800c\u5141\u8bb8\u8fde\u7eed\u7684TCP\u63e1\u624b\u8df3\u8fc7\u4e00\u4e2a\u5f80\u8fd4\u5ef6\u8fdf\uff0c\u4ece\u800c\u51cf\u5c11\u5ef6\u8fdf\u3002 \u4e8c\u3001TFO\u539f\u7406\u56fe \u666e\u901a\u7684TCP\u8fde\u63a5\u8fc7\u7a0b\u5982\u4e0b\u56fe\u6240\u793a \u800cTFO\u7684\u8fde\u63a5\u8fc7\u7a0b\u5982\u4e0b \u5f53\u5ba2\u6237\u7aef\u65ad\u5f00\u4e00\u6bb5\u65f6\u95f4\u540e\uff0c\u518d\u6b21\u8fde\u63a5\u8fc7\u7a0b\u5982\u4e0b \u53ef\u4ee5\u770b\u51fa\u4f7f\u7528TFO\u540e\uff0c\u8fde\u63a5\u65f6\u95f4\u5c11\u4e86\u4e00\u4e2aRTT\u7684\u5ef6\u8fdf\u3002 \u4e09\u3001TFO\u7684\u5f00\u542f TFO\u529f\u80fd\u5728Linux 3.7 \u5185\u6838\u4e2d\u5f00\u59cb\u96c6\u6210\uff0c\u56e0\u6b64RHEL7\/CentOS7\u662f\u652f\u6301\u7684\uff0c\u4f46\u9ed8\u8ba4\u6ca1\u6709\u5f00\u542f\uff0c\u4f7f\u7528\u4ee5\u4e0b\u65b9\u5f0f\u5f00\u542f\uff1a echo 3 > \/proc\/sys\/net\/ipv4\/tcp_fastopen #3\u7684\u610f\u601d\u662f\u5f00\u542fTFO\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u5668\u7aef #1\u8868\u793a\u5f00\u542f\u5ba2\u6237\u7aef\uff0c2\u8868\u793a\u5f00\u542f\u670d\u52a1\u5668\u7aef \u9664\u4e86\u5185\u6838\u7684\u652f\u6301\uff0c\u5e94\u7528\u7a0b\u5e8f\u4e5f\u8981\u5f00\u542f\u652f\u6301\uff0c\u4f8b\u5982nginx\uff081.5.8+\uff09\u5f00\u542f\u65b9\u6cd5\u5982\u4e0b\uff1a server { listen 80 backlog=4096 fastopen=256 default; server_name _; \u56db\u3001TFO\u7684\u5ba2\u6237\u7aef\u652f\u6301\u60c5\u51b5 Linux 3.7 \u4ee5\u540e\u7684\u5185\u6838\uff0c\u53ef\u4ee5\u624b\u52a8\u5f00\u542f\u30023.13\u4ee5\u540e\u7684\u5185\u6838\u9ed8\u8ba4\u5f00\u542f\uff08\u9ed8\u8ba4\u4e3a1\uff09\u3002 Windows10 \u9ed8\u8ba4\u5f00\u542f1607+\uff08\u81ea\u52a8\u66f4\u65b0\u6253\u5f00\u7684\u60c5\u51b5\u4e0b\uff09 windows\u9ed8\u8ba4\u7684Edge\u6d4f\u89c8\u566814352\u4ee5\u540e\u7684\u7248\u672c\u3002 Chrome\u6d4f\u89c8\u5668\u5728Linux\u3001 Android\u4e0a\u7684\u7248\u672c\u3002\u5728windows\u4e0a\u7248\u672c\u4e0d\u652f\u6301\u3002 Firefox\u6d4f\u89c8\u5668\u9ed8\u8ba4\u5173\u95ed\uff0c\u53ef\u4ee5\u624b\u52a8\u5f00\u542f\u3002 Apple\u7684 iOS 9 \u548c OS X 10.11 \u53ef\u4ee5\u652f\u6301\uff0c\u4f46\u53ef\u80fd\u9ed8\u8ba4\u672a\u542f\u7528\u3002 linux\u4e0b\u7684curl 7.49\u4ee5\u540e\u7684\u7248\u672c\u652f\u6301\u3002 \u4e94\u3001TFO\u7684\u6d4b\u8bd5 \u6211\u4eec\u5728\u670d\u52a1\u5668\u7aef\u5f00\u542fTFO\uff0c\u5e76\u914d\u7f6enginx\u652f\u6301TFO\u3002 […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[3,13],"tags":[179,17,107,178],"_links":{"self":[{"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/posts\/1061"}],"collection":[{"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/comments?post=1061"}],"version-history":[{"count":3,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/posts\/1061\/revisions"}],"predecessor-version":[{"id":1066,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/posts\/1061\/revisions\/1066"}],"wp:attachment":[{"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/media?parent=1061"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/categories?post=1061"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/c.ipcpu.com\/wp-json\/wp\/v2\/tags?post=1061"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}