<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>Network &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/network/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>通信キャリアプロフェッショナルが語るHTML5への期待「HTML5 Conference 2013」</title>
		<link>/miyuki-baba/4129/</link>
		<pubDate>Thu, 09 Jan 2014 01:00:13 +0000</pubDate>
		<dc:creator><![CDATA[馬場 美由紀]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[HTML5 Conference 2013]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[ネットワーク]]></category>

		<guid isPermaLink="false">/?p=4129</guid>
		<description><![CDATA[連載： HTML5 Conference 2013レポート (21)「HTML5 Conference 2013」ルーム5Cの最終セッションは「通信キャリアプロフェッショナルが語るHTML5への期待」と題したパネルディス...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conference-2013-2/" class="series-160" title="HTML5 Conference 2013レポート" data-wpel-link="internal">HTML5 Conference 2013レポート</a> (21)</div><p>「HTML5 Conference 2013」ルーム5Cの最終セッションは「通信キャリアプロフェッショナルが語るHTML5への期待」と題したパネルディスカッションが行われた。パネラーとして登壇したのはNTTコミュニケーションズの宮川晋氏（専門：バックボーンNW）、ソフトバンクモバイルの湧川隆次氏（専門：アクセスNW）、KDDIの藤井彰人氏（専門：クラウド基盤）の3人。コーディネータをNTTコミュニケーションズの小松健作氏が務めた。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/01/PB304717.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/01/PB304717.jpg" alt="PB304717" width="700" height="332" class="aligncenter size-full wp-image-4317" srcset="/wp-content/uploads/2014/01/PB304717.jpg 640w, /wp-content/uploads/2014/01/PB304717-300x142.jpg 300w, /wp-content/uploads/2014/01/PB304717-207x98.jpg 207w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>

<h2>これからのアプリ開発はネットワークの知識は欠かせない</h2>

<p>セッション開始にあたり、まず小松氏が同セッションの目的を紹介した。<br>
「HTML5の登場により、Webが進化しているのは承知のとおり。通信など他のレイヤーに影響を及ぼしている。つまりWebアプリ開発者も、キャリア通信のところで何が起きているか知らないとやっていけない状況になっている。またこれは逆もしかり。そこでまずキャリアプロフェッショナルに、今、通信のところでは何が起きているか語ってほしい」。こう口火を切り、宮川氏のプレゼンテーションが始まった。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/01/PB304614.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/01/PB304614.jpg" alt="PB304614" width="700" height="388" class="aligncenter size-full wp-image-4319" srcset="/wp-content/uploads/2014/01/PB304614.jpg 640w, /wp-content/uploads/2014/01/PB304614-300x166.jpg 300w, /wp-content/uploads/2014/01/PB304614-207x114.jpg 207w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>

<h2>アプリ屋さんはTCPより下を、IP屋さんはTCPより上を</h2>

<p>「私はIP屋なので、Webの世界は知らない」。開口一番そう話し、プロフィールの紹介を始めた宮川氏。同氏は会社での仕事のほか、RFC3769 Requirements IPv6　Prefix DelegationなどIPv6の規格の標準化・実用化に長らく携わっているという。<br>
「今日はIPネットワークに携わっている側から、HMTLをやっている皆さんに知っていただきたいこと、あるいは教えていただきたいことについて話をしたい」</p>

<p>こう前置きし、最初に宮川氏が紹介したのはIETFの「HourGlass（砂時計モデル）」図。同図では砂時計の真ん中部分がIPとなっており、IP屋さんはTCPより上については良くわからず、反対にアプリ屋さん（HTMLを書く人）はTCPより下については気にしなくてよかった。しかし「HTML5関連の技術であるSPDYやWebSocket、WebRTCなどが登場してからはそうも言っていられなくなった」という。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/01/Screenshot_14.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/01/Screenshot_14.jpg" alt="Screenshot_1" width="640" height="413" class="aligncenter size-full wp-image-4321" srcset="/wp-content/uploads/2014/01/Screenshot_14.jpg 640w, /wp-content/uploads/2014/01/Screenshot_14-300x193.jpg 300w, /wp-content/uploads/2014/01/Screenshot_14-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>CGN（Carrier Grade NAT）という技術がある。これは1つのグローバルアドレスを複数のユーザーで共用するという、IPv4延命のための技術だ。重要なのはCGNでは1台のマシンで使用できるTCPの数には限界があるということ。最近のWebアプリはAjaxを用いて多数のTCPを張り、表示の高速化を図っている。つまりたくさんのTCPを同時使用しているということ。このような状況下でCGNが導入されればCGNに多大な負荷と影響を及ぼすことになると予想できるという。もちろんIPv6化も検討が進められているが、「これも問題がないわけではない」と宮川氏は次の点を指摘する。</p>

<ul>
<li>SPDYやWebSocketなどとインフラとの親和性が本当にあるのか。</li>
<li>ファイアウォールやロードバランサーとかがうまく機能するのか</li>
<li>全部HTTPSになるとしたら、コンテンツの中身をプロバイダは見えなくなる。ISPはもう何もできなくなるがいいのか</li>
</ul>

<p>また今のネットワークはクライアント/サーバモデルに忠実なので、North-Southが太くてEast-Westはあまり考えていないつくりになっている。しかしこれからWebRTCが流行ったりすると、EW方向も重要になると思われる。</p>

<p>「アプリ屋さんと意見交換をしたい。現在、<a href="http://v6pc.jp/jp/index.phtml" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">V6協議会研究</a>で『IPv4枯渇に係るインターネット新技術導入に向けた検討WG』を運営している。一緒にやってくれる人を大募集している」</p>

<h2>IPv6は真のエンドツーエンド実現。だからIPの知識が必要</h2>

<p>続いて湧川氏が登壇。<br>
「キャリアという紹介があったが、実はソフトバンクモバイルに入ったのは今年4月。IETFでモバイルの標準化にずっと携わってきた。今日はHTML5のWebsocketやSPDYが、どうIPに影響するかというところから話をさせていただこうと思っている」。こう切り出し、湧川氏のプレゼンが始まった。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/01/PB304626.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/01/PB304626.jpg" alt="PB304626" width="700" height="339" class="aligncenter size-full wp-image-4324" srcset="/wp-content/uploads/2014/01/PB304626.jpg 640w, /wp-content/uploads/2014/01/PB304626-300x145.jpg 300w, /wp-content/uploads/2014/01/PB304626-207x99.jpg 207w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>

<p>今まではサーバーとマシンとのやり取りはHTTP1.1。複数のTCPでマルチにセッションを張り、各TCPが1つのやり取りをしてデータを落としてきた。これを効率化するために登場したのが、WebSocketである。これにより、一つのTCPパイプの中で複数のストリームを流せるようになった。そしてHTTP2.0では暗号化して仮想的なセッションでやり取りするという新しい動きが出てきている。</p>

<p>「しかし疑問もある」と湧川氏。それはTCPのLong-Livedセッションはモバイルには向かないのではということ。先述したように今までは一つのページに複数のTCPを張り、通信をしていたので非常に短いセッションですんだ。一方今はWebSocketのように1つのTCPに複数のストリームを流していくので、長い時間TCPのセッションを張ることになる。そうなるとモバイルはどうしても「パケ詰まりにより、無線の混雑が起きてしまう」と指摘する。またモバイルはハンドオーバーもある。「モバイルの場合、TCPのセッションを減らそうといっても、複数のセッションを張ることになると思う」と湧川氏。</p>

<p>一般的にキャリア側ではユーザーが便利に使えるよう、さまざまな施策を講じてきた。以下がそれだ。</p>

<ul>
<li>キャッシュ</li>
<li>CDN</li>
<li>オプティマイザー</li>
<li>フィルタリング</li>
<li>ファイアウォール</li>
<li>DPI（Deep Packet Inspection）</li>
<li>QoS</li>
</ul>

<p>今後、暗合化してエンドツーエンドで通信をするようになると、「キャリアができることはなくなる」と湧川氏は言う。つまりアプリケーションを書く人が用途と使える機能をきちんと理解して使うことが重要になるという。そしてIPv6が普及すると、真のエンドツーエンドが実現する。「すばらしい世界だが、大丈夫かどうか、注意が必要。ぜひアプリ開発者と議論していきたい」（湧川氏）。</p>

<h2>ネットワークのSDKもプログラムブルに</h2>

<p>最後に登壇したのは藤井氏。
「先の二人とはバックグラウンドがかなり違う」
プレゼン冒頭でこう切り出し、藤井氏のプレゼンが始まった。同氏がGoogleからKDDIに転職したのは今年の4月で、MashupやWebAPIでアプリケーションを作っていくことに関心を抱いているという。KDDIではクラウド基盤のサービスの企画を担当している。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/01/PB304656.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/01/PB304656.jpg" alt="PB304656" width="700" height="405" class="aligncenter size-full wp-image-4326" srcset="/wp-content/uploads/2014/01/PB304656.jpg 640w, /wp-content/uploads/2014/01/PB304656-300x173.jpg 300w, /wp-content/uploads/2014/01/PB304656-207x119.jpg 207w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>

<p>「HTML5はモバイル、ウェアラブル、クラウドへ転換していく」と藤井氏。そのときにクラウドの基盤とアプリケーションの配信基盤が今後、どうなっていくのか、そこに関心があるという。データセンターなどのインフラとアプリケーション開発基盤がセットになったものがどんどん登場している。その例として藤井氏が挙げたのが、Facebookのデータセンターのハードウェア設計をオープンソース化する「Open Compute Project」やAmazonの「AWS SDK for JavaScript」。「インスタンスを追加したりロードバランスの設定を変えたり、ということがAWSで動的に変えていける時代になっている」（藤井氏）</p>

<p>Webアプリケーションの基盤としてのPaaS、BaaS、MEAP（モバイル・エンタープライズ・アプリケーション・プラットフォーム）なども登場している。</p>

<p>「ネットワークのSDKのところがプログラムブルになるなど、Webアプリ開発者もアプリだけをみていれば良いという時代は終わったと言える。どんなクラウド、開発基盤を求めていくのか。Webアプリ開発者のその分野への自由な進撃が始まる」（藤井氏）</p>

<p>3人のプレゼンが終了し、コーディネータの小松氏は「これからのWebアプリケーション開発では、ネットワークやクラウドなどの知識もなければ難しくなる。そのための取り組みとしてキャリア側で用意していることやアプリ開発者に期待していることが教えてほしい」と問いかけた。</p>

<p>「2015年11月にIETFの会合が横浜で開催される。しかもW3CのTPACとの同時開催を今、画策している。この同時開催の裏側にあるのは、インフラとアプリがバラバラで開催することに限界がきているから。お互いにセッションし合わなければならないほど、深刻な事態に突入してきている。これは逆にビジネスチャンスでもある。IETFやTPACで何かしようとしたら2年ぐらいかかるので、『こういうアイデアがあるんだけど』という人がいれば、どんどん発信してほしい。そして2年後の横浜で世界に向かって成果として出す。これはすごいバリューになる」（宮川氏）</p>

<p>「アプリ開発側からネットワークの方にもっと寄ってきて欲しい。要求仕様を出してもらえると、私たちができることはまだまだ一杯ある。アプリ開発側がどういうところに問題を感じているかをぜひ、教えて欲しい」（湧川氏）</p>

<p>「ネットワークやクラウドを含め、すべてがプログラムできるような世界がくる。それを考慮に入れたアプリケーションの開発やアーキテクチャの作り方をしていってほしい。また先述したようにさまざまなインフラのサービスが登場しているので、それを使い分けていくのも面白いと思う。そのためにも、ほかのレイヤーの知識を身につけてほしいですね」（藤井氏）</p>

<h2>ネットワークの知識は欠かせない</h2>

<p>藤井氏の話に付け足す形で宮川氏はジュニパーネットワークスがこの秋に発表したOSSプロジェクト「OpenContrail」を紹介。同プロジェクトではApache License 2.0で利用できる SDNコントローラ、仮想ルータ、オーケストレーションAPI、アナリティクス、管理コンソールなど、データセンターのオーバーレイを実行するのに必要なすべてのコンポーネントを提供している。</p>

<p>また同プロジェクトではXMPPというチャットで使われるプロトコルを採用していることから、「例えば30分だけより大きな帯域を確保したいというと、15分後にそれが実現する、ということもできるようになるかも」と、アプリ側でできることの広がりを示唆した。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/01/PB304674.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/01/PB304674.jpg" alt="PB304674" width="700" height="383" class="aligncenter size-full wp-image-4328" srcset="/wp-content/uploads/2014/01/PB304674.jpg 640w, /wp-content/uploads/2014/01/PB304674-300x164.jpg 300w, /wp-content/uploads/2014/01/PB304674-207x113.jpg 207w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>

<p>アプリ開発者にとってネットワークの知識がこれから大事になることを改めて実感できた同セッション。「HTML5の普及でネットワークへの敷居は下がってきている。Googleなども遅延をなくそうといろんな仕掛けに取り組んでいる。ぜひ、みなさんもネットワークを武器にしてこれからのアプリ開発に生かしてほしい」（湧川氏）、「HTML5だけに小さくまとまってしまうのではなくて、ネットワークとクラウドのところにも興味を広げ、大きな可能性を探ってほしい」（藤井氏）と呼びかけ、セッションは終了した。</p>

<p><DIV align=right></p>

<p style="padding-top: 16px; line-height: 1.55; color: #60aa2a;">（レポート：中村仁美／撮影：斉藤和佳子）</p>

<p></div></p>

<p>【講演資料・セッション映像】</p>

<iframe width="560" height="315" src="//www.youtube.com/embed/lOQEYrTIaI4" frameborder="0" allowfullscreen></iframe>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2013レポート]]></series:name>
	</item>
		<item>
		<title>TCP Fast Open – Webを速くするためにGoogleがやっていること Make the Web Faster 4 &#8211;</title>
		<link>/jxck/3529/</link>
		<pubDate>Tue, 10 Dec 2013 01:00:14 +0000</pubDate>
		<dc:creator><![CDATA[Jxck]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">/?p=3529</guid>
		<description><![CDATA[連載： Make the Web Faster (4)HTTPは、その下層にあたるトランスポートレイヤーのプロトコルとして、通常TCPを使用します。 したがって、TCPのレイヤで速度が改善することは、そのままWebの高速...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/web-faster/" class="series-153" title="Make the Web Faster" data-wpel-link="internal">Make the Web Faster</a> (4)</div><p>HTTPは、その下層にあたるトランスポートレイヤーのプロトコルとして、通常TCPを使用します。
したがって、TCPのレイヤで速度が改善することは、そのままWebの高速化につながる可能性があるといえます。</p>

<p>GoogleはWebを速くするための活動として、TCPのようなプロトコルレイヤの改善にも取り組んでいます。
今回はその中の一つ、TCP Fast Openを取り上げ、解説と動作検証、簡単なベンチマークを行います。
検証環境等は最下部に記載します.</p>

<p><a href="https://developers.google.com/speed/protocols/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Make the Web Faster</a>: <a href="http://tools.ietf.org/html/draft-ietf-tcpm-fastopen" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TCP Fast Open</a></p>

<!-- more -->

<h2>3 Way Handshake</h2>

<p>TCPは、「正確、確実にデータを届ける」ことを重視した設計になっています。
特に接続確立時には、双方の状態をきちんと確認しながら実施するための <em>3 Way Handshake</em> (以下3WH)という方式を採用しています。</p>

<p>例えば、クライアントがサーバに対してHTTPリクエストを送信したい場合は、以下のような流れになります。</p>

<p><img src="/wp-content/uploads/2013/12/tfo-3wh.png" alt="3 Way Handshake" /></p>

<p>クライアントは、3WHが終わってはじめてHTTPリクエストを送信できるため、HTTPのリクエストを送るまでにはTCPのレイヤで三回の通信が必要になります。
HTTPでは、Keep-AliveなどでTCPコネクションを使いまわすこともできますが、それでも切断と接続の頻度は多いのが現状です。</p>

<p>そこで、3WHの通信を「<a href="https://html5experts.jp/jxck/1415/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">なるべく少なく</a>」することで、接続確立の高速化を図る方法が、今回紹介する <em>TCP Fast Open</em> (以下TFO)です。</p>

<h2>なぜ3WHを使うのか</h2>

<p>わざわざ三回も通信を行う3WHを用いる理由はいくつかありますが、その一つとして、クライアントIPの確認があります。</p>

<p>クライアントSYNが含まれるパケットにはクライアントのIPアドレスが載るため、サーバはそのアドレスにレスポンスを返すのですが、このIPは簡単に偽装することができます。</p>

<p>そこで、HTTPのやりとりに移る前に、クライアントのアドレスに対してサーバからもSYNを送ります。
もしこのとき、アドレスが偽装されたものであった場合、その機器が実在したとしてもサーバからのSYNは無視されるため、HTTPのやりとりに移る前にアドレスが正しいことを確認できるのです。</p>

<h2>TCP Fast Open</h2>

<p>TFOは、簡単に言えばTCPレイヤでCookieを用いることで、すでに接続を確立したことがあるIPアドレスのホストに対しては、3WHを簡略化するという方式です。</p>

<p>Cookieを用いるため、まったく初めて接続する(Cookieを保持していない)ホストに対しては通常の3WHを実行し、その時ホストがCookieを発行します。
二回目以降の接続確立では、クライアントはそのCookieをサーバに送信するという流れになります。</p>

<p>では、通信の詳細を見てみましょう。</p>

<p>次に解説する流れは、TCPコネクションを確立した後にHTTPのGETリクエストを発行し、レスポンスを受け取るところまでの範囲とします。
この時、HTTPのリクエストの受信、レスポンスの送信はサーバの責務ですが、リクエストデータを処理しレスポンスデータを生成するのは、アプリレイヤの責務であるという前提を踏まえて読んでください。</p>

<h3>最初の接続</h3>

<p>この時点ではサーバとクライアントが有効なCookieをお互いに保存していません。</p>

<p><img src="/wp-content/uploads/2013/12/tfo-flow-1.png" alt="TCP Fast Open 1" /></p>

<ol>
<li>クライアントは、SYNに <em>Fast Open Cookie</em> オプションにCookie Requestをつけて送信する。</li>
<li>サーバは、 <em>TFO-Cookie</em> を生成し、それをFast Open CookieオプションにつけたSYN-ACKを送信する。</li>
<li>クライアントは、TFO-Cookieをキャッシュする。</li>
<li>クライアントは、ACKを返し、通常の接続確立を終える。</li>
<li>クライアントは、HTTP GETリクエストを送信する。</li>
<li>サーバは、HTTP GETクエストをアプリレイヤに渡し、アプリが生成したレスポンスデータをレスポンスとして送信する。</li>
</ol>

<p>通常の3WHと違うのは、SYNとSYN-ACKにFast Open Cookieオプションが付く点です。 通信の回数は三回と変わりません。
また、最初のSYNを受け取ったサーバがTFOに対応していない場合、サーバはオプションを無視して通常の3WHが実行(フォールバック)されます。
HTTPの通信は3WHが完全に終わった後になります。</p>

<p>ここでサーバが生成するTFO-Cookieは、クライアントのIPをベースにします。
クライアントはこのTFO-Cookieを、次回以降の接続で仕様するためにキャッシュします。</p>

<h3>次回以降の接続</h3>

<p>サーバとクライアントが有効なCookieをお互いに保持している状態です。</p>

<p><img src="/wp-content/uploads/2013/12/tfo-flow-2.png" alt="TCP Fast Open 2" /></p>

<ol>
<li>クライアントは、SYNパケットにキャッシュしたTFO-CookieとHTTP GETのリクエストデータを含めて送信する。</li>
<li>サーバは、TFO-Cookieを受け取る。この時初回接続で生成した方法と同じようにSYNからTFO-Cookieを生成し、受け取ったTFO-Cookieと比較する。同じであればTFO-Cookieは正しいものであり、同時にクライアントのIPは偽装されていないことがわかる。</li>
<li>TFO-Cookieが正しいことを確認したら、サーバはリクエストデータをアプリケーションレイヤに渡す。クライアントにはSYN-ACKを返すが、もしHTTPレスポンスデータが準備できていればSYN-ACKに載せることも可能。</li>
<li>アプリレイヤがHTTPレスポンスデータを生成し終えたら、サーバはそれをクライアントに送信する。</li>
<li>クライアントは、ACKを送信する。</li>
</ol>

<p>通常の3WHと違うのは、SYNに初回接続でキャッシュしたTFO-CookieとHTTP GETのリクエストデータが付くことです。
サーバはTFO-Cookieを元に、クライアントがIPを偽装していないかを知ることができるので、正しいIPであればその後のクライアントからのACKがくる前にGETのデータをアプリのレイヤに渡してしまいます。
アプリから見れば一回の通信で、リクエストデータを取得したのと同等の状態になります。</p>

<p>また、TFOは3WHの省略と解説されることが多いですが、実際にはサーバは従来どおりSYN-ACKを返し、クライアントも最後のACKをきちんと送ります。
ただし、もしアプリが生成したレスポンスデータがサーバに届いたらSYN-ACKに載せて返すこともできますし、SYN-ACKを先に返しておいて別途送ることもできます。
最後のクライアントACKを待たずにレスポンスを開始できるのが、3WHを短縮するからくりになっているのです。</p>

<p>もし、サーバがTFOに対応していなかったりクライアントのTFO-Cookieが無効と判断された場合は、通常の3WHにフォールバックされ、通常のフローでHTTPのGETが行われます。</p>

<h3>TFO-Cookie</h3>

<p>TFO-CookieはクライアントのIPを保証できなければなりませんが、その生成アルゴリズムは仕様では定義されておらず、実装依存です。
参考までにLinux Kernel 3.11では、以下のようにクライアント/サーバ双方のIPアドレスを暗号化して生成しています。</p>

<p><a href="http://lxr.linux.no/linux+v3.11/net/ipv4/tcp_fastopen.c#L67" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://lxr.linux.no/linux+v3.11/net/ipv4/tcp_fastopen.c#L67</a></p>

<p>IPアドレスを元に生成しているため、クライアントのIPが変わるとCookieが無効になることを意味します。</p>

<h2>注意点</h2>

<h3>Intermedialies(中間サーバ問題)</h3>

<p>こうしたネットワークプロトコルの改善には、必ずIntermedialies(middleboxともいう)と呼ばれる中間サーバが問題になります。
具体的にはプロトコルをいじることで、NATやFWなどが通信を不正と見なして遮断したり、内容を書き換えてしまう問題です。</p>

<p>TFOの場合は、NATでアドレスが書き換わる状況などではCookieが不正とみなされ、TFOが成功しない可能性が考えられます。
しかし、問題があれば通常の3WHへのフォールバックによって、通信を続行することができるよう設計されているため、この問題は最小限に抑えられています。</p>

<p>ただし、リクエストデータを付与したSYNが拒否され、3WH成立後に改めてリクエストを送信する場合は、リクエストデータが二重に送信されるためオーバーヘッドになる可能性があります。</p>

<h2>導入方法</h2>

<p>TFOはクライアントAPIがLinux kernel 3.6に、サーバAPIが3.7にマージされています。
執筆時点ではWindowsおよびMac OSでは使用することができません。</p>

<p>TFOを有効にするには、設定ファイルにフラグを立て、ソケットプログラムにおいて適切なシステムコールを呼ぶ必要があります。</p>

<h3>サーバ</h3>

<p>サーバでは、生成したソケットをバインドした後に、setsocketopt(2)を用いてTCP_FASTOPENオプションを付与する必要があります。
qlenの値は、TFOによって3WHが終了していないソケットのキューサイズです。</p>

<p></p><pre class="crayon-plain-tag">s = socket(AF_INET, SOCK_STREAM, 0);   // ソケットの生成

bind(s, ...);                          // アドレスへのバインド

int qlen = 5;
setsockopt(s, SOL_TCP, TCP_FASTOPEN, &amp;qlen, sizeof(qlen)); // TCP_FASTOPEN オプションの設定

listen(s, ...);                        // ソケットのリッスン</pre><p></p>

<h3>クライアント</h3>

<p>クライアントでは、生成したソケットに対するconnect(2)とsend(2)の代わりに、sendto(2)を使用してデータを送信します。
これは通常UDP通信などで使用されるシステムコールですが、TFOでは3WHが終了していない状態でのデータ送信が必要なため、これを用います。</p>

<p>このsendto(2)は、初回接続時はTFO-Cookie Requestを送信し、既にCookieがある場合はそれを使用してSYNにデータを載せて送信を行います。</p>

<p></p><pre class="crayon-plain-tag">// ソケットに対する connect(2) + write(2) の代わりに sendto(2) を使用
sendto(s, data, data_len, MSG_FASTOPEN,
    (struct sockaddr *) &amp;server_addr, addr_len);

// 以降の送受信は通常どおり read(2)/write(2) を使用</pre><p></p>

<h3>設定</h3>

<p>Linux KernelではTFOの設定ファイルとして  <em>/proc/sys/net/ipv4/tcp_fastopen</em> が用意されています。
このファイルにはビットでクライアント/サーバごとに有効/無効の設定が可能です。
Linux Kernelでは以下の設定値が定義されています。</p>

<p><code>0x0: 無効
0x1: クライアントのみ有効
0x2: サーバのみ有効
0x3: クライアント/サーバともに有効
0x4: CookieがなくてもSYNでデータを送信
0x100: Cookie を検証せずにデータの載ったSYNを受け入れる
0x200: Cookie オプションがなくてもSYNにデータを載せる
0x400/0x800: TCP_FASTOPENオプションを設定してないソケットでもTFOを有効にする。
</code></p>

<h2>実装</h2>

<p>簡単なTFOサーバとクライアントのスクリプトを作成して、パケットの流れを確認してみます。
現時点で言語レベルでTFOをサポートしているものは少ないため *1、Pythonで直接システムコールを呼ぶスクリプトを使用します。</p>

<p><a href="https://gist.github.com/Jxck/7854971" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">python sample code (gist)</a></p>

<p>クライアントは &#8220;hello\n&#8221; を二回送信し、サーバはそれをエコーバックします。
二台のマシン(MacOS)上のVartual Box上のUbuntuで実行します。</p>

<p></p><pre class="crayon-plain-tag"># server
$ sudo python server.py # listen port 80
# client
$ python client.py 192.168.1.10 # server address</pre><p></p>

<p>実行結果をWiresharkで確認します。</p>

<p><img src="/wp-content/uploads/2013/12/tfo-python-1.png" alt="1st Connection" /></p>

<p>最初のClient SYNにFast Open Cookie Requestが付き、SYN ACKでFast Open Cookiが付与されていることがわかります。
データは別のパケットで送られています。</p>

<p><img src="/wp-content/uploads/2013/12/tfo-python-2.png" alt="2nd Connection" /></p>

<p>二回目のClient SYNには、このCookieとデータが一緒に載っています。
しかもサーバはSYN ACKを返した後に、サーバのACKを待たずにデータを返しています。
正常に動いていることがわかりますね。</p>

<h2>ApacheとChrome</h2>

<p>ApacheやNginxなどはまだTFOに対応していませんが、kernel側でリスニングソケットにTFOを強制するオプションがあるので、それを使用して検証します。
また、最新のChromeはTFOに対応しているため(OSもTFO対応が必要) 、これをクライアントとして利用します。</p>

<p>まず、サーバ側でTFO強制の設定をしApacheをインストールします。</p>

<p></p><pre class="crayon-plain-tag">$ echo 0x403 | sudo tee /proc/sys/net/ipv4/tcp_fastopen
$ sudo apt-get install apache2</pre><p></p>

<p>クライアント側は最新のchromeを用意し <a href="chrome://flags" data-wpel-link="internal">chrome://flags</a> で &#8220;TCP Fast Openを有効にする&#8221; を設定します。</p>

<p>この状態でChromeからapacheのデフォルトページに二回アクセスします。
Chromeは、一回目のGETでCookieをリクエストし、二回目のGETでSYNにCookieとリクエストヘッダを載せて投げています。</p>

<p><img src="/wp-content/uploads/2013/12/tfo-apache-chrome.png" alt="Apache-Chrome" /></p>

<p>同様の方法を使えば、設定ファイルを書くだけで既存のサーバをTFOに対応させることができるでしょう。
しかし、このオプションはあくまでもテスト目的に使用するもので、本番運用ではkernel APIレベルで対応したものを使用するべきです。</p>

<h2>ベンチマーク</h2>

<p>TFOはRTTが大きい環境でこそ効果が期待されます。そこでAWSを用いて、Tokyoリージョンをクライアント、N.Virginiaリージョンをサーバとし、ベンチマークをとってみます。使用するAMIは以下です。(インスタンスにはElastic IPをふっています)</p>

<ul>
<li>TOKYO: ubuntu-raring-13.04-amd64-server-20130820(ami-0b8c1f0a)</li>
<li>N.Virginia: ubuntu-raring-12.04-amd64-server-20130820(ami-77fcbc1e)</li>
</ul>

<p>サーバにはApacheを、クライアントはTFOに対応している<a href="http://www.vanheusden.com/httping/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Httping</a>を用いて十回のリクエストを投げる簡単なベンチを行います。</p>

<p></p><pre class="crayon-plain-tag">$ echo 3 | sudo tee /proc/sys/net/ipv4/tcp_fastopen
$ wget http://www.vanheusden.com/httping/httping-2.3.3.tgz
$ tar zxvf httping-2.3.3.tgz
$ cd httping-2.3.3.tgz
$ ./configure --with-tfo # TFO を有効にしてビルド
$ make
$ ./httping -g http://192.0.2.0/ -c 10    # TFO off
$ ./httping -g http://192.0.2.0/ -c 10 -F # TFO on</pre><p></p>

<h3>結果</h3>

<p><code># TFO off
10 connects, 10 ok, 0.00% failed, time 13830ms
round-trip min/avg/max = 344.7/382.6/424.2 ms</p>

<h1>TFO on</h1>

<p>10 connects, 10 ok, 0.00% failed, time 12052ms
round-trip min/avg/max = 161.8/204.9/364.2 ms
</code>
(TFO onのパターンは、最初の一回はCookie Requestです)</p>

<p>この検証では、RTTは平均で46%短くなっている事がわかります。</p>

<h2>まとめ</h2>

<p>TFOは、まだドラフトの段階で実装も限られていますが、仕様が固まればサーバやOSも対応が進むと考えられます。
各言語の標準ソケットモジュールレベルでの対応も少しずつ進んでいるため、今後は普通にネットワークプログラムを書けば自動的にTFO対応されるでしょう。</p>

<p>注意点として、通常の3WHにフォールバックした場合にリクエストデータが二重になる可能性がありますが、
一方で通信を「<a href="https://html5experts.jp/jxck/1415/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">なるべく少なく</a>」することによる効果は非常に大きいため、そことのトレードオフとなるでしょう。</p>

<p>普及にはまだ時間がかかるかもしれませんが、今のうちから自身のもつサービス検証をしてみてはいかがでしょうか。</p>

<h2>検証環境</h2>

<ul>
<li>Ubuntu 13.10</li>
<li>kernel 3.11.0-13-generic</li>
<li>Python 2.7.3</li>
<li>Wireshark 1.10.2</li>
<li>HTTPing 2.3.3</li>
<li>Google Chrome 32(beta)</li>
</ul>

<ol>
<li>いくつかの言語は導入に関する議論やパッチを見つけたので載せておきます。  <a href="https://bugs.ruby-lang.org/issues/8897" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ruby</a>, <a href="https://codereview.appspot.com/27150044/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Go</a>, <a href="https://groups.google.com/forum/#!topic/python-ideas/HOpnV_tyt0g" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Python</a></li>
</ol>
]]></content:encoded>
		
		<series:name><![CDATA[Make the Web Faster]]></series:name>
	</item>
		<item>
		<title>Intro – Webを速くするためにGoogleがやっていること Make the Web Faster 00 &#8211;</title>
		<link>/jxck/1415/</link>
		<pubDate>Thu, 22 Aug 2013 23:20:07 +0000</pubDate>
		<dc:creator><![CDATA[Jxck]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">/?p=1415</guid>
		<description><![CDATA[連載： Make the Web Faster (1)今回から数回にわたって、Googleが進める&#8221;Make the Web Faster&#8221; というプロジェクト(以下、プロジェクト)について、プロ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/web-faster/" class="series-153" title="Make the Web Faster" data-wpel-link="internal">Make the Web Faster</a> (1)</div><p>今回から数回にわたって、Googleが進める&#8221;Make the Web Faster&#8221; というプロジェクト(以下、プロジェクト)について、プロジェクトにリストされたGoogleのプロダクトや仕様提案、ベストプラクティスなどを連載形式で紹介していきます。</p>

<!-- more -->

<h2>Make the Web Faster</h2>

<p><a href="https://developers.google.com/speed/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">&#8220;Make the Web Faster&#8221;</a> のページには、文字通り Google が 「Webを速くするため」に開発したプロダクトや、新しい仕様の提案、ベストプラクティスなどがリストされています。</p>

<p>例えば以下のようなものがあります。</p>

<ul>
<li>WebP</li>
<li>TCP Fast Open</li>
<li>Google DNS</li>
<li>Google Hosted Libraries</li>
<li>Page Speed</li>
<li>SPDY</li>
<li>etc.</li>
</ul>

<p><a href="https://developers.google.com/speed/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/08/shoto1.jpg" alt="shoto1" width="640" height="425" class="aligncenter size-full wp-image-1579" srcset="/wp-content/uploads/2013/08/shoto1.jpg 640w, /wp-content/uploads/2013/08/shoto1-300x199.jpg 300w, /wp-content/uploads/2013/08/shoto1-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>この連載では、そこから特に重要なものを、筆者の気の向いた順に紹介していきます。</p>

<p>そして、連載初回の今日は、これら &#8220;Make the Web Faster&#8221; を紹介するにあたり、共通して押さえておくべき基本知識について紹介します。</p>

<h2>Web というターゲット</h2>

<p>プロジェクトには様々な手法がリストされていますが、全てに共通するのは「Webの高速化」を目的としている点です。対象がWebであるために、共通するチューニングの観点としては大きく「ネットワーク」と「アプリケーション」の2つが考えられます。</p>

<h2>ネットワークのチューニング</h2>

<p>Web はネットワークへのアクセスを伴います。ネットワークを効率よく使うことは、パフォーマンスの改善を試みる上で非常に重要です。</p>

<p>まずは、一番簡単な原則としてこれだけは覚えておいてください。</p>

<h3>なるべく小さく</h3>

<p>Webは、HTML,CSS,JS,画像,動画などのデータをネットワーク経由でクライアントに届けています。このデータが小さければ小さいほど、速く届けることができます。特に画像や動画はサイズが大きくなりがちです。送る上でなるべく小さくするにはどうするか、ここで圧縮などの技術が有効になります。</p>

<h3>なるべく少なく</h3>

<p>ネットワークアクセスの回数が増えるほどオーバーヘッドが大きくなるため、極力少ない方が望ましいです。アクセス回数を減らす工夫や、プロトコル仕様レベルの改善などがあります。</p>

<h3>なるべく近く</h3>

<p>ネットは世界の裏側でも簡単にデータを届けることができますが、遠ければそれだけ遅くなってしまいます。しかし、コンテンツの種類によっては、ユーザに近いところにそれを配置するなど、工夫できるところがあります。</p>

<p>他にも HTTP と TCP についての基本的な知識が必要な回もあります。そうした場合は、<a href="http://www5e.biglobe.ne.jp/%257eaji/3min/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">3 Minutes Networking</a> や、現在執筆が進んでいる <a href="http://chimera.labs.oreilly.com/books/1230000000545" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">High Performance Browser Networking</a> などが参考になるでしょう。(この本はすでにHTTP2.0など最新のトピックも扱っています。)</p>

<h2>アプリケーションのチューニング</h2>

<p>WebでAPIを用意して、リクエストに対するJSONを返すだけのサービスなら、純粋にレスポンスにかかる時間(いかに早くJSONを返すか)に集中してチューニングすれば良いかもしれません。</p>

<p>しかし、 多くの場合Webはクライアントとして「ブラウザ」が前提になります。また、ブラウザは基本的に人間が使うものです。従って、以下のような観点もチューニングには必要になってきます。</p>

<h3>ブラウザの挙動</h3>

<p>ブラウザがどのようにリクエスト/レスポンスを処理するかといった挙動を理解することは重要です。そこを理解しないと、効率よくブラウザにコンテンツを届けられず、思ったような速度が得られない場合があります。</p>

<h3>人間への視覚フィードバック</h3>

<p>ブラウザを使って人間が操作することを想定しているならば、視覚的なフィードバックを調整することで「速いと感じる」という観点からチューニングするアプローチもあります。実際、純粋なレスポンスタイムの短縮が限界にきたら、こうした観点のチューニングは避けては通れないでしょう。</p>

<p>こうしたベストプラクティスについては、<a href="http://www.amazon.co.jp/dp/487311361X" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ハイパフォーマンスWebサイト</a> で「14のルール」としても紹介され、 <a href="http://www.amazon.co.jp/dp/4873114462" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">続・ハイパフォーマンスWebサイト</a> では、そこにモダンな技術も追加されています。両方を手元に置いておくことをお勧めします。</p>

<h2>「推測するな、測定せよ」</h2>

<p>「推測するな、測定せよ」という言葉があります。全てのチューニングは、ボトルネックの把握が必要です。やみくもにチューニングすればいいというものではありません。場合によっては遅くなるケースも考えられます。</p>

<p>この連載では、テーマごとに「なぜそれらが作られたのか」を重視して解説します。そこから学べるものが多いからです。しかし、筆者は連載を通して、「入れると速くなるから、今すぐ入れましょう！」などというつもりは一切ありません。</p>

<p>もし、紹介したものから何かを導入するのであれば必ず測定をし、効果と対応クライアントなどをきちんと確認した上で、自己責任で進めて下さい。
また導入した場合は、ノウハウや効果をBlogなどで是非公開してください。それは貴重な情報であり、 &#8220;Make the Web Faster&#8221; にとって大きな貢献になります。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Make the Web Faster]]></series:name>
	</item>
	</channel>
</rss>
