WebSocket协议-原理篇
本篇文章主要讲述以下几点:
- WebSocket的原理与机制
- WebSocket与Socket.io
- WebSocket兼容性
WebSocket的原理与机制
WebSocket协议分为两部分:握手和数据传输
下面通过客户端和服务端交互的报文对比WebSocket通讯与传统HTTP的不同点,主要关注握手阶段。
根据上面的例子,运行之后,new WebSocket实例化一个新的WebSocket客户端对象,请求WebSocket URL为ws://localhost:8000的服务器,打开控制台的NetWork,客户端WebSocket对象会自动解析并识别为WebSocket请求,连接服务端端口,执行双方握手过程,来自客户端握手发送数据格式如下:
客户端发起的WebSocket连接报文类似传统HTTP报文,其中:
- Upgrade: websocket
Connection: Upgrade
这个是WebSocket的核心,告诉服务器,客户端发起的是WebSocket类型请求。 - Sec-WebSocket-Key是WebSocket客户端发送的一个 base64编码的密文,浏览器随机生成,要求服务端必须返回一个对应加密的Sec-WebSocket-Accept应答,否则客户端会抛出Error during WebSocket handshake错误,并关闭连接。
- Sec-WebSocket-Version 是告诉服务器所使用的 Websocket 协议版本
服务端收到报文后会返回下列东西,表示已经接收到请求,WebSocket建立成功,来自服务器的握手如下:
- Upgrade: websocket
Connection: Upgrade
告诉客户端即将升级的是WebSocket协议 - Sec-WebSocket-Accept的值是服务端采用与客户端一致的密钥计算出来后返回客户端的
至此,HTTP已经完成它所有工作,接下来就是完全按照Websocket协议进行了。
通过查看WebSocket的原理,与HTTP对比,得出结论:
HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个请求建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别,所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)。此外还有 multiplexing、不同的URL可以复用同一个WebSocket连接等功能。这些都是HTTP长连接不能做到的。
WebSocket与Socket.io
我们在使用WebSocket协议时通常不会使用它的API来实现,而是借助于Socket.io,Socket.io是一个WebSocket库,包括客户端的js和服务端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用。它会自动根据浏览器从WebSocket、AJAX长轮询等各种方式中选择最佳的方式来实现网络实时应用,也就是说如果浏览器对WebSocket兼容性差,Socket.io会自动选择最佳方式实现实时通信,非常方便和人性化。
Socket.io官方文档:https://socket.io/get-started/chat/
WebSocket兼容性
WebSocket兼容几乎所有现代浏览器,IE 10+ Edge Firefox 4+ Chrome 4+ Safari 5+ Opera 11.5+
socket.io对浏览器做了很好的兼容。
下一篇讲述Socket.io客户端API
参考文档:https://www.zhihu.com/question/20215561
不支持WebSocket的场景有:
- 浏览器不支持
- Web容器不支持,如tomcat7以前的版本不支持WebSocket
- 防火墙不允许
- Nginx没有开启WebSocket支持
WebSocket协议-原理篇的更多相关文章
- WebSocket协议-基础篇
本篇文章主要讲述以下几点: WebSocket协议出现的背景 WebSocket与HTTP WebSocket API WebSocket协议出现的背景 我们在上网过程中经常用到的是HTTP和HTTP ...
- WebSocket原理与实践(二)---WebSocket协议
WebSocket原理与实践(二)---WebSocket协议 WebSocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信问题而设计的.协议定义ws和wss协议,分别为普通请求和基 ...
- 爬虫前篇 /https协议原理剖析
爬虫前篇 /https协议原理剖析 目录 爬虫前篇 /https协议原理剖析 1. http协议是不安全的 2. 使用对称秘钥进行数据加密 3. 动态对称秘钥和非对称秘钥 4. CA证书的应用 5. ...
- netty(4)高级篇-Websocket协议开发
一.HTTP协议的弊端 将HTTP协议的主要弊端总结如下: (1) 半双工协议:可以在客户端和服务端2个方向上传输,但是不能同时传输.同一时刻,只能在一个方向上传输. (2) HTTP消息冗长:相比于 ...
- Http协议原理解析第一篇
一:http的由来: OSI模型把网络通信分成七层:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,对于开发网络应用人员来说,一般把网络分成五层,这样比较容易理解.这五层为:物理层.数据链 ...
- 八问WebSocket协议:为你快速解答WebSocket热门疑问
一.引言 WebSocket是一种比较新的协议,它是伴随着html5规范而生的,虽然还比较年轻,但大多主流浏览器都已经支持.它使用方面.应用广泛,已经渗透到前后端开发的各种场景中. 对http一问一答 ...
- 一文带你看懂WebSocket 的原理?为什么可以实现持久连接?
工作之余在知乎上偶然看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇让我对 websocket 的认知深刻易懂,之前看总完总觉得一知半解云里雾里.所以与大家共同分享一下一起学习.比较喜欢这种博客理 ...
- 计算机网络——简单说说WebSocket协议
一.前言 之前做了一个Web小项目,需要实现后端持续给前端推送消息的功能,当时最开始使用的是轮询实现,但是效率太低,对资源消耗也大.之后为了解决这个问题,上网查阅资料后,改用了WebSocket实 ...
- WebSocket协议详解及应用
WebSocket协议详解及应用(七)-WebSocket协议关闭帧 本篇介绍WebSocket协议的关闭帧,包括客户端及服务器如何发送并处理关闭帧.关闭帧错误码及错误处理方法.本篇内容主要翻译自RF ...
随机推荐
- 【2019.7.24 NOIP模拟赛 T1】道路建设(road)(水题)
原题与此题 原题是一道神仙不可做题,两者区别在于,原题不能有重边和自环. 然而,这题可以有重边... 于是这题就变成了一道大水题. 此题的解法 考虑如何构造. 对于\(n\le10^4\)的情况: 对 ...
- 【转】struts2的ActionInvocation分析(action调度者)
一个ActionInvocation实例代表一个action的执行状态,持有拦截器和将要执行的action的实例. defaultActionInvocation是其默认实现.下面是定义在该类中的部分 ...
- 经典排序 python实现
稳定的排序算法:冒泡排序.插入排序.归并排序和基数排序. 不是稳定的排序算法:选择排序.快速排序.希尔排序.堆排序. 冒泡 def bobble(arr): length = len(arr) for ...
- 小白专场-FileTransfer-python语言实现
目录 更新.更全的<数据结构与算法>的更新网站,更有python.go.人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11407287.h ...
- MSM8909中LK阶段LCM屏适配与显示流程分析(一)
1.前言 在驱动开发中,我们往往需要适配一些新的屏幕或者调试一些屏幕的参数等,对于Qualcomm的MSM8909这款SoC,当启动Android系统时,会有一个LK阶段,该阶段用来启动Linux内核 ...
- Spring Boot整合Mybatis配置详解
首先,你得有个Spring Boot项目. 平时开发常用的repository包在mybatis里被替换成了mapper. 配置: 1.引入依赖: <dependency> <gro ...
- 微软宣布.NET Native预览版 C#可编译为本地机器码【转】
英文原文:Announcing .NET Native Preview 微软在 MSDN 博客上宣布了 .NET Native 的开发者预览版..NET Native 可以将 C# 代码编译成本地机器 ...
- 一个人的公众号,我写了1w+
大家好,我是Bypass,一个人一直保持着写博客的习惯,为此维护了一个技术公众号,致力于分享原创高质量干货,写的内容主要围绕:渗透测试.WAF绕过.代码审计.应急响应.企业安全. 一直以来,我把它当成 ...
- 【JS】---4用JS获取地址栏参数方法
用JS获取地址栏参数方法 // 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg = new Reg ...
- 10道Python常见面试题
1.MySQL索引种类 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 2.索引在什么情况下遵循最左前缀的规则? 最左前缀原理的一部分,索引index1:(a,b,c),只会走a ...