はい.Net WebSocketとSocketの原理の思考

5402 ワード

今朝出勤途中に友达の微信の情报を受け取って、私にWebSocketに対して熟知しているかどうかを闻いて、ぼんやりしていて、印象の中でこの种类を使ったことがありません....会社に来てから、暇を見つけて度娘に聞いてみると、HTML 5が発売した新しいプロトコルで、ブラウザとサーバーのフルデュプレクス通信(full-duplex)を実現できることを意味していた.度娘の解釈は次の通りです.
現在、多くのサイトがインスタント通信を実現するために使用している技術はポーリングです.ポーリングは、1秒ごとなどの特定の間隔で、ブラウザによってサーバに対してHTTPリクエストを発行し、サーバによって最新のデータをクライアントのブラウザに返します.このような従来のHTTPリクエストのモードは明らかな欠点をもたらしています.ブラウザは絶えずサーバーに要求する必要がありますが、HTTPリクエストのヘッダは非常に長く、中に含まれている有用なデータは小さな値にすぎない可能性があります.これにより、多くの帯域幅が消費されます.
比較的新しい技術でポーリングを行う効果はComet–AJAXを使った.しかし、この技術は、フルデュプレクス通信に達することができるが、要求を出す必要がある.
WebSocket APIでは、ブラウザとサーバが握手をするだけで、ブラウザとサーバの間に高速チャネルが形成されます.両者の間で直接データを互いに転送することができる.このWebSocketプロトコルでは、インスタント・サービスの実現に2つのメリットがあります.
  1. Header
コミュニケーションのHeaderは小さいです-たぶん2 Bytesしかありません
  2. Server Push
 
上記の説明では、WebSocketは非常に良いものですが、私の友人はクライアントを使用してサービス側にポーリングクエリーを行う必要があります.一般的なソリューションに従って、クライアントがポーリングしてサービス側にHttpリクエストを開始したり、Socketが直接長接続を確立して最新のデータを取得したりして、表示された内容を更新することで、タスクを完了することができます.しかし、あの勉強好きな友达はWebSocketが新鮮だと思っているかもしれません.WebSocketとさっきの2つの解決策のどちらがいいか、WebSocketとSocketの違いはどこですか.それらの下層原理は同じですか?自分もWebSocketを使ったことがないので、soketとの違いがどこにあるのか分からないので、質問が来て、ネットで探してみましたが、この問題についての解答は本当に少なくて、それから見に行きました.NET CoreのオープンソースコードはSystem.Net.WebSocketsのWinHttpWebSocketクラスとSystem.Net.Socketsの
Socketクラスで少し手がかりが見つかったので、この問題を解くことができるかもしれません.
internal class WinHttpWebSocket : WebSocket
{
    .....
public async Task ConnectAsync(Uri uri, CancellationToken cancellationToken, ClientWebSocketOptions options)   {    .....     _operation.SessionHandle = InitializeWinHttp(options);     _operation.ConnectionHandle = Interop.WinHttp.WinHttpConnectWithCallback( _operation.SessionHandle, uri.IdnHost, (ushort)uri.Port, 0);     ThrowOnInvalidHandle(_operation.ConnectionHandle); bool secureConnection = uri.Scheme == UriScheme.Https || uri.Scheme == UriScheme.Wss; _operation.RequestHandle = Interop.WinHttp.WinHttpOpenRequestWithCallback( _operation.ConnectionHandle, "GET", uri.PathAndQuery, null, Interop.WinHttp.WINHTTP_NO_REFERER, null, secureConnection ? Interop.WinHttp.WINHTTP_FLAG_SECURE : 0); ThrowOnInvalidHandle(_operation.RequestHandle); _operation.IncrementHandlesOpenWithCallback();   .....   }  ...... }

  
namespace System.Net.Sockets
{
  public partial class Socket : IDisposable
  {
     .......

     public void Connect(EndPoint remoteEP)
    {
      ......
      
          EndPoint endPointSnapshot = remoteEP;
          Internals.SocketAddress socketAddress = CheckCacheRemote(ref endPointSnapshot, true);
          if (!Blocking)
          {
              _nonBlockingConnectRightEndPoint = endPointSnapshot;
              _nonBlockingConnectInProgress = true;
          }

          DoConnect(endPointSnapshot, socketAddress);
    }
     private void DoConnect(EndPoint endPointSnapshot, Internals.SocketAddress socketAddress)
     {
      .......

      SocketError errorCode = SocketPal.Connect(_handle, socketAddress.Buffer, socketAddress.Size);

      ......
     }

     ......
  }
}
namespace System.Net.Sockets {  internal static class SocketPal   {     .......     public static SocketError Connect(SafeCloseSocket handle, byte[] peerAddress, int peerAddressLen) { SocketError errorCode = Interop.Winsock.WSAConnect( handle.DangerousGetHandle(), peerAddress, peerAddressLen, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); return errorCode == SocketError.SocketError ? GetLastSocketError() : SocketError.Success; }     .......   } }

  
上のコードで表示されます.
(1)WebSocketは最終的にWinHTTPのapiを呼び出す、WinHTTPのフルネームはMicrosoft Windows HTTP Servicesであり、開発者にHTTPクライアントアプリケーションインターフェース(API)を提供し、このAPIを介してHTTPプロトコルを介して他のHTTPサーバに要求を送信する.WinHTTPの詳細なAPIについては、自分で資料を調べてください.ネット上では大きなものがあります.ここではcopyを邪魔しません.これにより,WebSocketがHTTPリクエストに基づいていることが検証され,呼び出されたWinHTTPAPIメソッド名から分かるように,いずれもコールバック付きメソッドであり,WebSocketのデュプレクス通信の特徴も検証されている.
(2)Socketは最終的にwindowsのWinsockインタフェースを呼び出し,WinsockはWindows下のネットワークプログラミングインタフェースであり,Unix下のBSD Socketから発展し,ネットワークプロトコルに関係のないプログラミングインタフェースである.具体的な情報は自分でネット上の資源を調べてください.
したがって、個人的には、WebSocketとSocketは技術的にはあまり関係がなく、下位原理も異なると思います.WebSocketは、Webベースの日増しに増加するリアルタイム通信のニーズを満たすために生まれたもので、HTTPプロトコルを用いて要求を切断せずに送信する一般的な方法に代わって、帯域幅の浪費やサーバCPUの消費を達成することができます.さらに重要なのはプロトコルであり、Socketはアプリケーション層とTCP/IPプロトコルファミリーとの通信の中間ソフトウェア抽象層であり、プロトコルではなく、WebSocketはSocketと同等ではなく、Socketの進化ではなく、Socketの代わりにはならない.
ps:以上は私の愚見で、くだらない話は比較的にドーハで、ご理解ください、自分の技術のレベルが限られているため、すべての細部で深く研究することができなくて、もし妥当でないところがあれば、通りかかった大神は多く指導して、弟はここで感謝しました^^;