看完让你彻底搞懂Websocket原理,websocket和http的区别

WebSocket是什么原理?为什么可以实现持久连接?

看完让你彻底搞懂Websocket原理,websocket和http的区别


首先需要明白:基于TCP的应用层协议 , 只要设计者愿意 , 都是可以实现持久连接的 。你问的方式 , 大概是在和HTTP做比较 。HTTPhttp协议是请求应答式的文本协议 , 协议设计就是Client-Server模式 , 出发点是服务端为客户端提供资源 。http服务端只能监听和响应来自客户端的请求 , http客户端只能发起请求接受响应 , 这个是HTTP协议本身的设计 , 双向通信不在设计的考虑之内 。
关于Http协议 , 额外说点:HTTP1.0/0.9不支持keep-alive , 要完成一次HTTP请求 , 需要建立一个新的TCP连接 , 然后发送http请求 , 待接收响应后关闭连接 。HTTP1.1默认使用keep-alive , 一次HTTP请求完成后不会关闭TCP连接 , 会继续为下一个HTTP请求服务(可以类比数据库连接池和线程池的设计) , 减小建立和关闭TCP连接的开销(三次握手四次挥手) 。
当然闲置超时后也会关闭 。并非楼下所说的“把多个HTTP请求合并为一个” 。HTTP协议的设计无法实现对TCP通道的分用和复用 。因为HTTP协议没有请求的唯一标记(仅仅是URL是不行的 , 原因大家想)用来从同一TCP通道分离不同的HTTP消息 , 所以一个完整的HTTP请求在发送请求到响应回来之间是独占一个TCP通道的!是不是觉得HTTP对TCP的利用率太低了?而关于pipeline模式 , 不管在服务端还是客户端排队 , HTTP响应依然要通过进入服务端队列的顺序返回 , 这样才能和客户端HTTP请求队列用顺序做对应!所以pipeline模式某个请求被服务端因为某些原因阻塞了的情况下 , 后续请求都会阻塞 , 会引起很大的问题 , 实际上很少用 。
浏览器或者一般HTTP客户端组件为某一个服务器端点(域名 端口)保留4-6条活跃TCP连接 。你可以F12观察浏览器 , 看看同时是几个请求阻塞了就知道你的浏览器设置的多少 。比较大的门户网站 , 比如京东 , 首页请求非常多 , 但是大量都需要排队等TCP空闲 。限制客户端的连接数量的出发点主要是性能 , 否则会占用服务器太多Socket资源(考虑socket预留的读写缓冲区 , windows的内核对象或者linux的文件句柄)或者变相地造成DoS攻击 。
Tips:HTTP客户端组件一般会提供诸如ConnectionLimit的选项让你控制最大TCP连接数 。如果你是桌面客户端 , 或者请求远程服务 , 不宜设置过大 。如果你是内部服务之间调用 , 可以根据需求合理设置以增加并发性能 。HTTP2.0针对以上的问题(主要是性能)做了很多改进 , 这个也会提高很多人在后端不同服务器之间做通信时选择HTTP(我在HTTP2.0出来之前就是自己设计RPC方案) 。
详细的HTTP2.0的东西 , 这里不展开了 , 详细参考官方文档 。HTTP相关知识推荐《HTTP权威指南》以及相关的RFC文档 , 尽量少去看博客上面支离破碎的小知识 , 体系化的认知结构对你帮助更大 。WebSocketWebSocket的出现 , 就是为了解决http协议不支持双向通信的缺口 。所以WebSocket的握手协议就是使用的HTTP消息来Upgrade 。
【看完让你彻底搞懂Websocket原理,websocket和http的区别】现代的Web场景 , 服务端推送的需求非常大 , 这个发展过程中使用的Ajax轮询 , Comet等都只是临时解决方案 , 从设计上看 , 只为满足需求 , 一点都不优雅 。Html5规范将WebSocket纳入后 , 得到了现代几乎所有浏览器的支持 , 当然IE(10 才支持)仍然是一个巨坑 , 在乎用户覆盖面的产品依然要通过浏览器是否支持ws来做出降级处理(轮询、长连接) 。

推荐阅读