1)为什么WebSockets协议更好?
对于涉及低延迟通信的情况,特别是对于客户端到服务器消息的低延迟,WebSockets更好。对于服务器到客户端的数据,您可以使用长期连接和分块传输来获得相当低的延迟。但是,这对客户端到服务器的延迟没有帮助,后者需要为每个客户端到服务器的消息建立一个新的连接。
对于实际的HTTP浏览器连接来说,您的48字节HTTP握手是不现实的,在实际的HTTP浏览器连接中,作为请求的一部分(双向)通常发送几千字节的数据,其中包括许多标头和cookie数据。这是使用Chrome的请求/响应的示例:
请求示例(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和WebSocket都具有相同大小的初始连接握手,但是对于WebSocket连接,初始握手执行一次,然后小消息仅具有6个字节的开销(头2个,掩码值4个)。延迟开销不是来自标头的大小,而是来自解析/处理/存储这些标头的逻辑。此外,TCP连接建立延迟可能是每个请求的大小或处理时间之外的更大因素。
2)为什么实施它而不是更新HTTP协议?
我们正在努力重新设计HTTP协议,以实现更好的性能和更低的延迟,例如SPDY,HTTP 2.0和QUIC。这将改善正常HTTP请求的情况,但是WebSockets和/或WebRTC DataChannel可能仍然比HTTP协议具有更低的客户端到服务器数据传输延迟(或者将在看起来非常像WebSockets的模式下使用)无论如何)。
更新:
这是用于考虑Web协议的框架:
- TCP:底层,双向,全双工和有保证的订单传输层。没有浏览器支持(通过插件/ Flash除外)。
- 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正在使用MIME类型将其标准化为服务器发送的事件
text/event-stream
。浏览器API(与WebSocket API非常相似)称为EventSource API。
- 彗星/服务器推送:这是一个概括性术语,包括长轮询和HTTP流。彗星库通常支持多种技术,以尝试并最大化跨浏览器和跨服务器的支持。
- WebSockets:传输层内置的TCP,使用HTTP友好的Upgrade握手。与TCP(一种流传输)不同,WebSockets是一种基于消息的传输:消息在网络上是定界的,并在交付给应用程序之前被完全重组。WebSocket连接是双向的,全双工的且寿命长。在初始握手请求/响应之后,没有事务语义,每个消息的开销也很小。客户端和服务器可以随时发送消息,并且必须异步处理消息接收。
- SPDY:由Google发起的一项提案,旨在使用更有效的有线协议扩展HTTP,但保留所有HTTP语义(请求/响应,cookie,编码)。SPDY引入了一种新的框架格式(带有长度前缀的帧),并指定了一种将HTTP请求/响应对分层到新框架层上的方法。建立连接后,可以压缩报头并发送新的报头。在浏览器和服务器中有SPDY的实际实现。
- HTTP 2.0:具有与SPDY类似的目标:减少HTTP延迟和开销,同时保留HTTP语义。当前草案是从SPDY派生的,它定义了升级握手和数据框架,该框架与WebSocket标准的握手和框架非常相似。备用HTTP 2.0草案建议书(httpbis-speed-mobility)实际上将WebSockets用于传输层,并将SPDY复用和HTTP映射添加为WebSocket扩展(在握手过程中协商WebSocket扩展)。
- WebRTC / CU-WebRTC:允许浏览器之间进行点对点连接的建议。由于底层传输是SDP /数据报而不是TCP,因此这可能启用较低的平均和最大延迟通信。这允许数据包/消息的无序传送,避免了TCP的问题,即由丢弃的数据包引起的延迟尖峰,从而延迟了所有后续数据包的传送(以保证顺序传送)。
- QUIC:是一种实验性协议,旨在通过TCP减少Web延迟。从表面上看,QUIC与在UDP上实现的TCP + TLS + SPDY非常相似。QUIC提供等效于HTTP / 2的多路复用和流控制,等效于TLS的安全性以及等效于TCP的连接语义,可靠性和拥塞控制。由于TCP是在操作系统内核和中间盒固件中实现的,因此对TCP进行重大更改几乎是不可能的。但是,由于QUIC是建立在UDP之上的,因此不受任何限制。QUIC针对HTTP / 2语义进行了设计和优化。
参考文献:
- HTTP:
- 服务器发送的事件:
- WebSockets:
- SPDY:
- HTTP 2.0:
- WebRTC:
- QUIC: