websocket握手失败_WebSocket通信之握手协议
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通信之握手协议相关推荐
- android https握手失败,Android SSL错误握手失败
最近我在连接特定服务器的测试中发生了类似的错误: 握手失败;返回-1,SSL错误代码1,net_error -103 我通过搜索铬源代码找到了一些有用的理由,这表明了ret代码的含义.也许它可以帮助你 ...
- websocket握手失败_WebSocket握手期间出错:意外的响应代码:500
WebSocket握手期间出错:意外的响应代码:500 我在我的网站上使用websocket,但随机发送给我以下错误消息: WebSocket连接到'ws://client.mydomain.com/ ...
- js 链接websocket马上断开_WebSocket之基于STOMP协议的广播模式实现群聊功能
又是一个老套的古诗词赏析 不恨此花飞尽,恨西园.落红难缀.--苏轼<水龙吟·次韵章质夫杨花词> WebSocket与STOMP协议 相关简介 WebSocket WebSocket 是一种 ...
- websocket创建失败_WebSocket sendSocketMessage 发送失败,onSocketMessage接收不到数据
详细问题描述 Socket链接 手机调试没有任何问题 onSocketOpen onSocketMessage 能发送 能接收数据 但是打包编译后 APP上面只能连接成功,发送接收代码不执行 失效 [ ...
- TCP第三次握手失败怎么办,即最后一次握手失败
和DDOS攻击一样,握手失败和没发送握手报文一样!!!服务器无法完成第三次握手,但服务器不会立即放弃,服务器会不停的重试并等待一定的时间后放弃这个未完成的连接,这段时间叫做SYN timeout,这段 ...
- 深入解析:如何修复SSL / TLS握手失败错误(中)
上篇内容我们首先介绍什么是SSL / TLS握手的概念和简单的流程概述,为的就是让有的童鞋们能够更好地理解.那么接下来呢我们将介绍SSL/ TLS握手失败和错误(SSL握手错误)的所有可能原因以及谁可 ...
- 接收sahara协议消息 或者 出现stream协议握手失败
卡在:接收sahara协议消息 或者 出现stream协议握手失败 文件路径不要有中文或空格 说明:这个所有的OPPO刷机,都可能出现 出错原因:这个出错原因不是很明确,但是本人用以下的方法操作 ...
- 握手失败_拜托了,看完这篇别再问我什么是TCP三次握手和四次挥手
TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 三次握手如何建立连接? 三次握手建立链接 从图中可以清楚的看到, ...
- 深入解析:如何修复SSL / TLS握手失败错误(上)
接下来的三篇内容我们来讨论SSL / TLS握手失败错误及其修复方法. 针对互联网用户和网站所有者的SSL / TLS握手失败错误修复程序 像许多SSL错误消息一样,SSL握手错误可以从客户端和服务器 ...
- 阿里云环境中TLS/SSL握手失败的场景分析
TLS/SSL握手是一个相对复杂的过程,在阿里云环境中结合产品,安全等特性,可能会让TLS/SSL握手过程的不定性更多.本文来总结下各种握手失败的场景. 一次TLS/SSL握手的过程 本文不详细介绍T ...
最新文章
- 创始人CEO该拿多少工资?
- 科大星云诗社动态20210331
- IO流——流的分类、InputStream、OutputStream、Reader、Writer等
- 浅悉软考网络工程师考试出题风格变化
- 数据库连接失败报错com.mysql.cj.jdbc.exceptions.CommunicationsException
- java mongocollection_MongoDb完结笔记-与java结合
- python ttk separator_Python3 tkinter基础 Menu add_cascade 多级菜单 add_separator 分割线
- 图片批量重命名编号不要括号
- java基础之String类型
- php音视频边下边播,封装bilibili播放器,自定义边下边播和缓存功能
- perf 性能分析实例——使用perf优化cache利用率
- 中国区域地面气象要素驱动数据集(1979-2018)数据下载与处理
- 【数学模拟卷总结】2023李林六套卷数学二第三套
- 浅析支付宝钱包支付流程
- 2021年中国电子商务政策汇总分析:电子商务行业体系不断完善,跨境电商、农村电商蓬勃发展[图]
- python职业发展规划-python职业发展
- html 百度地图显示轨迹,百度地图,地图轨迹
- uni-app ,uni is not defind uView安装不了
- html输入框电话代码,电话号码输入框测试用例
- 啊!我的专业不只是修电脑,装系统
热门文章
- Vue全家桶打造自适应 web 音乐播放器
- 线性代数史蒂文_史蒂文·弗兰克的博客国歌
- 在docker中运行自己的eureka服务端
- 三年之期已至,加多宝如何续写上市新故事
- 2012年真的是世界末日吗?_全球关注
- 【Mesh】关于Mesh中Seq+IV与RPL分析
- 中国互联网二十年回忆
- 联想Y470 非虚拟机安装苹果Mac OS X Mavericks 10.9.1教程详解(文字+图片),通俗易懂亲自动手——序列二之镜像写入,引导建立
- python编程从入门到实战16章x轴刻度与书不一样,2020-10-05 Python编程从入门到实践 第16章 下载数据 动手试...
- 计算机c盘中哪些东西能删除吗,电脑c盘哪些文件可以删除,教您c盘里哪些文件可以删除...