WebSockets协议vs HTTP
有很多关于websocket和HTTP的博客和讨论,许多开发人员和站点强烈提倡websocket,但我仍然不明白为什么。
例如(websocket爱好者的论点):
HTML5 Web Sockets代表了Web通信的下一个发展 - 一种全双工的双向通信通道,通过Web上的单个套接字进行操作。 (http://www.websocket.org/quantum.html)
HTTP支持流式传输:请求正文流式传输(您在上传大型文件时使用它)和响应正文流式传输。
在与WebSocket建立连接时,客户端和服务器每帧交换两个字节的数据,而在连续轮询时,与8千字节的http头相比。
为什么2个字节不包含tcp和tcp协议开销?
GET /about.html HTTP/1.1
Host: example.org
这是约48个字节的http头。
http chunked编码 - http://ru.wikipedia.org/wiki/Chunked_transfer_encoding:
23
This is the data in the first chunk
1A
and this is the second one
3
con
8
sequence
0
此外,这两种协议都是通过TCP协议工作的,因此所有具有长连接的TCP问题仍然存在。
题:
1)为什么WebSockets协议更好?
WebSockets更适合涉及低延迟通信的情况,尤其适用于客户端到服务器消息的低延迟。 对于服务器到客户端的数据,您可以使用长时间连接和分块传输获得相当低的延迟。 但是,这对客户端到服务器的延迟无效,这需要为每个客户端到服务器的消息建立一个新的连接。
您的48字节HTTP握手对于真实世界的HTTP浏览器连接而言并不现实,在这些连接中,经常会有几千字节的数据作为请求的一部分(双向)发送,包括许多标头和cookie数据。 以下是使用Chrome的请求/响应示例:
请求示例(包含Cookie数据的2800字节,不含Cookie数据的490字节):
GET / HTTP/1.1
Host: www.cnn.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.68 Safari/537.17
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: [[[2428 byte of cookie data]]]
响应示例(355字节):
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 13 Feb 2013 18:56:27 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: CG=US:TX:Arlington; path=/
Last-Modified: Wed, 13 Feb 2013 18:55:22 GMT
Vary: Accept-Encoding
Cache-Control: max-age=60, private
Expires: Wed, 13 Feb 2013 18:56:54 GMT
Content-Encoding: gzip
HTTP和WebSockets都具有相同大小的初始连接握手,但通过WebSocket连接,初始握手只执行一次,然后小消息只有6个字节的开销(标头为2,屏蔽值为4)。 延迟开销与标题大小没有多大关系,而是从逻辑来解析/处理/存储这些标题。 另外,TCP连接建立延迟可能比每个请求的大小或处理时间要大。
2)为什么实现而不是更新HTTP协议?
有人努力重新设计HTTP协议以实现更好的性能和更低的延迟,如SPDY,HTTP 2.0和QUIC。 这将改善正常HTTP请求的情况,但WebSockets和/或WebRTC DataChannel对于客户端到服务器的数据传输的延迟可能比HTTP协议的延迟更低(或者它将用于看起来像WebSockets无论如何)。
更新 :
这是一个思考网络协议的框架:
text/event-stream
MIME类型将其标准化为Server-Sent Events。 浏览器API(与WebSocket API非常相似)称为EventSource API。 参考 :
你似乎认为WebSocket是HTTP的替代品。 不是这样。 这是一个扩展。
WebSockets的主要用例是在Web浏览器中运行并从服务器接收实时数据的Javascript应用程序。 游戏就是一个很好的例子。
在WebSockets之前,Javascript应用程序与服务器交互的唯一方法是通过XmlHttpRequest
。 但是这些有一个主要的缺点:服务器不能发送数据,除非客户端明确要求它。
但新的WebSocket功能允许服务器随时发送数据。 这允许以低得多的延迟实现基于浏览器的游戏,而不必使用AJAX长轮询或浏览器插件等丑陋的黑客攻击。
那么为什么不使用正常的HTTP与流请求和响应
在对另一个答案的评论中,您建议只是异步流式传输客户端请求和响应主体。
事实上,WebSockets基本上就是这样。 尝试从客户端打开WebSocket连接看起来就像是一个HTTP请求,但头部中的一个特殊指令(Upgrade:websocket)告诉服务器以这种异步模式开始通信。 WebSocket协议的第一次草案并没有太多,有些握手以确保服务器真正了解客户端想要异步通信。 但是后来才意识到,代理服务器会被这样的混淆,因为它们习惯于HTTP的通常请求/响应模式。 发现了针对代理服务器的潜在攻击情形。 为了防止这种情况,有必要使WebSocket流量看起来不像任何正常的HTTP流量。 这就是为什么在协议的最终版本中引入掩码密钥的原因。
对于TL; DR,这里是2美分,对于你的问题更简单的版本:
WebSockets通过HTTP提供这些好处:
WebSocket和HTTP协议被设计为解决不同的问题,IE WebSocket旨在改进双向通信,而HTTP被设计为无状态,使用请求/响应模型进行分发。 除了因为遗留原因(防火墙/代理渗透)而共享端口之外,将它们组合成一个协议没有太多共同点。