欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于HTTP的协议

程序员文章站 2022-07-10 15:31:34
...

声明:本人的所有博客皆为个人笔记,作为个人知识索引使用,因此在叙述上存在逻辑不通顺、跨度大等问题,希望理解。分享出来仅供大家学习翻阅,若有错误希望指出,感谢!

基于HTTP的协议

SPDY

其开发目标在解决HTTP的性能瓶颈,缩短Web页面的加载时间(50%)

HTTP的瓶颈

  • 一条连接上只可发送一个请求
  • 请求只能从客户端开始,客户端不可以接收除响应以外的指令
  • 请求/响应首部未经压缩就发送,首部信息越多延迟越大
  • 发送冗长的首部,每次互相发送相同的首部造成的浪费较多
  • 可任意选择数据压缩格式,非强制压缩发送

Ajax解决方案

Ajax(Asynchronous JavaScript and XML)是一种利用JavaScript和DOM的操作,以达到局部web页面替换加载的异步通信手段,由于它只更新一部分页面,响应中传输的数据量会因此减少

  • Ajax的核心技术是名为XMLHttpRequest的API,通过JavaScript脚本语言的调用就能和服务器进行HTTP通信
  • 利用Ajax实时从服务器获取内容,有可能会导致大量请求产生,另外Ajax未解决HTTP协议本身存在的问题

Coment解决方案

一旦服务器端有内容更新了,Coment不会让请求等待,而是直接给客户端返回响应这是一种通过延迟应答,模拟实现服务器端向客户端推送的功能

  • 为了实现推送功能,Comet会先将响应置于挂起状态,当服务器端有内容更新时,再返回该响应。因此,服务器端一旦有更新, 就可以立即反馈给客户端
  • 内容上虽然可以做到实时更新,但为了保留响应,一次连接的持续时间也变长了。期间,为了维持连接会消耗更多的资源。另外,Comet也仍未解决HTTP协议本身存在的问题

SPDY 的设计与功能

  • SPDY没有完全改写HTTP协议,而是在TCP/IP的应用层与传输层之间通过新加会话层的形式运作。同时,考虑到安全性问题,SPDY规定通信中使用SSL
  • SPDY以会话层的形式加人,控制对数据的流动,但还是采用HTTP建立通信连接。因此,可照常使用HTTP的GET和POST等方法、Cookie 以及HTTP报文等

使用SPDY后,HTTP协议额外获得以下功能

多路复用流

通过单一的TCP连接,可以无限制处理多个HTTP请求,所有请求的处理都在一条TCP连接上完成,因此TCP的处理效率得到提高

赋子请求优先级

SPDY不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题

压缩HTTP首部

用缩HTTP请求和响应的首部。这样一来, 通信产生的数据包数量和发送的字节数就更少了

推送功能

支持服务器主动向客户端推送数据的功能。这样,服务器可直接发送数据,而不必等待客户端的请求

服务器提示功能

服务器可以主动提示客户端请求所需的资源。由于在客户端发现资源之前就可以获知资源的存在,因此在资源已缓存等情况下,可以避免发送不必要的请求

全双工通信WebSocket

WebSocket 的设计与功能

  • WebSocket,即Web浏览器与Web服务器之间全双工通信标准
  • WebSocket技术主要是为了解决Ajax和Comet里XMLHttpRequest附带的缺陷所引起的问题

WebSocket 协议

  • 一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON、XML、HTML或图片等任意格式的数据
  • 由于是建立在HTTP基础上的协议,因此连接的发起方仍是客户端,而一旦确立WebSocket通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文

WebSocket 协议的主要特点:

推送功能

支持由服务器向客户端推送数据的推送功能。这样,服务器可直接发送数据,而不必等待客户端的请求

减少通信量

只要建立起WebSocket连接,就希望一直保持连接状态。 和HTTP相比,不但每次连接时的总开销减少,而且由于WebSocket的首部信息很小,通信量也相应减少了


为了实现WebSocket通信,在HTTP连接建立之后,需要完成一次“握手”的步骤

握手:请求

为了实现WebSocket通信,需要用到HTTP的Upgrade首部字段,告知服务器通信协议发生改变,以达到握手的目的

GET /chat HTTP/1.1
Host:server.example.com
Upgrade:websocket
Connection:Upgrade
Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==
Origin:http://example.com
Sec-WebSocket-Protocol:chat,superchat
Sec-WebSocket-Version:13
  • ScWebSokrKkey字段内记录着握手过程中必不可少的建值
  • Sec-WebSocket-Protocol字段内记录使用的子协议
    • 子协议按WebSocket协议标准在连接分开使用时,定义那些连接的名称

握手:响应

对于之前的请求,返回状态码101 Switching Protocols的响应

HTTP /1.1 101 Switching Protocols
Upgrade:websocket
Connection:Upgrade
Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbk+xOo=
Sec-WebSocket-Protocol:chat
  • See-Websocket-Accept的字段值是由握手请求中的Sec-WebSocket-Key的字段值生成的

成功握手确立Websocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧

WebSocket API

JavaScript可调用"The WebSocket API”内提供的WebSocket 程序接口,以实现WebSocket协议下全双工通信

以下为调用WebSocket API,每50ms发送一次数据的实例

var socket = new WebSocket('ws://game.example.com:12010/updates')
socket.onopen = function(){
    setInterval(function(){
        if(socket.bufferedAmount == 0)
            socket.send(getUpdateData())
    },50);
};
相关标签: http协议 http