「[[マイクロソフト系技術情報 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] **問題点 [#hb5491fd] -WebSocketには注意が必要 | プログラミング | POSTD~ http://postd.cc/websockets-caution-required/ **リアルタイム・ウェブ [#d7dbcac1] インターネット上の情報を、即時かつ大規模に他のユーザと共有する仕組みの総称。 -リアルタイム・ウェブ~ 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]]