WebSocket是一种先进的技术,使得它可以打开用户的浏览器和服务器之间的双向交互通信会话。使用WebSocket,您可以将消息发送到服务器并接收事件驱动的响应,而无需轮询服务器以进行回复。

首先,服务器必须使用标准TCP套接字监听传入的Socket连接。例如,假设您的服务器正在侦听http://example.com,端口80,并且您的套接字服务器响应GET请求/chat。

服务器可能会侦听它选择的任何端口,但如果它选择80或443以外的任何端口,它可能会出现防火墙和/或代理问题。端口443上的连接往往更频繁地成功,但当然,这需要安全连接(TLS / SSL)。另请注意,大多数浏览器(特别是Firefox 8+和Chrome)不允许从安全页面连接到不安全的WebSocket服务器。

握手是WebSockets中的“Web”。它是从HTTP到WS的桥梁。在握手中,协商的细节是最重要的,如果协商失败,任何一方都可以在完成之前退出。服务器必须小心了解客户端要求的所有内容,否则将引入安全问题。

客户端握手请求

如果您正在构建服务器,客户端仍然必须启动WebSocket握手过程。所以你必须知道如何解释客户的请求。该客户端将发送看起来像这样(HTTP版本相当标准的HTTP请求必须是1.1或更高,并且该方法必须是GET):GET /chat HTTP/1.1

Host: http://example.com:8000

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

Sec-WebSocket-Version: 13

它常见的请求头一样User-Agent,Referer, Cookie,或者认证标头,可能作用不大。它们与WebSocket没有直接关系。服务器忽略它们也是安全的。在许多常见设置中,反向代理已经处理过它们。

如果任何标头未被理解或具有不正确的值,则服务器应发送“400 Bad Request”并立即关闭套接字。像往常一样,它也可能给出HTTP响应体中握手失败的原因,但是消息可能永远不会显示(浏览器不显示它)。如果服务器不理解该版本的WebSockets,它应该发Sec-WebSocket-Version回一个包含它理解的版本的头。(本次使用websocket v13,最新版本)。现在,让我们转到Sec-WebSocket-Key的值。

服务器握手响应

当服务器收客户端的握手请求时,服务器应该发送一个非常奇怪(但仍然是HTTP)的响应,看起来像这样(记住每个标题结束\r\n并\r\n在最后一个之后添加一个额外的):HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

此外,服务器可以在此决定扩展/子协议请求;有关详细信息,请参阅其他这Sec-WebSocket-Accept部分很有趣。服务器必须从客户端发送的标头中找到Sec-WebSocket-Key的值。将客户端的Sec-WebSocket-Key和“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”(它是一个“Magic string”)编码成SHA-1哈希值,并 返回哈希的base64编码。

跟踪客户端

虽然WebSocket协议没有直接关系,但值得一提的是:您的服务器必须跟踪客户端的套接字,这样您就不会再与已经完成握手的客户握手。相同的客户端IP地址可以尝试多次连接(但是如果一个服务器在短时间尝试过多连接就应该拒绝它们)。

提示所有浏览器都会发送Origin标头。您可以使用此标题进行安全性检查(检查相同的来源,白名单/黑名单等),如果您不喜欢所看到的内容,请发送403 Forbidden。但是,请注意,非浏览器代理只能发送伪造的Origin。大多数应用程序将拒绝没有此标头的请求

request-uri(/chat此处)在规范中没有定义的含义。很多人巧妙地使用它来让一台服务器处理多个WebSocket应用程序。例如,example.com/chat 可以调用多用户聊天应用程序,而/game在同一服务器上则可以调用多人游戏。

常规HTTP状态代码只能在握手之前使用。握手成功后,您必须使用一组不同的代码(在

在发送回复握手之前,服务器可以发送其他标头,如Set-Cookie,或通过其他状态代码请求身份验证或重定向。

基于Node的Websocket实现代码

注意:代码描述websocket的握手实现,仅供参考不能直接用于生产环境。

const net = require('net');

const crypto = require('crypto');

const { StringDecoder } = require('string_decoder');

let flag = true;

function buffToString(buff) {

const decoder = new StringDecoder('utf8');

return decoder.write(buff);

}

/*** @return {string}*/

function SHA1(str) {

return crypto.createHash('sha1','').update(str)

.digest().toString('base64');

}

function handshake(data,socket){

const request = buffToString(data);

const patt1 = /Sec-WebSocket-Key: (.*)/;

const secWebsocketAccept = request.match(patt1)[1];

const response =

'HTTP/1.1 101 Switching Protocols\r\n' +

'Upgrade: websocket\r\n' +

'Connection: Upgrade\r\n' +

'Sec-WebSocket-Accept: '+SHA1(secWebsocketAccept+'258EAFA5-E914-47DA-95CA-C5AB0DC85B11')+

'\r\n'+

'\r\n';

socket.write(response);

flag = false;

}

function dataHandle(data,socket) {

if (flag){

handshake(data,socket);

} else {

//将处理来自客户端发送的消息 }

}

function main() {

const server = net.createServer().on('error',(err)=>{

throw err;

});

server.on('connection',(socket)=>{

socket.on('data',(data)=>{

dataHandle(data,socket);

});

socket.on('close',()=>{

console.log('closed');

});

});

server.listen(8080,()=>{

console.log('opened server on', server.address());

});

}

main();

Webscoket的服务器实现框架HumbleNet:一种在浏览器中工作的跨平台网络库。它由围绕WebSockets和WebRTC的C包装器组成,它抽象出跨浏览器的差异,便于为游戏和其他应用程序创建多用户网络功能。

μWebSockets:高度可扩展的WebSocket服务器和C++11和Node.js的客户端实现。

ClusterWS:用于在Node.js中构建可伸缩WebSocket应用程序的轻量级,快速且功能强大的框架。

Socket.IO:长轮询/ WebSocket的基于第三方转让协议Node.js的。

SocketCluster:Node.js的 pub / sub WebSocket框架, 侧重于可伸缩性。

SignalR:SignalR将在可用时使用WebSockets,当应用程序代码保持不变时,它会优雅地回退到其他技术和技术。

Caddy:能够将任意命令(stdin / stdout)代理为websocket的Web服务器。

ws:Node.js的流行WebSocket客户端和服务器库。

websocket握手失败_WebSocket通信之握手协议相关推荐

  1. android https握手失败,Android SSL错误握手失败

    最近我在连接特定服务器的测试中发生了类似的错误: 握手失败;返回-1,SSL错误代码1,net_error -103 我通过搜索铬源代码找到了一些有用的理由,这表明了ret代码的含义.也许它可以帮助你 ...

  2. websocket握手失败_WebSocket握手期间出错:意外的响应代码:500

    WebSocket握手期间出错:意外的响应代码:500 我在我的网站上使用websocket,但随机发送给我以下错误消息: WebSocket连接到'ws://client.mydomain.com/ ...

  3. js 链接websocket马上断开_WebSocket之基于STOMP协议的广播模式实现群聊功能

    又是一个老套的古诗词赏析 不恨此花飞尽,恨西园.落红难缀.--苏轼<水龙吟·次韵章质夫杨花词> WebSocket与STOMP协议 相关简介 WebSocket WebSocket 是一种 ...

  4. websocket创建失败_WebSocket sendSocketMessage 发送失败,onSocketMessage接收不到数据

    详细问题描述 Socket链接 手机调试没有任何问题 onSocketOpen onSocketMessage 能发送 能接收数据 但是打包编译后 APP上面只能连接成功,发送接收代码不执行 失效 [ ...

  5. TCP第三次握手失败怎么办,即最后一次握手失败

    和DDOS攻击一样,握手失败和没发送握手报文一样!!!服务器无法完成第三次握手,但服务器不会立即放弃,服务器会不停的重试并等待一定的时间后放弃这个未完成的连接,这段时间叫做SYN timeout,这段 ...

  6. 深入解析:如何修复SSL / TLS握手失败错误(中)

    上篇内容我们首先介绍什么是SSL / TLS握手的概念和简单的流程概述,为的就是让有的童鞋们能够更好地理解.那么接下来呢我们将介绍SSL/ TLS握手失败和错误(SSL握手错误)的所有可能原因以及谁可 ...

  7. 接收sahara协议消息 或者 出现stream协议握手失败

    卡在:接收sahara协议消息   或者  出现stream协议握手失败 文件路径不要有中文或空格 说明:这个所有的OPPO刷机,都可能出现 出错原因:这个出错原因不是很明确,但是本人用以下的方法操作 ...

  8. 握手失败_拜托了,看完这篇别再问我什么是TCP三次握手和四次挥手

    TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 三次握手如何建立连接? 三次握手建立链接 从图中可以清楚的看到, ...

  9. 深入解析:如何修复SSL / TLS握手失败错误(上)

    接下来的三篇内容我们来讨论SSL / TLS握手失败错误及其修复方法. 针对互联网用户和网站所有者的SSL / TLS握手失败错误修复程序 像许多SSL错误消息一样,SSL握手错误可以从客户端和服务器 ...

  10. 阿里云环境中TLS/SSL握手失败的场景分析

    TLS/SSL握手是一个相对复杂的过程,在阿里云环境中结合产品,安全等特性,可能会让TLS/SSL握手过程的不定性更多.本文来总结下各种握手失败的场景. 一次TLS/SSL握手的过程 本文不详细介绍T ...

最新文章

  1. 创始人CEO该拿多少工资?
  2. 科大星云诗社动态20210331
  3. IO流——流的分类、InputStream、OutputStream、Reader、Writer等
  4. 浅悉软考网络工程师考试出题风格变化
  5. 数据库连接失败报错com.mysql.cj.jdbc.exceptions.CommunicationsException
  6. java mongocollection_MongoDb完结笔记-与java结合
  7. python ttk separator_Python3 tkinter基础 Menu add_cascade 多级菜单 add_separator 分割线
  8. 图片批量重命名编号不要括号
  9. java基础之String类型
  10. php音视频边下边播,封装bilibili播放器,自定义边下边播和缓存功能
  11. perf 性能分析实例——使用perf优化cache利用率
  12. 中国区域地面气象要素驱动数据集(1979-2018)数据下载与处理
  13. 【数学模拟卷总结】2023李林六套卷数学二第三套
  14. 浅析支付宝钱包支付流程
  15. 2021年中国电子商务政策汇总分析:电子商务行业体系不断完善,跨境电商、农村电商蓬勃发展[图]
  16. python职业发展规划-python职业发展
  17. html 百度地图显示轨迹,百度地图,地图轨迹
  18. uni-app ,uni is not defind uView安装不了
  19. html输入框电话代码,电话号码输入框测试用例
  20. 啊!我的专业不只是修电脑,装系统

热门文章

  1. Vue全家桶打造自适应 web 音乐播放器
  2. 线性代数史蒂文_史蒂文·弗兰克的博客国歌
  3. 在docker中运行自己的eureka服务端
  4. 三年之期已至,加多宝如何续写上市新故事
  5. 2012年真的是世界末日吗?_全球关注
  6. 【Mesh】关于Mesh中Seq+IV与RPL分析
  7. 中国互联网二十年回忆
  8. 联想Y470 非虚拟机安装苹果Mac OS X Mavericks 10.9.1教程详解(文字+图片),通俗易懂亲自动手——序列二之镜像写入,引导建立
  9. python编程从入门到实战16章x轴刻度与书不一样,2020-10-05 Python编程从入门到实践 第16章 下载数据 动手试...
  10. 计算机c盘中哪些东西能删除吗,电脑c盘哪些文件可以删除,教您c盘里哪些文件可以删除...