WebSocket的调研分析

  1. 简介
    本文档编写目的,是为了在现有会控服务http信令的基础上,为长连接功能的加入提供一个探索和初步设计思路。
  2. WebSocket & Tcp Socket
    2.1 WebSocket介绍
    概述:
    WebSocket同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的。WebSocket在建立握手时,数据是通过HTTP/1.1(注HTTP1.1相比HTTP增加了KeepAlive)传输的,准确的将是使用了HTTP Upgrade来将协议更改为websocket,但是建立之后,在真正传输时候是不需要HTTP协议的。

由来:
HTTP 协议做不到服务器主动向客户端推送信息。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。

补充:
Websocket 协议使用80或者443(运行在TSL之上)
WebSocket通过HTTP1.1协议的101状态码进行握手。

握手实例:
在这里插入图片描述
在这里插入图片描述

字段说明:
Connection: 客户端必须设置为Upgrade,表示希望升级协议
Upgrade: 表示希望升级哪个协议
Sec-Websocket-Key:是随机字符串,服务器端会用这个数据造出一个SHA-1的信息摘要。把Sec-Websocket-Key加上一个特殊字符串,然后进行计算SHA-1摘要,之后进行base64编码,结果在Sec-Websocket-Accept中返回。

握手完成后的数据报文:
在这里插入图片描述

FIN(1bit): 表示信息是否结束, 如果为1则该消息为消息尾部,如果为零则还有后续数据包; 

RSV 1-3(1bit):备用字段 默认都为 0
Opcode(4bit):消息类型,消息类型暂定有15种,其中有几种是预留设置。
Mask (1bit): 掩码,是否加密数据,(客户端发送给后端时,mask必须为1,否则close连接;服务器发送给前端时,mask必须为0,否则断开连接)
Payload len(7bit): 数据的长度,当这个7 bit的数据 == 126 时,后面的2 个字节表示数据长度,当它 == 127 时,后面的 8 个字节表示数据长度
Masking-key(0/32bit): 掩码值( Mask为1时才有)
Payload data 长度为Payload len的数据,如果有掩码 需要用mask-Key来异或 才能得到

图例说明:

在这里插入图片描述

优点:
1较少的开销控制,服务器和客户端之间交换数据时,用于控制协议的的头部相对较小(相比HTTP)
2相比长轮询更强的实时性,短时间内可以传递更多的数据
3保持状态连接,相比HTTP不用每次都带状态信息,如身份认证

不足:
Websocket在同步接收大量数据时会阻塞。

2.2 Tcp Socket介绍
套接字(socket):应用层通过传输层进行数据通信时,TCP和UDP会遇到同时会多个应用程序进程提供并发服务的问题。区分不同的应用程序进程间的网络通信和连接,主要有三个参数:通信的目标IP地址、使用的传输层协议(TCP或UDP)、目标端口号,这种组合称为套接字。
套接字之间的连接分为三个步骤:服务器监听、客户端请求、连接确认。

2.3差别
从上面的介绍,可以很清楚的看出,websocket协议基于的是HTTP1.1的一套协议,传输的内容是面向消息传输的,而socket是基于TCP的应用,其面向的字节传输的。对于socket的接收方会出现tcp的粘包,拆包和丢包的情况,而websocket则不会,websocket的协议保障了每次收到的消息都是发送放每一次收到的完整的消息。
Socket的可靠性是基于TCP的协议来保障的,相比websocket是心跳检测和重连机制以及TCP来保障的。所以websocket的可靠性更好。
同时 由于socket是直接对TCP的封装,而websocket是基于HTTP协议的,所以socket传输性能更高,但是要自己定义一套规则。
下面文章是一个人对websocket和tcp socket的一个简单性能测试,性能上可以肯定是socket优于websocket,但是不带websocket的性能旧很差。
https://medium.com/kifi-engineering/websockets-vs-regular-sockets-b3b8e7ea0708

2.4使用建议
如果目前的websocket的性能足够满足我们对于未来一段时间内的开发需求,那么建议不要自己再造一个轮子,避免引入不必要的错误。

  1. Websocket性能分析
    3.1当前可以使用的库(c语言)
    LibHTTP:(MIT)
    LibHTTP is an MIT licensed library written in C implementing a HTTP/HTTPS server with websocket capabilities. The library also includes functionality for client connections to other servers.
    https://www.libhttp.org/
    https://github.com/lammertb/libhttp

Libwebsockets:(MIT)
Libwebsockets (LWS) is a flexible, lightweight pure C library for implementing modern network protocols easily with a tiny footprint, using a nonblocking event loop. It has been developed continuously since 2010 and is used in tens of millions of devices and by thousands of developers around the world.
https://libwebsockets.org/

noPoll:
noPoll is a OpenSource WebSocket implementation (RFC 6455), written in ansi C, that allows building pure WebSocket solutions or to provide WebSocket support to existing TCP oriented applications.
noPoll provides support for WebSocket (ws://) and TLS (secure) WebSocket (wss://), allowing message based (handler notified) programming or stream oriented access.
noPoll was written to have a clean and easy to use library.
http://www.aspl.es/nopoll/index.html
https://github.com/ASPLes/nopoll

这三个库中前两两个是完全开源的,第三个是西班牙一个公司的开源库,都有人再用。前两个从更新速度上来讲,libwebsocket要由于libHTTP。其他的关于C的websockt,实在是不多。

关于socket的一些封装库:https://blog.csdn.net/u014162133/article/details/88578114

3.2其他人分析结果借鉴
此处将引用网上现有的一些性能分析报告来说明websocket的吞吐量,实际生产中需要进一步测试。
文章介绍了现有的几种非c语言框架对websocket的几种框架的测试,根据他的结果应该是可以满足我们目前的需求,关于使用c相关的库,可能还需要进行进一步测试来对性能进行评估,但相比现行的http长轮询,性能一定会有所提升。

https://blog.csdn.net/zl1zl2zl3/article/details/84780413

https://medium.com/kifi-engineering/websockets-vs-regular-sockets-b3b8e7ea0708

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值