「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-戻る
--[[HTTP]]
--[[ASP.NET SignalR]]

* 目次 [#w78cf3f7]
#contents

*概要 [#y134ddee]
HTTPを用いて、双方向通信を実現するための[[技術規格>#x005937c]]。

-APIはHTML仕様の中に含まれている~
HTML Standard 9.3 Web sockets

-通信プロトコル標準仕様
--RFC 6455
--Fetch Standard 6. WebSocket protocol alterations

*仕様 [#lc289e3d]
あまり詳しく読んでいないが、ざっくり、HTTP的に接続して、以降TCP/IP的に振舞う。

-HTML Standard
--https://html.spec.whatwg.org/multipage/web-sockets.html#network
--https://triple-underscore.github.io/WebSocket-ja.html

-Fetch Standard
--https://fetch.spec.whatwg.org/#websocket-protocol
--https://triple-underscore.github.io/Fetch-ja.html#websocket-protocol

*問題点 [#n3e1f862]
-あまり流行っていない体感もあるので調査をしてみた。

-例えば、大規模なインターネットサイトの多くがWebSocketを採用していない。
--TwitterはHTTP/2と[[ポーリング>#d98f75ed]]
--FacebookとGmailは[[ロングポーリング>#d98f75ed]]

-調査結果をサマリすると、
--[[HTTP/2の方が優れている。>#yf5721f1]]
--また、[[HTTP/3がそのプロトコルを統合するかもしれない。>#yf5721f1]]

>と言う事で、WebSocketが新規採用される可能性は低いということらしい。

**現行の問題 [#sa642fde]
-とびきり不安定なスペックでの波乱の経緯(RFC6455でようやく安定した)
-多くのライブラリ(欠陥があるにも関わらず、複数の実装が付随するモノもある)
-古いブラウザではサポートされない。

**技術的な問題 [#f4aec6f9]
***信頼性が高くない。 [#u538e95d]
-WebSocketは、信頼性(TCP/IP)という錯覚を与えた。

-しかし、欠損やサーバで処理される順序の入れ替わりなどが~
起こり得る単なるHTTP呼び出しであるかのように扱う必要がある。

***ブラウザでTCP/IPコネクションが制限されない。 [#f3d2b024]
ブラウザのWebSocket(TCP/IPコネクション)が、~
HTTP/HTTPSコネクションのように制限されない。

***プロキシや[[負荷分散>NLB]]の問題 [#ib829c62]

-HTTPプロキシサーバ経由の問題~
HTTPSでないHTTPプロキシサーバ経由でWebSocketを実行すると、~
WebSocketが閉じてしまったにも関わらず、オープンであるように見える問題に対処できない。

-TCPプロキシの問題
--TCPプロキシを起動することが余儀なくされるが、問題もある。
--HTTPプロキシによって緩和されるDoS攻撃は、TCPプロキシでは対処できない。
--TCPプロキシはヘッダを入れたり、URLを書き直したりできない。~
また、従来、HTTPプロキシが処理する様々な役割も実行できない。

-[[負荷分散>NLB]]の問題
--既存のトラフィックを再度バランシングする方法が無い。
--オーバーロードしたサーバを終了する以外に無い。

***サーバーに、I/O完了ポートなどが必要 [#r12655ed]

***[[HTTP/2>HTTP/2について調べてみた。]]と統合されていない [#yf5721f1]
-[[HTTP/2のサーバプッシュ>HTTP/2について調べてみた。#j55026d6]]で、~
[[ポーリング>#d98f75ed]]または[[ロングポーリング>#d98f75ed]]のコストを削減することができる。

-WebSocketの実装を洗練していくと、結局HTTPの再発明になる。

-両プロトコルを統一するための(有効期限切れの)ドラフトを後押しする活動はない。

-HTTP/3が統合するかもしれない。

**エンドユーザの視点 [#pda067ce]

***必要な状況が殆ど無い。 [#f1cc4fdd]
-ミリ秒未満のHTTPヘッダのパースの最適化が必要な状況が殆ど無い。
-例えば、[[ポーリング>#d98f75ed]]を使って、30秒の遅れにも問題を感じずに満足する。

***メッセージングの信頼性の方が重要 [#zce2204f]
-(上限はあるものの)古いメッセージを”取り戻す”ことが必要。
-信頼性のあるメッセージングが実装できれば、[[複数のトランスポート機構>#v5e26cae]]を簡単に実装できる。

*代替 [#v5e26cae]
[[各種の双方向通信>#g3f9a3df]]がある。

**ポーリング [#d98f75ed]
-通常のポーリング~
ポーリングによる疑似プッシュ方式

-Ajax polling
--ボディがJSON化されたもの。
--[[ポーリング>#d98f75ed]]と同じ疑似プッシュ方式

**Comet [#pe61b401]
-複数の手法をまとめた概念

-Ajax と Long-polling を使用
--Ajax~
JSON化されたボディ。
--Long-polling~
プッシュ時まで、レスポンスを返さない。

**Server Sent Events [#pa8beabb]
-Chunked Transfer Codingを使用して、~
分割(chunked)データ扱いで、継続的にレスポンス可能。

-Chunked Transfer Codingとは、
--大容量のファイルなど、Content-Length を明示しないでレスポンスする方法。
--データを細かく分けて、分割された個々のデータをサイズとセットで送信する。

**Frame [#v1e55e88]
-HTML の framesetやiframeタグを使って常時接続を実現する方法
-Forever Frame

**[[HTTP/2>HTTP/2について調べてみた。]] [#p5fd189f]
[[ポーリング>#d98f75ed]]のトランスポートとして使用すると性能が上がる(Twitter)。

**参考 [#g3f9a3df]
-サーバPUSHざっくりまとめ~
https://www.slideshare.net/mawarimichi/push-37869433

-サーバからクライアントに送信する技術 - WebSocketを中心に - Qiita~
https://qiita.com/yuba/items/00fc1892b296fb7b8de9

-双方向通信を実現! WebSocketを使いこなそう~
連載:人気順に説明する初めてのHTML5開発 - @IT~
http://www.atmarkit.co.jp/ait/articles/1111/11/news135.html

-リアルタイム通信で利用されるプロトコルと手法 - tech.guitarrapc.cóm~
http://tech.guitarrapc.com/entry/2015/08/17/044937

-リアルタイムなwebアプリを実現する方法~
(ポーリング、Comet、Server Sent Events、WebSocket) SIerだけど技術やりたいブログ~
http://kimulla.hatenablog.com/entry/2016/01/17/%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E3%81%AAweb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%28%E3%83%9D%E3%83%BC%E3%83%AA%E3%83%B3

*参考 [#hd18c8cc]

-WebSocketについて調べてみた。 - Qiita~
https://qiita.com/south37/items/6f92d4268fe676347160

**問題点 [#hb5491fd]
-WebSocketには注意が必要 | プログラミング | POSTD~
http://postd.cc/websockets-caution-required/

**Wikipedia [#d7dbcac1]

-WebSocket~
https://ja.wikipedia.org/wiki/WebSocket

-リアルタイム・ウェブ~
https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%BB%E3%82%A6%E3%82%A7%E3%83%96

----
Tags: [[:通信技術]], [[:IIS]], [[:.NET開発]], [[:.NET Core]],  [[:ASP.NET]], [[:ASP.NET SignalR]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS