<?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>HTTP &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/http/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>「WebSocket, WebRTC, Socket API, &#8230; 最新Webプロトコルの傾向と対策」HTML5 Conference 2013 セッションレポート</title>
		<link>/yosssi/3424/</link>
		<pubDate>Thu, 12 Dec 2013 01:00:25 +0000</pubDate>
		<dc:creator><![CDATA[吉田 啓二]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[HTML5 Conference 2013]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[TCP]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[spdy]]></category>

		<guid isPermaLink="false">/?p=3424</guid>
		<description><![CDATA[連載： HTML5 Conference 2013レポート (1)2013年11月30日（土）に開催された「HTML5 Conference 2013」の、エヌ・ティ・ティ・コミュニケーションズ株式会社・小松健作さんによ...]]></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> (1)</div><p>2013年11月30日（土）に開催された「<a href="http://events.html5j.org/conference/2013/11/" title="HTML5 Conference 2013" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">HTML5 Conference 2013</a>」の、エヌ・ティ・ティ・コミュニケーションズ株式会社・小松健作さんによるセッション「WebSocket, WebRTC, Socket API,&#8230;最新Webプロトコルの傾向と対策」の内容をご紹介します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/12/Screen-Shot-2013-12-05-at-15.25.13.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/Screen-Shot-2013-12-05-at-15.25.13-1024x562.png" alt="html5conference-report-web-protocol-01" width="1024" height="562" class="aligncenter size-large wp-image-3429" srcset="/wp-content/uploads/2013/12/Screen-Shot-2013-12-05-at-15.25.13-1024x562.png 1024w, /wp-content/uploads/2013/12/Screen-Shot-2013-12-05-at-15.25.13-300x164.png 300w, /wp-content/uploads/2013/12/Screen-Shot-2013-12-05-at-15.25.13-207x113.png 207w, /wp-content/uploads/2013/12/Screen-Shot-2013-12-05-at-15.25.13.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>

<h2>最新のWebプロトコルが続々と誕生</h2>

<p>1990年から10年間ほどは、HTTPというたった一つのプロトコルが、Web通信用のプロトコルとして使われていました。その後、HTML5という言葉が出てきてから、WebSocketやSPDY、HTTP/2.0、WebRTC、Raw Socket API、SCTP over UDP、QUICといった、新しいプロトコルが続々と誕生してきました。この4年間ほどで、これらの多くのプロトコルが誕生してきた背景・理由をこれから説明します。</p>

<h2>HTTPの仕組みと問題</h2>

<p>約20年間に渡り、Webを支え続けているHTTPの仕組みをまずは説明します。HTTPは非常に単純なプロトコルで、ブラウザ・サーバ間でリクエスト・レスポンスがやり取りされる仕組みとなっています。例えば、ブラウザから「index.htmlがほしい」とサーバへリクエストを送信すると、サーバからそのHTMLファイルがレスポンスとして送信されます。その後、ブラウザから「CSSがほしい」とサーバへリクエストを送信すると、またサーバからレスポンスが返ってくるという流れになります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/12/web-131202044252-phpapp01.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/web-131202044252-phpapp01.jpg" alt="html5conference-report-web-protocol-02" width="520" height="390" class="aligncenter size-full wp-image-3442" style="border: 1px solid #000000" srcset="/wp-content/uploads/2013/12/web-131202044252-phpapp01.jpg 640w, /wp-content/uploads/2013/12/web-131202044252-phpapp01-300x225.jpg 300w, /wp-content/uploads/2013/12/web-131202044252-phpapp01-207x155.jpg 207w" sizes="(max-width: 520px) 100vw, 520px" /></a></p>

<p>ここで問題となるのが、<strong>ブラウザがサーバへリクエストを送信してレスポンスが返ってくるまでの間、ブラウザが次のリクエストを送信できない</strong>ということです。この待ち時間をRound Trip Timeと言いますが、例えばこれが100ミリ秒だとすると、全て合計するとこの時間だけで1～2秒かかる場合があります。この状況を改善するために、<strong>TCPの接続を複数張り、同時に複数のリクエストを送信する</strong>という方法があり、これが今のHTTPのメジャーな使用方法となっています。この方法で改善はするのですが、例えばChromeですとブラウザから同一のサーバに対しては、同時に6つまでしかリクエストを送信できないという制限があり、どうしても待ち時間が発生してしまいます。</p>

<p>このような制限がある中でWebサービスのレスポンス性を高めるために、<strong>やり取りされる複数のリソースを一つにまとめて、リクエスト・レスポンスの回数を減らす</strong>という方法があります。具体的な方法の一つとして、複数の画像ファイルを一つのファイルにまとめるCSS Spritesという手法があります。ただし、Twitterのアイコンなど、リクエストによって動的に表示させる画像を変更しなければならない状況では、このような手法を使うことはできません。このような課題があり、そもそも開発者側でこのようなパッキング・テクニックを使わなくても済むように、複数のリソースをまとめるための一般的な方法が求められるようになりました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/12/html5conference-report-web-protocol-03.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/html5conference-report-web-protocol-03.jpg" alt="html5conference-report-web-protocol-03" width="520" height="390" class="aligncenter size-full wp-image-3456" style="border: 1px solid #000000" srcset="/wp-content/uploads/2013/12/html5conference-report-web-protocol-03.jpg 640w, /wp-content/uploads/2013/12/html5conference-report-web-protocol-03-300x225.jpg 300w, /wp-content/uploads/2013/12/html5conference-report-web-protocol-03-207x155.jpg 207w" sizes="(max-width: 520px) 100vw, 520px" /></a></p>

<h2>複数のリソースを一つにまとめるSPDY</h2>

<p>複数のリソースを一つにまとめて通信するプロトコルとして、SPDYがあります。SPDYでは、一つのTCP接続の中で、複数のリクエストを送信することができ、これによって高速化が図られています。</p>

<p>ただし、常にSPDYを使用すればよいというわけではありません。ネットワークの遅延がない状況ですと、SPDYの方がHTTPSよりも常に速いのですが、ネットワークの遅延が100ミリ秒ある状況ですと、HTTPSの方がSPDYよりも速くなります。そして、通信するリソースサイズが大きくなればなるほど、その通信速度の差は大きくなります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/12/html5conference-report-web-protocol-04.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/html5conference-report-web-protocol-04.jpg" alt="html5conference-report-web-protocol-04" width="520" height="390" class="aligncenter size-full wp-image-3462" style="border: 1px solid #000000" srcset="/wp-content/uploads/2013/12/html5conference-report-web-protocol-04.jpg 640w, /wp-content/uploads/2013/12/html5conference-report-web-protocol-04-300x225.jpg 300w, /wp-content/uploads/2013/12/html5conference-report-web-protocol-04-207x155.jpg 207w" sizes="(max-width: 520px) 100vw, 520px" /></a></p>

<p>TCPには<strong>Long Fat Pipe</strong>という問題があります。TCPでデータをダウンロードする際は、データが複数の小さいパケットに分割されてサーバからブラウザへ送られます。ブラウザは、ある程度パケットをダウンロードすると、サーバへACK（Acknowledgement：受信応答）を送信し、サーバはブラウザからのACKを受信することで、次のデータをブラウザへ送信します。ここで、<strong>サーバが、ブラウザからのACKを受信するまで次のデータを送信することができない</strong>という問題があります。そのため、レイテンシが増えるにつれて、ブラウザからのACKの待ち時間が増えることになります。これがLong Fat Pipeと呼ばれる問題です。すごく太い、例えば1GBくらいの回線があったとしても、100ミリ秒などの遅延があると、1GBという速度は到底でません。このLong Fat Pipeは、個々のTCPの接続で発生するため、1つのTCP接続でデータをやり取りするSPDYの方が、複数のTCP接続に分散してデータをやり取りするHTTPSよりもLong Fat Pipeの影響を受けやすくなります。よって、<strong>ネットワークのレイテンシが大きい状況では、通信するリソースサイズが増えるに従ってLong Fat Pipeの影響が大きくなり、SPDYの方がHTTPSよりも通信速度が遅くなります</strong>。このように、常にSPDYの方が速いというわけではありません。</p>

<p>さらに、<strong>Head of Line Blocking</strong>という問題についても、SPDYの方がより大きな影響を受けます。Head of Line Blockingとは、TCP通信内でサーバから送られるデータが欠損する（パケット・ロスが起こる）と、そのデータが再送されるまでは、その後続のデータがブラウザへ送信されないという問題です。HTTPSの場合、TCPを複数張っているため、一つのTCPでHead of Line Blockingが発生しても、他のTCPでは通常通り通信が行われるため、この影響をあまり受けませんが、<strong>SPDYの場合、一つのTCPのみを使用しているため、Head of Line Blockingの影響を大きく受けることになります</strong>。</p>

<h2>Webの進化によりTCPの制限に直面</h2>

<p>以上のようなSPDYを使用することによる問題は、SPDY自体に原因があるわけではありません。その下のレイヤであるTCPに、Long Fat PipeやHead of Line Blockingといった制限があることに原因があります。<strong>Webの進化によって、TCPの制限が顕著になってきた</strong>のです。このように、TCPの制限がWebサービスに影響を及ぼすことがわかってきたため、「TCP以外のプロトコルを使った方が良いのではないか」という議論が国際標準化の場でなされるようになってきました。Googleは、TCPの代替としてQUICという、Head of Line Blockingが起こりにくい新たなプロトコルを提案しています。また、WebRTCの方ですと、SCTP over UDPという、Head of Line Blockingが起きないプロトコルが提案されています。ただし、インターネットのあらゆる機器に影響があるため、TCPを代替するこれらのプロトコルの普及には、時間がかかると考えられます。</p>

<h2>ユーザの体感速度を上げる</h2>

<p>TCPの制限により、SPDYが速いとは一概に言えない状況の中で、Web開発者は、「速度とは何か」を今一度考える必要があります。結局は、全てのコンテンツをブラウザへダウンロードするということはそれほど重要なことではなく、ユーザへ、最低限見せなければならない情報を素早く見せる、つまり、<strong>ユーザの体感速度をあげることが重要になります</strong>。体感速度を上げる方法として、ファーストビューのレンダリングを高速化させ、ファーストビューに関係ない画像やスクリプトを後でダウンロードするという方法があります。これを実現する技術として、HTMLの<strong>Resource Priorities</strong>というものがあります。これを使うことで、タグの中に、あるアトリビュートを指定するだけで、そのリソースを後から読み込むことができます。具体的には、後から読み込むようにしたいリソースについては、タグに属性「lazyload」を指定することで、そのリソースを後から読み込むことができます。</p>

<p></p><pre class="crayon-plain-tag">&lt;img class='Backgrounds' id='BackgroundLevel1' src='Background1.png' /&gt;
&lt;img class='Backgrounds' id='BackgroundLevel2' src='Background2.png' lazyload /&gt;</pre><p></p>

<h2>P2P通信を実現するWebRTC</h2>

<p>WebRTCの特徴はP2Pにあります。WebSocketを使ってブラウザ間でメッセージのやり取りを行う場合、必ずサーバを経由して通信しなければなりません。WebRTCを使う場合は、サーバを介せず、ブラウザ間で直接データをやり取りすることができます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/12/html5conference-report-web-protocol-05.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/html5conference-report-web-protocol-05.jpg" alt="html5conference-report-web-protocol-05" width="520" height="390" class="aligncenter size-full wp-image-3475" style="border: 1px solid #000000" srcset="/wp-content/uploads/2013/12/html5conference-report-web-protocol-05.jpg 640w, /wp-content/uploads/2013/12/html5conference-report-web-protocol-05-300x225.jpg 300w, /wp-content/uploads/2013/12/html5conference-report-web-protocol-05-207x155.jpg 207w" sizes="(max-width: 520px) 100vw, 520px" /></a></p>

<p>P2P通信を実現させるためには、通信対象の端末のIPアドレスとUDPのポート番号を知る必要があります。しかし、通常は端末がNATの内側にあるため、インターネット上でやり取りをする際に必要となる、NATの外側のIPアドレスとポート番号を知ることができません。</p>

<p>NATの外側のIPアドレスとポート番号を知るために、WebRTCではICEという仕組みを使用するのですが、その中でSTUNサーバというものがあります。端末は、STUNサーバへUDPのパケットを送信すると、NATの外側にあるIPアドレスとポート番号を知ることができます。そのようして得られた自分のIPアドレスとポート番号を、通信したい端末とお互いに交換しあうことで、P2P通信を行うことができます。ただし、STUNサーバは、フルコーンNATのように、宛先のIPアドレスを気にしないNATでないと使用できないため、シンメトリックNATではSTUNサーバを使用することができません。ちなみに、大体の家庭のNATはフルコーンNATで、企業で使用されるNATはほとんどがシンメトリックNATです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/12/html5conference-report-web-protocol-06.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/html5conference-report-web-protocol-06-300x225.jpg" alt="html5conference-report-web-protocol-06" width="310" height="240" class="alignnone size-medium wp-image-3477" style="border: 1px solid #000000" /></a>
<a href="https://html5experts.jp/wp-content/uploads/2013/12/html5conference-report-web-protocol-07.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/html5conference-report-web-protocol-07-300x225.jpg" alt="html5conference-report-web-protocol-07" width="310" height="240" class="alignnone size-medium wp-image-3478" style="border: 1px solid #000000" /></a></p>

<p>WebRTCでは、STUNサーバが使えない場合は、TURNサーバを使うようになっています。TURNサーバを使う場合は、WebSocketを利用してブラウザ間でデータをやり取りする場合と同様に、このTURNサーバを介してデータのやり取りが行われるようになります。同一セグメント内であれば、STUN, TURNサーバを使うことなくP2P通信を行うことができます。ただし、セキュリティの観点から同一LAN内のP2P通信が禁止されていることがあり、同一LAN内であってもP2P通信を行うためにTURNサーバが必要になる場合があります。IPv6で通信が行われるようになると、NATが不要になるため、P2P通信のためにSTUN, TURNサーバが不要になると思われているのですが、NATの代わりとなるファイアーウォールが恐らく設置されることになると思いますので、ファイアーウォールを超えてP2P通信を実現させるために、STUNのようなサーバが必要になると考えられます。</p>


<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe src="http://www.slideshare.net/slideshow/embed_code/28800754" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" 0="allowfullscreen" class="iframe-class"></iframe>


<div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/KensakuKOMATSU/web-28800754" title="最新Webプロトコル傾向と対策" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">最新Webプロトコル傾向と対策</a> </strong> from <strong><a href="http://www.slideshare.net/KensakuKOMATSU" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Kensaku Komatsu</a></strong> </div>

<p><br>

<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe width="560" height="315" src="//www.youtube.com/embed/nXhEDC2qOLg" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>
</p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2013レポート]]></series:name>
	</item>
	</channel>
</rss>
