LinuxサポートTFO(TCP Fast Open)の概要

1. TFOの概要

TCP Fast Open(TFO)は、ハンドシェイク手順を簡略化するためのTCPの拡張であり、2つのエンド間の接続のオープン速度を上げるために使用されます。つまり、実際に役立つデータは、TCPの3ウェイハンドシェイク中に送信されます。この拡張機能は、元々Linuxシステム、Linuxサーバー、LinuxシステムのChromeブラウザ、またはLinuxで実行されている他のサポートされているソフトウェア(shadosocksなど)に実装されていました。(注:Shadowsocksは、優れたSocksプロキシオープンソースソフトウェアです。)

ハンドシェイクの開始時にSYNパケットのTFO Cookieを使用して、以前に接続されたクライアントを確認します。検証が成功すると、3ウェイハンドシェイクの最後のACKパケットが受信される前にデータの送信を開始できます。これにより、迂回がスキップされ、送信の開始時の遅延が減少します。この暗号化されたCookieはクライアントに保存され、接続の最初に設定されます。その後、クライアントが接続するたびに、このCookieが繰り返し返されます。(参考:ウィキペディア

2. TFO回路図

通常のTCP接続プロセスを以下に示します



TFOの接続プロセスは以下の通りです



クライアントが一定期間切断した後の接続プロセスは次のとおりです

TFOを使用した後、RTT遅延によって接続時間が短縮されることがわかります。

3. TFOの開設

TFO機能はLinux 3.7カーネルに統合されているため、RHEL7 / CentOS7はサポートされていますが、デフォルトでは無効になっています。有効にするには、次の方法を使用します。

echo 3 > /proc/sys/net/ipv4/tcp_fastopen
#3的意思是开启TFO客户端和服务器端
#1表示开启客户端,2表示开启服务器端

カーネルサポートに加えて、アプリケーションもサポートを有効にする必要があります。たとえば、nginx(1.5.8+)の開始方法は次のとおりです。

 server {
        listen 80 backlog=4096 fastopen=256 default;
        server_name _;

4番目に、TFOクライアントのサポート

Linux 3.7以降のカーネルは手動で起動できます。3.13以降のカーネルはデフォルトで有効になっています(デフォルトは1)。
Windows 10では、デフォルトで1607+が有効になっています(自動更新が有効になっている場合)
。WindowsのデフォルトのEdgeブラウザーバージョン14352以降。
LinuxおよびAndroid上のChromeブラウザバージョン。このバージョンはWindowsではサポートされていません。
Firefoxブラウザーはデフォルトで閉じられており、手動で開くことができます。
AppleのiOS 9およびOS X 10.11はサポートできますが、デフォルトでは有効になっていない場合があります。
Linuxではcurl 7.49以降でサポートされています。

5、TFOテスト

サーバーでTFOを有効にし、nginxがTFOをサポートするように構成します。
クライアントはTFOを開き、curlをバージョン7.61にアップグレードします次に、curlを使用して、テスト用のHTTPページにアクセスします。
クライアントは以下の通り

# curl -s -o/dev/null --tcp-fastopen http://10.140.10.16/
使用ip tcp_metrics show可以看到cookie
# ip tcp_metrics show | grep "fo_cookie"
10.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

サーバーは次のようにパケットをキャプチャします。送信されたCookie 1640a20f99195995を確認できます。

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
20: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


TFO接続の統計を表示するには、次のコマンドを使用します

# grep '^TcpExt:' /proc/net/netstat | cut -d ' ' -f 87-92 | column -t
TCPOFOMerge TCPChallengeACK TCPSYNChallenge TCPFastOpenActive TCPFastOpenActiveFail TCPFastOpenPassive
9306 29958 2457 0 0 11

6.その他の問題

次の問題は解決されていません。

  1. クライアントのTFO Cookieはどれくらいの期間削除されますか?誰がそれを維持して削除しますか?
  2. nginxのTFOキューは正確にはどういう意味ですか?キューがいっぱいになるとどうなりますか?値の設定はどの程度適切ですか?
    キューは、RFC7413のサーバーのセキュリティ保護メカニズムです。キューを超えるデータパケットは、通常のCookieなしの接続モードにダウングレードされます。つまり、TFO機能は失敗します。ただし、この値の特定の設定を決定するのは簡単ではありません。

7.参考資料

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

公開された59元の記事 ウォン称賛21 ビュー20000 +

おすすめ

転載: blog.csdn.net/tony_vip/article/details/105203109