博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebSocket 是什么原理?为什么可以实现持久连接
阅读量:5972 次
发布时间:2019-06-19

本文共 1329 字,大约阅读时间需要 4 分钟。

你可以把 WebSocket 看成是 HTTP 协议为了支持长连接所打的一个大补丁,它和 HTTP 有一些共性,是为了解决 HTTP 本身无法解决的某些问题而做出的一个改良设计。在以前 HTTP 协议中所谓的 keep-alive connection 是指在一次 TCP 连接中完成多个 HTTP 请求,但是对每个请求仍然要单独发 header;所谓的 polling 是指从客户端(一般就是浏览器)不断主动的向服务器发 HTTP 请求查询是否有。这两种模式有一个共同的缺点,就是除了真正的数据部分外,服务器和客户端还要大量交换 HTTP header,效率很低。它们建立的“长连接”都是伪.长连接,只不过好处是不需要对现有的 HTTP server 和浏览器架构做修改就能实现。 WebSocket 解决的第一个问题是,通过第一个 HTTP request 建立了 TCP 连接之后,之后的交换数据都不需要再发 HTTP request了,使得这个长连接变成了一个真.长连接。但是不需要发送 HTTP header就能交换数据显然和原有的 HTTP 协议是有区别的,所以它需要对服务器和客户端都进行升级才能实现。在此基础上 WebSocket 还是一个双通道的连接,在同一个 TCP 连接上既可以发也可以收信息。此外还有 multiplexing 功能,几个不同的 URI 可以复用同一个 WebSocket 连接。这些都是原来的 HTTP 不能做到的。 另外说一点技术细节,因为看到有人提问 WebSocket 可能进入某种半死不活的状态。这实际上也是原有的一些缺陷性设计。上面所说的 WebSocket 真.长连接虽然解决了服务器和客户端两边的问题,但坑爹的是网络应用除了服务器和客户端之外,另一个巨大的存在是中间的网络链路。一个 HTTP/WebSocket 连接往往要经过无数的路由,防火墙。你以为你的数据是在一个“连接”中发送的,实际上它要跨越千山万水,经过无数次转发,过滤,才能最终抵达终点。在这过程中,中间节点的处理方法很可能会让你意想不到。 比如说,这些坑爹的中间节点可能会认为一份连接在一段时间内没有数据发送就等于失效,它们会自作主张的切断这些连接。在这种情况下,不论服务器还是客户端都不会收到任何提示,它们只会一厢情愿的以为彼此间的红线还在,徒劳地一边又一边地发送抵达不了彼岸的信息。而协议栈的实现中又会有一层套一层的缓存,除非填满这些缓存,你的程序根本不会发现任何错误。这样,本来一个美好的 WebSocket 长连接,就可能在毫不知情的情况下进入了半死不活状态。 而解决方案,WebSocket 的设计者们也早已想过。就是让服务器和客户端能够发送 Ping/Pong Frame(RFC 6455 - The WebSocket Protocol)。这种 Frame 是一种特殊的数据包,它只包含一些元数据而不需要真正的 Data Payload,可以在不影响 Application 的情况下维持住中间网络的连接状态。

转载于:https://www.cnblogs.com/wangcp-2014/p/5169971.html

你可能感兴趣的文章
[CTO札记]业务流程图Sample
查看>>
2008年新作——《网管员面试宝典》上市了
查看>>
spring rest 容易被忽视的后端服务 chunked 性能问题
查看>>
我的实用设计模式之关于Policy-based design
查看>>
快速排序(quicksort)算法实现
查看>>
《寒假换装攻略》获奖公布
查看>>
ExtJS 文件浏览器,可以选择文件和文件夹
查看>>
Repository 仓储,你的归宿究竟在哪?(三)-SELECT 某某某。。。
查看>>
iOS:内存管理(一):OC中的内存管理
查看>>
SharePoint 2013 启用 以其他用户身份登陆(Sign in as different user)
查看>>
都是Login惹得祸
查看>>
MATLAB插值
查看>>
[C++][基础]5_标准库类型
查看>>
我常用的那些linux命令
查看>>
Asp.net MVC – Controller
查看>>
LINQ to SQL精彩文章收集
查看>>
获取用户登录次数(cookie)
查看>>
在亚洲最HOT的地方做最IN的事
查看>>
Storm概念学习系列之Stream消息流 和 Stream Grouping 消息流组
查看>>
Net设计模式实例之装饰者模式(Decorator Pattern)
查看>>