websocket出现是因为浏览器不给开后门,不是WebSocket基于HTTP,相反可看成是HTTP基于WebSocket。

1984年,人们使用TCP协议通讯,那时还没网页浏览器,都通过各种软件直接通讯。到1986,人们使用浏览器浏览网页,当时电脑时100MHz,100M内存。

早年TCP链接数量有限制,不是内存,主要是select函数效率问题,select要轮询所有连接才能确定有哪些已就绪。

引入epoll/kqueue完成端口后,效率问题解决,大量并发TCP连接得以实现。于是服务器要求“所有客户端,打开网页之后,必须关闭TCP连接”:HTTP初衷。按此协议,服务器接受TCP连接,几s内读数据,检验之后,回复数据,断开连接,节省“资源”。

20年后,QQ桌面版好好的,QQ网页版用的越来越多。由于浏览器都是连接之后很快断开,QQ网页版,只能靠各种polling方式持续交互数据(HTTP keep-alive也有缺点),浪费大量带宽(这时候带宽费用就大了),同时客户端收到消息也不及时,还有各种其它问题。QQ网页版想直接用TCP协议长时间连接,但QQ网页版能做的,都是浏览器允许才能做的。

websocket的出现就是因为浏览器不支持TCP直连,不给开后门。于是“希望所有浏览器都能直接进行TCP连接”,于是浏览器出现websocket协议。所以,因为某些原因,人们在TCP上弄个HTTP协议,把TCP支持的一些特性删除,然后若干年之后想要那些被删除的特性,返回TCP,于是出现WebSocket。WebSocket可看作HTTP的降级!

“不是WebSocket基于HTTP,而只是可以看成HTTP基于WebSocket”。WebSocket 不是 HTML5 的东西。

  • WebSocket 是个协议,归属于 IETF
  • WebSocket API 是一个 Web API,归属 W3C

两个规范独立发布。

广义 HTML5 包含 WebSocket API,并非 WebSocket。可将 WebSocket 当成 HTTP,WebSocket API 当成 Ajax。只是因 WebSocket 对非 Web 意义不大(毕竟直接用 TCP 就好),所以现实而言 WebSocket 目前基本只会通过 Web API 里的 WebSocket API 来使用。但并不等于 WebSocket 属于 WebSocket API。

HTTP是运行在TCP协议传输层上的应用协议,而WebSocket是通过HTTP协议协商如何连接,然后独立运行在TCP协议传输层上的应用协议。WebSocket仅利用HTTP协议做连接请求。WebSocket相当于一个简化版TCP传输子层(实际上WebSocket也是应用层协议)。WebSocket之所以能持久连接,是因为它运行在TCP协议,TCP协议自身是长连接协议,所以WebSocket当然能长连接。

为何HTTP不是长连接

早期HTTP在发起每个请求,响应完成后就会关闭Socket。但后来加了多路复用KeepAlive协议后,HTTP协议已经可实现长连接,可处理长连接事务。

至于添加WebSocket特性,是为更好、更灵活,轻量与服务器通讯。因为WebSocket提供简单的消息规范,可以更快适应长连接环境,其实现在HTTP协议自身就能做,但不太轻便。

为什么HTML4不支持WebSocket?

WebSocket的协商机制HTML4底层API没有实现。

为何会出现HTTP,WebSocket?_数据

  • 用于一
  • 为何会出现HTTP,WebSocket?_长连接_02

  • 用户二
  • 为何会出现HTTP,WebSocket?_服务器_03

  • TOM 群发了消息
  • 为何会出现HTTP,WebSocket?_服务器_04

  • Mike 也受到了消息的重创
  • 为何会出现HTTP,WebSocket?_服务器_05

参考