有很多关于websocket和HTTP的博客和讨论,许多开发人员和网站强烈主张websockets,但我仍然不明白为什么。

例如(websocket爱好者的参数):

HTML5 Web Sockets represents the next evolution of web communications—a full-duplex,bidirectional communications channel that operates through a single socket over the Web.
( 07000 )

HTTP支持流:请求正文流(您在上传大文件时使用它)和响应正文流。

During making connection with WebSocket,client and server exchange data per frame which is 2 bytes each,compared to 8 kilo bytes of http header when you do continuous polling.

为什么这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问题与长期连接仍然存在。

题:

>为什么websockets协议更好?
>为什么实现它而不是更新http协议?

1)为什么WebSockets协议更好?

WebSockets更适合涉及低延迟通信的情况,特别是对于客户端到服务器消息的低延迟。对于服务器到客户端数据,您可以使用长期连接和分块传输获得相当低的延迟。然而,这不会帮助客户端到服务器的延迟,这需要为每个客户端到服务器消息建立新的连接。

您的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和WebSockets具有相同大小的初始连接握手,但是对于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草案提案的introduction中所指出的,HTTP 1.1流水线不被广泛部署,因此这极大地限制了HTTP 1.1的用于解决浏览器和服务器之间的延迟的效用。
>长轮询:对服务器不立即响应(或仅部分响应报头)到客户端请求的HTTP(1.0或1.1)的“hack”排序。在服务器响应之后,客户端立即发送新的请求(如果通过HTTP 1.1,则使用相同的连接)。
> HTTP流传输:允许服务器向单个客户端请求发送多个响应的各种技术(multipart / chunked响应)。 W3C正在使用文本/事件流MIME类型将其标准化为Server-Sent Events。浏览器API(非常类似于WebSocket API)被称为EventSource API。
>彗星/服务器推送:这是一个包括长轮询和HTTP流的总称。 Comet库通常支持多种技术来尝试并最大化跨浏览器和跨服务器支持。
> WebSockets:基于传输层的内置TCP,使用HTTP友好的升级握手。与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/C++U-WebRTC:允许浏览器之间建立对等连接的建议。这可以实现较低的平均和最大等待时间通信,因为作为底层传输是SDP /数据报而不是TCP。这允许分组/消息的无序传送,这避免了由延迟所有后续分组的传送的丢弃分组引起的延迟尖峰的TCP问题(以保证按序传送)。
> QUIC:是一个旨在减少Web延迟的实验协议。表面上,QUIC非常类似于在UDP上实现的TCP TLS SPDY。 QUIC提供等价于HTTP / 2的复用和流控制,等同于TLS的安全性,以及等同于TCP的连接语义,可靠性和拥塞控制。因为TCP在操作系统内核和中间件固件中实现,对TCP进行重大更改是不可能的。然而,由于QUIC是建立在UDP之上的,它没有这样的限制。 QUIC是针对HTTP / 2语义设计和优化的。

参考文献:

> HTTP:

> Wikipedia HTTP Page
> W3C List of HTTP related Drafts/Protocols
> List of IETF HTTP/1.1 and HTTP/2.0 Drafts

>服务器发送事件:

> W3C Server-Sent Events/EventSource Candidate Recommendation
> W3C Server-Sent Events/EventSource Draft

> WebSockets:

> IETF RFC 6455 WebSockets Protocol
> IETF RFC 6455 WebSocket Errata

> SPDY:

> IETF SPDY Draft

> HTTP 2.0:

> IETF HTTP 2.0 httpbis-http2 Draft
> IETF HTTP 2.0 httpbis-speed-mobility Draft
> IETF httpbis-network-friendly Draft – 一个旧的HTTP 2.0相关提议

> WebRTC:

> W3C WebRTC API Draft
> List of IETF WebRTC Drafts
> IETF WebRTC Overview Draft
> IETF WebRTC DataChannel Draft
> Microsoft CU-WebRTC Proposal Start Page

> QUIC:

> QUIC Chrominum Project
> IETF QUIC Draft

ajax – WebSockets协议与HTTP的更多相关文章

  1. 当iOS应用程序进入后台时,TCP和UDP(与多播)连接会发生什么

    我创建了几个实验:设置1:我创建了一个TCPSender应用程序和一个TCPReceiver应用程序.在本次实验中,我在iOS设备上启动了TCPSender,在另一台iOS设备上启动了TCPReceiver.然后两者都经过验证已建立连接并发送和接收数据.然后我将TCPReceiver应用程序置于后台.TCPSender应用程序指示连接丢失和崩溃(是的,我打算这样).设置2:我创建了一个UDPSen

  2. 通过AFNetworking 2.0上传iOS图像

    我一直在寻找新的AFNetworking2.0上传图像的例子.但是我正在撞墙,无法弄清楚代码有什么问题.所以这是我使用的代码TIA解决方法我最终使用了多部分请求

  3. ios – 在Objective-C中发送分块的HTTP 1.1请求

    我有以下问题:我正在创建一个非常大的SOAP请求(数据是一个编码为Base64字符串的视频),因此我不能将其作为原始SOAP请求发送,而是需要在HTTP1.1块中发送它.我似乎无法弄明白该怎么做.我在这里使用了代码:WhatarealternativestoNSURLConnectionforchunkedtransferencoding但它似乎没有做我认为应该做的事情–我可以看到请求作为单个请求

  4. 在iOS中,如何增加主机的HTTP连接限制?

    使用Xcode网络工具,我分析说,我每次只能建立每个主机的4个TCP连接.似乎iOS的每个主机的默认TCP连接限制为4.我们如何增加这个限制?

  5. ios – Swift2.0 HTTP请求无法正常工作

    参见英文答案>TransportsecurityhasblockedacleartextHTTP23个HelloStackoverflow,我将swift应用程序移动到Swift2.0后,我不断收到此错误:我看了下面的链接https://forums.developer.apple.com/thread/5835并将以下代码添加到我的info.plist中它仍然不起作用,任何人都有替代解决方案?解

  6. iOS 9上的NSURLConnection不使用HTTP / 2协议

    我在Jetty9.3服务器上配置了HTTP/2,它有一个有效的证书和Ssllabs.com给它一个A级安全配置.使用Chrome浏览器到https://example.com浏览加载了正确的响应,它还报告使用了“h2”(HTTP/2“)协议.但是当尝试使用NSURLConnection从iOS9访问相同的URL时,我可以在请求日志中看到它使用了HTTP1.1.如果我在我的服务器上禁用HTTP1.1

  7. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  8. 如何在Swift语言中创建http请求

    概述:本文通过实例从同步和异步两种方式上回答了”如何在Swift语言中创建http请求“的问题。如果你对Objective-C比较了解的话,对于如何创建http请求你一定驾轻就熟了,而新语言Swift与其相比只有语法上的区别。但是,对才接触到这个崭新平台的初学者来说,他们仍然想知道“如何在Swift语言中创建http请求?”。在这里,我将作出一些建议来回答上述问题。常见的创建http请求的方式主要

  9. Swift HTTP请求集合

    )->Voidinprintln})带参数的get请求varrequest=HTTPTask()request.GET("http://google.com",parameters:["param":"param1","array":["firstarrayelement","second","third"],"num":23],arial;font-size:14px;line-height:21px">println("response:\(response.responSEObject!)")POS

  10. swift 自带HTTP请求

    )->Voidiniferror!=nil{println(error)}else{println(data)}}funcHTTPGet(url:String,callback:(String,String?)->Void){varrequest=NSMutableuRLRequest(URL:NSURL(string:url)!)HTTPsendRequest(request,callback)}funcHTTPsendRequest(request:NSMutableuRLRequest,callba

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到<input>中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部