有许多博客和有关的WebSocket和HTTP,和许多开发人员和网站大力提倡的WebSockets的讨论,但我仍然不明白为什么。
例如(WebSocket的爱好者的参数):
HTML5的Web套接字代表的网络通信,全双工,双向通信信道的下一个演进,通过在Web上的单个插座进行操作。 ( http://www.websocket.org/quantum.html )
HTTP支持流:请求体流(你正在使用它,而上传大文件)和响应体流。
期间进行,每帧是每2个字节,相较于HTTP头的8千个字节当你连续轮询的WebSocket,客户端和服务器交换数据连接。
为什么这2个字节不包括TCP和在TCP协议的开销?
GET /about.html HTTP/1.1
Host: example.org
这是〜48个字节的HTTP标头。
HTTP分块编码- 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的问题仍然存在。
题:
- 为什么网页套接字协议比较好?
- 为什么它实现的,而不是更新的HTTP协议?
Answer 1:
1)为什么网页套接字协议更好?
WebSocket是涉及特别适用于低延迟的客户端服务器消息低延迟通信的情况更好。 对于服务器到客户端的数据,你可以使用长期持有的连接得到相当低延时和分块传输。 然而,这不符合客户端到服务器的延迟,需要为每个客户服务器消息要建立一个新的连接帮助。
你的48字节HTTP握手不是现实世界的HTTP浏览器连接的地方,往往有发送作为请求(在两个方向),包括许多头和cookie数据的部分数据的几千字节现实。 下面是一个请求/响应于使用铬的例子:
实施例请求(2800个字节,包括cookie数据,490个字节的无cookie数据):
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连接在初始握手被执行一次,然后小消息仅具有(用于掩模值2页眉和4)的6个字节的开销。 延迟时间成本是不是从报头的尺寸那么大,但是从逻辑解析/处理/存储这些头。 此外,TCP连接建立等待时间可能比的大小或处理时间为每个请求更大的因子。
2)为什么它实现,而不是更新HTTP协议?
有努力,重新设计的HTTP协议来实现更好的性能和更低的延迟,如SPDY , HTTP 2.0和QUIC 。 这将提高普通的HTTP请求的情况,但很可能的WebSockets和/或的WebRTC DataChannel仍然会有较低的延迟对客户端比HTTP协议服务器的数据传输(或者它会看起来很像的WebSockets的模式中使用无论如何)。
更新 :
下面是考虑Web协议的框架:
- TCP:低电平,双向,全双工,和保证的顺序传输层。 没有浏览器的支持(通过插件/闪存除外)。
- HTTP 1.0:层叠在TCP请求-响应传输协议。 客户端发出一个完整的请求时,服务器对一个完整的响应,然后关闭连接。 请求方法(GET,POST,HEAD)对服务器上的资源的具体事务性的意义。
- HTTP 1.1:保持HTTP 1.0请求-响应的性质,但允许连接保持打开多个全请求/全响应(每个请求一个响应)。 仍然在请求和响应完整的报头但连接被重新使用,而不是关闭。 HTTP 1.1还增加了一些附加的请求方法(OPTIONS,PUT,DELETE,TRACE,CONNECT),其中还具有特定事务的含义。 然而,如在所提到的引入到HTTP 2.0建议草案,HTTP 1.1流水线不广泛部署所以这极大地限制了HTTP 1.1的实用程序来解决浏览器和服务器之间的延时。
- 长轮询 :种类的“黑客”到其中服务器立即不响应(或仅与标头部分响应)到客户端请求HTTP(1.0或1.1)。 服务器响应后,客户端立即发送新的请求(使用如果超过HTTP 1.1相同的连接)。
- HTTP流 :各种技术(多部分/分块响应),其允许服务器发送多于一个响应于单个客户机请求。 W3C正标准化这是服务器发送的事件使用
text/event-stream
MIME类型。 浏览器的API(这是相当类似的WebSocket API)被称为EventSource的API。 - 彗星/服务器推送 :这是一个总称,它包括长查询和HTTP流。 彗星库通常支持多种技术,试图最大限度地跨浏览器和跨服务器的支持。
- 的WebSockets:传输层内置于一个使用HTTP友好握手升级TCP。 不像TCP,它是流传输,的WebSockets是基于消息的传输:消息分隔在电线上并在满被重新组装递送给应用程序之前。 WebSocket连接是双向的,全双工和长寿命。 在初始握手请求/响应之后,没有事务语义并且存在每消息开销很小。 客户端和服务器可以在任何时间发送消息,并且必须异步处理消息的收据。
- SPDY:谷歌的使用更高效的有线协议而保持所有HTTP语义(请求/响应,饼干,编码)发起提出延长HTTP。 SPDY引入了一个新的帧格式(具有长度为前缀的帧),并且指定的方式来层叠HTTP请求/响应对到新的成帧层。 头可以被压缩,并且已经建立连接后,新的报头可以被发送。 有在浏览器和服务器SPDY的现实世界中实现。
- HTTP 2.0:具有相似的目标,SPDY:减少HTTP延迟时间和开销,同时保留HTTP语义。 当前草案从SPDY衍生并限定升级握手和数据成帧,这是非常相似握手和成帧WebSocket的标准。 一个替代HTTP 2.0建议草案(httpbis速迁移率)实际上使用的WebSockets用于传输层,并增加了SPDY复用和映射HTTP作为网页套接字延伸(WebSocket的扩展握手期间协商)。
- 的WebRTC / CU-的WebRTC:建议允许浏览器之间的对等网络连接。 这可以使较低的平均和最大等待时间通信,因为作为底层传输是SDP /数据报而不是TCP。 这允许乱序分组传输/这避免了延缓所有后续数据包的传送丢弃的数据包延迟高峰的TCP问题的消息(以保证按顺序传送)。
- QUIC:是一个实验方案旨在减少网络等待时间超过了TCP的。 从表面上看,QUIC非常类似于TCP + TLS + SPDY上UDP实现。 QUIC提供复用和流控制等效于HTTP / 2,安全相当于TLS,和连接语义,可靠性和拥塞控制equivalentto TCP。 因为TCP是在操作系统内核,中间件和固件实现,使得显著更改TCP几乎是不可能的。 然而,由于QUIC是建立在UDP之上,它从没有这样的限制受到影响。 QUIC被设计和用于HTTP / 2语义优化。
参考文献 :
- HTTP:
- 维基百科的HTTP页面
- HTTP相关的草案/协议的W3C名单
- IETF HTTP / 1.1和HTTP的列表/ 2.0草稿
- 服务器发送的事件 :
- W3C服务器发送的事件/ EventSource的候选推荐标准
- W3C服务器发送的事件/ EventSource的草案
- WebSockets简介 :
- IETF RFC 6455米的WebSockets协议
- IETF RFC 6455的WebSocket勘误
- SPDY:
- HTTP 2.0:
- IETF HTTP 2.0 httpbis-http2草案
- IETF HTTP 2.0 httpbis速迁移率草案
- IETF httpbis网络友好草案 -旧的HTTP 2.0的相关建议
- 的WebRTC:
- W3C的WebRTC API草案
- IETF的WebRTC草稿列表
- IETF的WebRTC草案概述
- IETF的WebRTC DataChannel草案
- 微软CU-的WebRTC议案起始页
- QUIC:
- QUIC Chrominum项目
- IETF草案QUIC
Answer 2:
你似乎认为的WebSocket是HTTP的替代品。 它不是。 这是一个扩展。
WebSockets的主要用例是其在Web浏览器中运行,并从服务器接收实时数据的JavaScript应用程序。 游戏是一个很好的例子。
的WebSockets之前,为Javascript应用程序与服务器进行交互的唯一方法是通过XmlHttpRequest
。 但这些有一个主要缺点:除非客户有明确要求它的服务器不能发送数据。
但新的WebSocket功能允许服务器就随时发送数据。 这使得实现了更低的延迟,也不必使用难看黑客如AJAX长轮询或浏览器插件,基于浏览器的游戏。
那么,为什么不使用普通的HTTP流媒体与请求和响应
在另一个答案评论你的建议只是流客户端请求和响应异步身体。
事实上,WebSockets的基本上都是这一点。 打开来自客户端的网页套接字连接的尝试,初看起来就像一个HTTP请求,但在头一个特殊的指令(升级:的WebSocket)告诉服务器开始在这个异步模式进行通信。 WebSocket协议的初稿并没有比这更和一些握手,以确保服务器实际上理解客户想要进行异步通信。 但随后人们认识到,代理服务器将通过混淆,因为它们用于HTTP的通常请求/响应模型。 一个潜在的攻击场景中对代理服务器被发现。 为了防止这种情况,有必要做出的WebSocket流量的外观不同于任何正常的HTTP流量。 这就是为什么屏蔽键在介绍该协议的最终版本 。
Answer 3:
对于TL; DR,这里有2美分,为您的问题一个简单的版本:
的WebSockets提供了HTTP这些好处:
- 对于连接的持续时间持续的状态连接
- 低延迟:邻近服务器/客户端之间的实时通信,由于没有开销,因为HTTP需要重新建立为每个请求连接。
- 全双工:服务器和客户端可以发送/接收simutaneously
的WebSocket和HTTP协议已经被设计为解决不同的问题,IE的WebSocket旨在改善双向通信,而HTTP被设计为无状态的,使用请求/响应模型分布。 除了共享遗留原因(防火墙/代理穿透)端口,没有太多的共同点,将它们组合成一个协议。
Answer 4:
为什么网页套接字协议比较好?
我不认为我们可以像谁是更好的并排比较。 这会不会仅仅是因为他们正在解决两个不同的问题比较公平。 他们的要求是不同的。 它会像比较苹果和橘子。 它们是不同的。
HTTP是一种请求-响应协议。 客户端(浏览器)想要的东西,服务器给它。 那是。 如果数据客户端要大,服务器可能会发送数据流作废不必要的缓冲问题。 这里主要要求或问题是如何从客户的要求,以及如何响应的资源(hybertext),他们请求。 这就是HTTP大放异彩。
在HTTP中,只有客户机请求。 服务器只响应。
的WebSocket不是请求-响应协议,其中只有客户端可以请求。 这是一个插座(非常类似于TCP套接字)。 意味着一旦连接打开,直到强调TCP连接关闭任何一方都可以发送数据。 它就像一个正常的插座。 通过TCP套接字唯一的区别是WebSocket的可在网络中使用。 在网上,我们有一个正常的插座很多限制。 大多数防火墙将阻止其他端口大于80,并且使用HTTP 433。 代理和中介会产生问题,因为well.So使协议更容易部署到现有的WebSocket使用HTTP握手来升级基础设施。 当第一次连接时要打开这意味着,客户端发送HTTP请求到服务器告诉说:“这不是HTTP请求,请升级到WebSocket协议”。
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
一旦服务器识别请求和升级到WebSocket协议,没有HTTP协议的应用的任何更多。
所以,我的答案是两者都不比对方更好。 他们是完全不同的。
为什么它实现的,而不是更新的HTTP协议?
那么我们可以把名字叫做HTTP下的一切,以及。 但是,我们应? 如果它们是两个不同的东西,我会选择两个不同的名字。 所以,做希克森和迈克尔·卡特 。
Answer 5:
其他答案似乎并不在这里的一个关键方面接触,那就是你没有提及需要支持的web浏览器作为客户端的。 最上面的普通HTTP的限制是假设你将与浏览器/ JS实现合作。
HTTP协议完全能够进行全双工通信的; 它是合法的,有一个客户端执行与分块编码传送的POST和服务器返回一个编码分块体的响应。 这将消除头开销,只是在初始时间。
所以,如果你正在寻找的是全双工,同时控制客户端和服务器,并没有兴趣额外的成帧/的WebSockets的功能,那么我认为HTTP与更低的延迟/ CPU更简单的方法(虽然延迟真的只能在微秒或更少的差异,无论是)。
Answer 6:
一个普通的REST API使用HTTP作为底层协议进行通信,这是继请求和响应模式,这意味着通信涉及所述客户端从服务器请求的一些数据或资源,并且服务器响应回该客户端。 然而,HTTP是无状态协议,所以每一个请求 - 响应周期将最终不得不重复报头和元数据信息。 这导致额外的延迟在频繁地重复请求 - 响应周期的情况下。
用的WebSockets ,虽然通信仍然启动关闭作为初始HTTP握手,它是进一步升级跟随的WebSockets协议(即,如果在服务器和客户端都符合协议,因为不是所有的实体支持的WebSockets协议)。
现在用的WebSockets ,可以建立一个全双工和客户端与服务器之间的持久连接。 这意味着,不同的请求和响应,因为在应用程序运行的连接保持打开状态,只要(也就是说,它的持久性),而且因为它是全双工,双向同时通信成为可能,即现在的服务器能够启动的的通信和“推”一些数据,当新数据(即在客户端感兴趣的)变得可用的客户端。
该网页套接字协议是有状态的,可以让你实现发布-订阅(或发布/订阅),这是在你能够在服务器推送的形式来获得新的更新,而不在实时技术使用的主要概念消息传递模式不得不请求(刷新页面)反复客户端。 这种应用的例子是尤伯杯车的定位跟踪,推送通知,股票的市场价格在实时更新,聊天,多人游戏,实时在线协作工具等。
您可以检查出深潜文章的WebSockets ,说明此项协议,它是如何应运而生,就是它的使用的历史,你怎么能实现它自己。
下面是一个演示我做了有关的WebSockets以及它们是如何比使用常规的REST API不同视频: 标准化和利用数据流的指数上升
文章来源: WebSockets protocol vs HTTP