【WebSocket 第一篇】从一个WebSocket连接说起
1.定义
WebSocket 协议是一个网络协议,允许两个相连的端点在一个单一的tcp连接上进行全双工通信。类似两个人通过手机进行通话。
WebSocket 的数据传输以帧的形式传输,将一条消息分为几个帧,按先后顺序传输出去。
这样做的好处是:
- 大数据量的传输可以分片传输,无需考虑数据大小问题
- 和 HTTP 的 chunk编码(分块传输编码)一样,可以边生成数据边传输,提高传输效率
2.通过 HTTP 建立一个WebSocket 升级连接
网络上的两个端点通过一个双向链路进行连接通信,这个双向链路的一端称为一个 Socket。一个 Socket 对应一个 IP 地址和端口号,应用程序通常通过 Socket 向网络发出或应答网络请求。
Socket 并不是协议,是针对 TCP/IP 协议层抽象出来的 API。
WebSocket 跟 HTTP 协议一样也是应用层协议。为了兼容 HTTP 协议,它通过 HTTP 协议进行一次握手(这里的握手指应用协议层,不是TCP层,握手时,TCP连接已建立),握手后数据就可以直接从 TCP 层传输,与 HTTP 协议再无关系。
即 HTTP请求里带有 WebSocket 的请求头,服务端回复也带有 websocket 的响应头。
来看一个通过HTTP升级的 WebSocket 连接:
3.HTTP 连接头部
毕竟三次握手还是很耗时的,在 HTTP/1.0 刚出现的时候,开发者就意识到 HTTP 持久连接的重要性,所以后续实现都采用了 Keep-Alive 来表示这个请求支持连接持久化。
3.1 Keep-Alive的作用是什么?
使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive 避免了重新建立连接,达到连接复用。
缺点:
对于提供静态内容的网站来说,这个功能通常很有用。但是对于负担较重的网站来说,虽然为客户保留打开的连 接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源却仍旧被占用。
解决办法:
比如 Keep-Alive: timeout=5, max=100
timeout:过期时间5秒(对应 tomcat 中 httpd.conf 里的参数是:KeepAliveTimeout)
max:最多100次请求,强制断掉连接。就是在 timeout 时间内又有新的连接过来,同时max会自动减1,直到为0,强制断掉。
3.2 逐跳头部
Connection 头部一般会表示哪些头部是属于逐跳头部(hop-by-hop header),用来描述当前浏览器与直连服务器(比如Nginx反向代理)的连接信息。
比如 Keep-Alive 头部,仅仅表示浏览器尝试与 Nginx 连接持久化,而不管 Nginx 和后端服务器之间的连接,不应当被 Nginx 代理原样地传递给后端服务器。
默认的逐跳头部如下:
- [Connection]
- [Keep-Alive]
- [Proxy-Authenticate]
- [Proxy-Authorization]
- [TE]
- [Trailers]
- [Transfer-Encoding]
- [Upgrade]
其他的头部都是 端到端头部(end-to-end header),用来描述浏览器和最终处理请求的服务器之间的信息,比如Accept 头部,表示客户端想从后端服务器得到的数据类型,而和中间的 Nginx 代理无关,Nginx 不能修改这些头部。
3.3 为什么要同时带上 Connection 和 Upgrade 头部?
Connection 头部和 Upgrade 头部有不同的语义和使用场景:
- Connection: Upgrade 表示 Upgrade 是一个 hop-by-hop 的字段。这个头部是给 proxy 看的
- Upgrade: websocket 表示浏览器想要升级到 WebSocket 协议。这个头部是给最终处理请求的服务看的
RFC 规定如果只有Upgrade: websocket,说明proxy不支持WebSocket升级,应该视为普通 HTTP 请求。
RFC(Request For Comments)文档是目前关于某项技术官方维护的最全面、最权威的文档,是学习技术最重要的来源,享有网络知识圣经之美誉。
RFC的最初目的是为了把互联网研究者所完成的工作形成一个方便有用的文档以利于交流。最终,RFC文档成为了互联网的设计、架构、技术标准等内容的官方文档。
参考:
https://robberphex.com/why-is-connection-upgrade-necessary/
https://bbs.huaweicloud.com/blogs/351314?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=other&utm_content=content
【WebSocket 第一篇】从一个WebSocket连接说起相关推荐
- websocket php apache,PHP第一篇:PHP WebSocket实现前后端数据交互,亲测可用(windows+ apache2.4 +php5.6 )...
首先贴上参考的教程: ①:https://blog.csdn.net/lian772882/article/details/81386115(主) ②:https://www.cnblogs.com/ ...
- 第一篇:Django基础
Django框架第一篇基础 一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model ...
- Android通过WebSocket建立一个长连接(带心跳检测)从服务器端接收消息
最近公司要做一款内部使用的工具类app,方便销售部门打电话(其实就是在后台有好多用户数据,之前销售部门同事拨打电话,需要自己从销售后台查看用户手机号等信息,然后自己拿自己手机拨号,然后打出去.现在想实 ...
- js websocket同步等待_WebSocket硬核入门:200行代码,教你徒手撸一个WebSocket服务器...
本文原题"Node.js - 200 多行代码实现 Websocket 协议",为了提升内容品质,有较大修订. 1.引言 最近正在研究 WebSocket 相关的知识,想着如何能自 ...
- WebSocket 初识篇
本文将基于腾讯云Lighthouse(轻量应用服务器)实例,对WebSocket进行简单的示例演示,以及初步的协议原理探索.帮助大家直观地感受双向通讯的特点以及常见的基于JavaScript的实现方法 ...
- websocket 带头部信息请求 header_关于websocket跨域的一个奇怪问题
最近在建设 websocket 长连接网关,过程中遇到一件比较奇怪的事情,做下简单的记录. 需求十分的简单,websocket 网关在做权限校验的时候期望复用现有登录逻辑的 jwt-token.如下图 ...
- 三分钟教你用 Scarlet 写一个 WebSocket App
作者 | Eason 来源 | 程序员巴士 在移动应用程序中,数据层是屏幕上显示内容的真实来源.然而,在今年早些时候在 Tinder 中集成了 WebSocket API 时,维护它成为了一个令人头疼 ...
- uniapp APP 端 WebSocket 使用,实现一个简单 WebSocket 工具类
背景 最近有需求要做一个简单业务的 APP 应用,简单考虑选用 uniapp + uview + vue2.x 方案,因为还有web端页面也需要用到 WebSocket ,简单封装了一个适应 web ...
- ThinkPHP5.0的think-swoole 开启WebSocket的SSL支持 使用wss连接
相关文章:ThinkPHP5.0结合Swoole开发WebSocket在线聊天 Swoole WebSocket开启SSL支持 使用wss连接 找到think-swoole的Server.php: 在 ...
最新文章
- html中隐藏溢出怎么写,html-如何隐藏表行溢出?
- 做技术的,年龄大了你慌吗?
- Swift:subscript
- Sql Server 关于整表插入另一个表部分列的语法以及select 语句直接插入临时表的语法...
- imdb数据集_朴素贝叶斯分类imdb(代码分享)
- Java增强之并发编程
- sql相同顺序法和一次封锁法_数学专题 | Ep01 隔板法的妙用
- 配置LINUX的DNS主辅服务器
- mysql配置 | 快速上手Linux玩转典型应用
- 今天我必须要全网曝光这几个公众号
- c语言计算器自动计算源代码,c语言计算器源代码
- proteus设计教程-数码管使用方法
- servlet运行html乱码,使用tomcat运行servlet时中文乱码的解决
- 快速实现远程控制Android手机
- Iterative Linear Quadratic Gaussian(iLQG)
- CAD2015 C#二次开发 字体变形
- android canvas画图gc,自定义控件绘图(Canvas,Paint,Region等)篇一
- Java 泛型类、泛型方法和泛型接口
- 集成产品开发,不让你的产品变现脚踩西瓜皮
- 基于阈值的全零块判决算法