読者です 読者をやめる 読者になる 読者になる

一汁三菜

インターネットのインフラよりな技術の話題、Web周りの技術的な話題、趣味のマラソン、旅行、その他日々の記録をしています。

RFC 7413: TCP Fast Open

TCP Fast OpenRFCになりました。RFCが発行されたばかりとはいえ、Linuxではバージョン3.6から実装されており、3.13からデフォルトで利用できるようになっているので、既に割と色んな所で使えるようになっているだろうと思います。

TCP Fast Openの仕組みは既に色んな所で解説されていて、日本語の記事も数多くあります。なのでここでは一言で表すことにすると、「最近TCPで通信したことがある相手とは、3-way handshakeの最中にデータのやり取りも併せて行ってしまう。*1」という事をする為の仕組みです。これにより、connection確立時の1 RTTを節約することが出来るというのがTCP Fast Openを利用する利点です。

もちろん通信路の確立は保証される必要があります。その為にTCP Fast Openでは次のような手法を用いています。1回目の3-way handshakeで、サーバーはクライアントに対してcookieを生成して返します。クライアント側ではそれをキャッシュしておきます。2回目以降の3-way handshakeではクライアントはSYNパケットと共にそのcookieを渡し、同時にpayloadをSYNパケットを通じて送信してしまいます。サーバーでは、cookieが正当な物であると確認出来た場合、クライアントから受け取ったpayloadを処理し、クライアントに送り返すべきレスポンスをpayloadに含めてクライアントにSYN-ACKと共に送信します。最後にクライアントからサーバーにACKを送信するのは通常のTCPの3-way handshakeと同じです。

なお、LinuxTCP Fast Openを使うには、カーネルコンパイル時にTCP Fast Openを有効にする必要があります。また、アプリケーション側でcookieを処理する為の対応を実装する必要があります。

*1:RFC 7413のAbstractから原文を引用すると、 "TFO allows data to be carried in the SYN and SYN-ACK packets and consumed by the receiving end during the initial connection handshake, and saves up to one full round-trip time (RTT) compared to the standard TCP, which requires a three-way handshake (3WHS) to complete before data can be exchanged."