对.Net WebSocket 和Socket的原理的思考

  今早上班路上接到了一个朋友的微信信息,问我对WebSocket 是否熟悉,一楞,印象之中没有用过这个类....来到公司后,得空问了一下度娘,原来这是一个随着HTML5推出的一种新协议,意义在于能实现浏览器与服务器全双工通信(full-duplex)。度娘对此的解释是:

  现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的有用数据可能只是一个很小的值,这样会占用很多的带宽。

  而比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求。

在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:

  1. Header

    互相沟通的Header是很小的-大概只有 2 Bytes

  2. Server Push

  如上解释,WebSocket 是一个非常不错的东东,然而,我那个朋友正需要使用客户端对服务端做轮询查询,按照常用的解决方案,通过在客户端轮询地向服务端发起Http请求,或者通过Socket直接建立长连接获取最新的数据,然后更新呈现的内容便可以完成任务,不过那好学的朋友可能觉得WebSocket 新鲜吧,不断追问WebSocket 和刚才两个解决方案哪个更好,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:以上是我的愚见,废话比较多哈,敬请谅解,由于本身技术水平有限,无法在每个细节都深入研究,如有不妥之处,请路过的大神多加指点,小弟在此谢过 ^_^

时间: 2024-10-13 09:28:11

对.Net WebSocket 和Socket的原理的思考的相关文章

第二十天 TCP 及socket通信原理、http协议及web服务、httpd核心配置详解

一.TCP及socket通信原理详解 二.http协议及web服务原理(一) 三.http协议及web服务原理(二) 四.httpd核心配置详解 1.tcp.udp是一种传输协议,实现进程地址标记,套接字是一个虚拟设备,用来表明主机上的某个进程      众所周知:0-1023:管理员才有权限使用,永久地分配给某应用使用(由IANA分配)      注册端口:1024-41951:只有一部分被注册,分配原则上非特别严格.      动态端口或私有端口:41952-65535:由内核分配临时端口,

第1章 网络编程基础(2)——Socket编程原理

Socket编程原理 Socket是网络通信端点的一种抽象,它提供了一种发送和接收数据的机制. 流socket(SOCK_STREAM):双向.有序.无重复.并且无记录边界 数据报Socket(SOCK_DGRAM):双向.保留记录边界 面向连接的操作比无连接的操作效率低,但数据的安全性更高. Socket通信流程 IP地址标志主机,端口号标志进程,IP加上端口号才能确定连接目标. 一个网络连接需要以下5种信息: 本地协议端口:指出接收报文或数据的进程. 本地主机地址:指出接收数据包的主机. 远

Socket通信原理简介

Socket通信原理简介 字数1011 阅读1766 评论2 喜欢11 何谓socket 计算机,顾名思义即是用来做计算.因而也需要输入和输出,输入需要计算的条件,输出计算结果.这些输入输出可以抽象为I/O(input output). Unix的计算机处理IO是通过文件的抽象.计算机不同的进程之间也有输入输出,也就是通信.因此这这个通信也是通过文件的抽象文件描述符来进行. 在同一台计算机,进程之间可以这样通信,如果是不同的计算机呢?网络上不同的计算机,也可以通信,那么就得使用网络套接字(soc

Java基础知识强化之网络编程笔记02:Socket通信原理图解

1. Socket (1)Socket套接字  网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字 (2)Socket原理机制:  • 通信两端都有Socket.  • 网络通信其实就是Socket间的通信.  • 数据在两个Socket间通过IO传输. 2.  Socket通信原理图解:

socket编程原理

socket编程原理 1.问题的引入 1) 普通的I/O操作过程: UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-read-close).在一个用户进程进行I/O操作时,它首先调用"打开"获得对指定文件或设备的使用权,并返回称为文件描写叙述符的整型数,以描写叙述用户在打开的文件或设备上进行I/O操作的进程.然后这个用户进程多次调用"读/写"以数据传输.当全部的传输操作完毕后,用户进程关闭

socket通信原理

什么是socket 所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. SOCKET连接过程 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. 服务端: 1.先初始化socket 2.创建socket,开始监听整个网络的连接请求. 3.当检测到来自客户端的连接请求时,向客户端发送连接请求的信息,并建立与客户端之间的连接. 4.与客户端进行通信 5.完成

WebSocket和Socket的区别

前段时间写了两篇介绍HTTP和WebSocket的文章,回复中有人说希望了解下WebSocket和Socket的区别.这个问题之前也有想过,自己对此是有大概的答案,可是并不太确定,于是去搜集了些资料(其实就是各种Google),看了很多以前的文档,觉得有些故事十分有趣,整理如下,算是一个外传. 文中图片全来自Google图片搜索,如侵删. 短答案 就像Java和JavaScript,并没有什么太大的关系,但又不能说完全没关系.可以这么说: 命名方面,Socket是一个深入人心的概念,WebSoc

(转) websocket 和 socket 剖析

Socket 与 WebSocket 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载: 本博客采用 WPCMD 维护: 本文标题:Socket 与 WebSocket 本文链接:http://zengrong.net/post/2199.htm 去年光棍节的时候,我写过一篇 quick-cocos2d-x 中的 socket

网络编程WebSocket 和socket、HTTP的区别和联系

一.WebSocket 是什么? WebSocket是HTML5规范提出的一种协议:目前除了完犊子的IE浏览器,其他浏览器都基本支持.他是一种协议,万变不离其宗,也是基于TCP协议的:和HTTP协议是并存的两种协议. WebSocket是HTML5中的协议.HTML5 Web Sockets规范定义了Web Sockets API,支持页面使用Web Socket协议与远程主机进行全双工的通信.它引入了WebSocket接口并且定义了一个全双工的通信通道,通过一个单一的套接字在Web上进行操作.