当前位置:首页 > 技术 >

websocket和tcp区别(websocket服务器要多大)

来源:原点资讯(www.yd166.com)时间:2022-10-26 13:04:40作者:YD166手机阅读>>

本文引用自“ 豆米博客”的《JS实时通信三把斧》系列文章,有优化和改动。

1、引言

有关Web端即时通讯技术的文章我已整理过很多篇,阅读过的读者可能都很熟悉,早期的Web端即时通讯方案,受限于Web客户端的技术限制,想实现真正的“即时”通信,难度相当大。

传统的Web端即时通讯技术从短轮询到长连询,再到Comet技术,在如此原始的HTML标准之下,为了实现所谓的“即时”通信,技术上可谓绞尽脑汁,极尽所能。

自从HTML5标准发布之后,WebSocket这类技术横空出世,实现Web端即时通讯技术的便利性大大提前,以往想都不敢想的真正全双工实时通信,如此早已成为可能。

本文将专门介绍WebSocket、socket.io、SSE这几种现代的Web端即时通讯技术,从适用场景到技术原理,通俗又不失深度的文字,特别适合对Web端即时通讯技术有一定了解,且想深入学习WebSocket等现代Web端“实时”通信技术,却又不想花时间去深读枯燥的IETF技术手册的读者

websocket和tcp区别,websocket服务器要多大(1)

2、本文作者

“豆米”:现居杭州,热爱前端,热爱互联网,豆米是“洋芋(土豆-豆)”和“米喳(米)”的简称。

作者博客:https://blog.5udou.cn/

作者Github:https://github.com/linxiaowu66/

3、知识预备

如果你对Web端即时通讯技术的前世今生不曾了解,建议先读以下文章:

  1. 《新手入门贴:史上最全Web端即时通讯技术原理详解》
  2. 《Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE》
  3. 《详解Web端通信方式的演进:从ajax、JSONP 到 SSE、Websocket》
  4. 《网页端IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket》

如果你对本文将要介绍的技术已有了解,建议进行专项学习,以便深入掌握:

  1. 《Comet技术详解:基于HTTP长连接的Web端实时通信技术》
  2. 《SSE技术详解:一种全新的HTML5服务器推送事件技术》
  3. 《WebSocket详解(三):深入WebSocket通信协议细节》
  4. 《理论联系实际:从零理解Websocket的通信原理、协议格式、安全性》
  5. 《WebSocket从入门到精通,半小时就够!》
4、WebSocket

websocket和tcp区别,websocket服务器要多大(2)

在这里不打算详细介绍整个WebSocket协议的内容,根据我本人以前协议的学习思路,我挑重点使用问答方式来介绍该协议,这样读起来就不那么枯燥。

4.1 基本情况

协议运行在OSI的哪层?

应用层,WebSocket协议是一个独立的基于TCP的协议。 它与HTTP唯一的关系是它的握手是由HTTP服务器解释为一个Upgrade请求。

协议运行的标准端口号是多少?

默认情况下,WebSocket协议使用端口80用于常规的WebSocket连接、端口443用于WebSocket连接的在传输层安全(TLS)RFC2818之上的隧道化口。

4.2 协议是如何工作的?

协议的工作流程可以参考下图:

websocket和tcp区别,websocket服务器要多大(3)

其中帧的一些重要字段需要解释一下:

  • 1)Upgrade:`upgrade`是HTTP1.1中用于定义转换协议的`header`域。它表示,如果服务器支持的话,客户端希望使用现有的「网络层」已经建立好的这个「连接(此处是 TCP 连接)」,切换到另外一个「应用层」(此处是 WebSocket)协议;
  • 2)Connection:`Upgrade`固定字段。Connection还有其他字段,可以自己给自己科普一下;
  • 3)Sec-WebSocket-Key:用来发送给服务器使用(服务器会使用此字段组装成另一个key值放在握手返回信息里发送客户端);
  • 4)Sec-WebSocket-Protocol:标识了客户端支持的子协议的列表;
  • 5)Sec-WebSocket-Version:标识了客户端支持的WS协议的版本列表,如果服务器不支持这个版本,必须回应自己支持的版本;
  • 6)Origin:作安全使用,防止跨站攻击,浏览器一般会使用这个来标识原始域;
  • 7)Sec-WebSocket-Accept:服务器响应,包含Sec-WebSocket-Key 的签名值,证明它支持请求的协议版本。

关于Sec-WebSocket-Key和Sec-WebSocket-Accept的计算是这样的:

所有兼容RFC 6455 的WebSocket 服务器都使用相同的算法计算客户端挑战的答案:将Sec-WebSocket-Key 的内容与标准定义的唯一GUID字符(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)串拼接起来,计算出SHA1散列值,结果是一个base-64编码的字符串,把这个字符串发给客户端即可。

用代码就是实现如下:

const key = crypto.createHash('sha1')

.update(req.headers['sec-websocket-key'] constants.GUID, 'binary')

.digest('base64')

至于为什么需要这么一个步骤,可以参考《理论联系实际:从零理解WebSocket的通信原理、协议格式、安全性》一文。

引用如下:

Sec-WebSocket-Key/Sec-WebSocket-Accept在主要作用在于提供基础的防护,减少恶意连接、意外连接。

作用大致归纳如下:

  • 1)避免服务端收到非法的websocket连接(比如http客户端不小心请求连接websocket服务,此时服务端可以直接拒绝连接);
  • 2)确保服务端理解websocket连接。因为ws握手阶段采用的是http协议,因此可能ws连接是被一个http服务器处理并返回的,此时客户端可以通过Sec-WebSocket-Key来确保服务端认识ws协议。(并非百分百保险,比如总是存在那么些无聊的http服务器,光处理Sec-WebSocket-Key,但并没有实现ws协议。。。);
  • 3)用浏览器里发起ajax请求,设置header时,Sec-WebSocket-Key以及其他相关的header是被禁止的。这样可以避免客户端发送ajax请求时,意外请求协议升级(websocket upgrade);
  • 4)可以防止反向代理(不理解ws协议)返回错误的数据。比如反向代理前后收到两次ws连接的升级请求,反向代理把第一次请求的返回给cache住,然后第二次请求到来时直接把cache住的请求给返回(无意义的返回);
  • 5)Sec-WebSocket-Key主要目的并不是确保数据的安全性,因为Sec-WebSocket-Key、Sec-WebSocket-Accept的转换计算公式是公开的,而且非常简单,最主要的作用是预防一些常见的意外情况(非故意的)。

强调:Sec-WebSocket-Key/Sec-WebSocket-Accept 的换算,只能带来基本的保障,但连接是否安全、数据是否安全、客户端/服务端是否合法的 ws客户端、ws服务端,其实并没有实际性的保证。

4.3 协议传输的帧格式是什么?

帧格式定义的格式如下:

websocket和tcp区别,websocket服务器要多大(4)

栏目热文

socket和http优缺点(http和socket区别)

socket和http优缺点(http和socket区别)

一、OSI 网络七层模型第一层:应用层,定义了用于在网络中进行通信和传输数据的接口;(Http协议位于该层)第二层:表示...

2022-10-26 13:44:57查看全文 >>

socket和http区别(websocket和socket区别)

socket和http区别(websocket和socket区别)

一个完整的HTTP请求的过程此举例为抛砖引玉,引导大家进入思考状态。当你按输入www.baidu.com ,浏览器接收到...

2022-10-26 13:01:10查看全文 >>

websocket和socket的区别(websocket缺点有哪些)

websocket和socket的区别(websocket缺点有哪些)

对于物联网(IoT,Internet of Things),最重要的是在互联网中设备与设备的通讯,现在物联网在inter...

2022-10-26 13:28:06查看全文 >>

http和socket通信有什么区别(socket和http哪个响应快)

http和socket通信有什么区别(socket和http哪个响应快)

OSI是一个 开放性 的通信系统互连参考模型,他是一个定义得非常好的协议规范。OSI模型有7层结构每层都可以有几个子层...

2022-10-26 13:04:59查看全文 >>

websocket和http协议有什么区别(websocket协议的缺点)

websocket和http协议有什么区别(websocket协议的缺点)

一、联系:1、都是基于TCP协议;2、websocket是基于http的他们的兼容性都很好;3、在连接的建立过程中对错误...

2022-10-26 12:58:37查看全文 >>

websocket和http2.0的区别(websocket和socket哪个稳定)

websocket和http2.0的区别(websocket和socket哪个稳定)

昨天的文章中提到了HTTP/2,很多同学问HTTP/2是啥,找了这篇文章分享给各位文章来源:http://www.hol...

2022-10-26 13:29:39查看全文 >>

websocket一般用什么服务器(websocket服务器怎么打开)

websocket一般用什么服务器(websocket服务器怎么打开)

安装nodeJs和配置, 参考nodeJs安装文档,下图问本人本地安装的版本查看版本 npm-v在本地创建存放项目文件夹...

2022-10-26 13:47:10查看全文 >>

websocket和http的区别(websocket登录验证)

websocket和http的区别(websocket登录验证)

一、这一大堆关键词之间到底有啥区别?有名字就有定义,理解的前提从来都是对定义有所了解。就好比现在让你形容一下梯形的定义,...

2022-10-26 13:32:34查看全文 >>

http和socket连接有什么区别(http长连接和socket长连接)

http和socket连接有什么区别(http长连接和socket长连接)

前言:作为一名开发人员我们经常会听到HTTP协议、TCP/IP协议、UDP协议、Socket、Socket长连接、Soc...

2022-10-26 13:21:32查看全文 >>

http和socket有什么关系(http与socket关系)

http和socket有什么关系(http与socket关系)

最近项目中需要自己去实现一个http的接口。所以趁这个机会跟大家讲一下http和socket的关系,以及与TCP又有什么...

2022-10-26 13:37:24查看全文 >>

文档排行