阅读 5295

【 ➰斗艳争妍の网络协议姐妹花‍‍️➰】http协议 VS websocket协议

http协议

http简介

  • http

http(hypertext transfer protocol),“超文本传输协议”。

  • 超文本

包含有超链接和各种多媒体元素标记的文本。常见的超文本格式html(超文本标记语言)。

  • http协议

定义浏览器如何向web服务器发送请求,web服务器如何向浏览器进行响应。简言之,就是client端与server端进行数据传输的一种规则。

http工作原理

  • 请求/响应模型

用户点击www.baidu.com/index.html后…

  1. 分析链接
  2. 浏览器向dns请求分析www.baidu.com的ip
  3. dns将分析出的112.80.248.75返回给浏览器
  4. 浏览器与服务器建立tcp连接
  5. 浏览器向服务器请求:GET /index.html
  6. 服务器向浏览器回复:index.html内容
  7. 释放tcp连接
  8. 浏览器解析html元素并显示

简言之:建链->请求->响应->断开

  • 连接方式
  1. 非持久连接:浏览器每一个请求都创建一个新连接,当响应完毕后,连接就被释放。
  2. 持久连接:一个连接中,可以进行多次请求和响应。服务器在发送响应后,并不立即释放连接,可继续使用。
  • 无状态性

http协议本身不会对发送过的请求和响应的通讯状态进行持久化处理。

同一客户端(浏览器)第二次访问同一个web服务器时,服务端无法知道这个客户端是否曾经访问过。

无状态性保证了http协议的简单性,从而能够快速处理大量的事务,提高了效率。

通常使用cookie或附带其他参数(token)用来区分来源。

发展历程

  • http/1.0

每个tcp连接只能发送一个请求。发送数据完毕,该连接就关闭,如果还要请求其他资源,就必须再新建一个连接。非标Connection:keep-alive

  • http/1.1
  1. 持久连接(persistent connection):tcp连接默认不关闭,可以利用,无需声明Connection:keep-alive
  2. 管道机制(pipeline):在同一个tcp连接里,客户端可以同时发送多个请求。这样就进一步改进了http协议的效率。
  3. 字段(Content-Length):一个tcp连接现在可以传送多个回应,势必就要有一种机制,区分数据包是属于哪一个回应的。这就是Content-Length字段的作用,声明本次回应的数据长度。
  4. 分块传输编码

http报文结构(请求/响应报文结构)

请求报文和响应报文都是由以下4部分组成:

  1. 请求行/响应行
  2. 请求头/响应头
  3. 空行
  4. .消息主体(请求体/响应体)

http报文请求方法

方法含义
GET请求读取
POST请求添加
PUT存储
DELETE删除
HEAD请求信息首部
TRACE用于测试,要求服务器回收到请求
CONNECTION用于代理服务器
OPTION查询特定选项

http报文状态码

响应报文里的状态码:指明特定的请求是否被满足,如没有满足,给出原因。

状态码含义示例
1xx通知信息100:服务器正在处理客户端请求
2xx成功200:请求成功
3xx重定向301:重定向
4xx客户端错误403:禁止的页面;404:未找到
5xx服务器错误500:服务器内部错误

http协议短板

  • 请求/响应模型

请求/响应模型:通信只能由客户端发起,服务端不能主动发送消息给客户端。

sequenceDiagram
客户端->>服务器: 请求
服务器->>客户端: 响应
  • 轮巡polling技术

客户端以一定时间间隔向服务端发出请求,以频繁请求的方式来保持客户端和服务端的同步。其实大量的定时请求都是无效的,因为服务端数据并没有更新,相应地也导致了大量的带宽等资源浪费。

sequenceDiagram
客户端->>服务端:Connection Open
服务端->>客户端:Return data.Connection Close

Note left of 客户端:interval

客户端->>服务端:Connection Open
服务端->>客户端:Return data.Connection Close

Note left of 客户端:interval

客户端->>服务端:Connection Open
服务端->>客户端:Return data.Connection Close
  • 长轮询机制

http长轮询机制是指服务端收到请求后如果有数据,则立即响应请求;如果没有数据,就会停留一段时间,这段时间内,如果服务端请求的数据到了(数据查询完成等),就立刻响应;如果这段时间过后,还没有数据到达,则以空数据的形式响应http请求;若客户端收到的数据为空,会再次发送同样的http请求到服务端。

sequenceDiagram
客户端->>服务端:Connection open
Note right of 服务端:waiting(event trigger)
服务端->>客户端:Return data.Connection close.

客户端->>服务端:Connection open
Note right of 服务端:waiting(event trigger)
服务端->>客户端:Return data.Connection close.

长轮询是对定时轮询的改进和提高,目的是为了降低无效的网络传输。

当服务端没有数据更新时,连接会保持一个时间周期,直到数据或者状态改变,或者时间周期到了,通过这个机制来减少无效的客户端与服务端的交互。

然而这种机制存在一个问题:当客户端以固定频率向服务器发起请求时,服务器的数据有可能还没更新,这样就会带来很多无效的网络传输。同时可能延时一个时间周期的情况。

  • 流技术 http streaming

客户端发送获取数据更新请求到服务端时,服务端将保持该请求的响应数据流一直打开,只要有数据更新就实时地发送给客户端。

sequenceDiagram
客户端->>服务端:Connection Open
服务端->>客户端:Return data
Note right of 服务端:event(trigger)
服务端->>客户端:Return data
Note right of 服务端:event(trigger)
服务端->>客户端:Return data
Note right of 服务端:event(trigger)
服务端->>客户端:Return data.Connectio close
Note right of 服务端:close event(trigger) or timeout
客户端->>服务端:Connection Close

这种机制在用户体验上有一点问题,需要针对不同浏览器设计不同的方案来改进用户体验;另外这种机制在高并发的情况下,对服务端是硬件资源是一个很大的考验。

  • 总结一下,以上几种方案,都不是真正的实时,只是在用ajax的方法来模拟实时效果。每一次http请求或应答都带着完成的头信息,反复发送无效查询请求耗费了大量的带宽和硬件资源,方案也不是很理想。

websocket协议

工作流程

  • 客户端发起http请求

发起请求(Header里附加“upgrade:websocket”),然后等待服务端响应。

  • 服务端响应http

服务端响应后建立tcp通道。

  • 通过tcp互传数据

双向传输数据,客户端与服务端都可以发起请求。

  • 持续到关闭

这个连接会持续存在,直到客户端或者服务端的一方主动关闭连接

sequenceDiagram
Note over 客户端,服务端:Opening Handshake
客户端->>服务端:Handshake Request
服务端->>客户端:Handshake Response

Note over 客户端,服务端:Data Transfer(双向都可发起)
客户端->>服务端:Data Frame
服务端->>客户端:Data Frame

Note over 客户端,服务端:Closeing Handshake(双向都可发起)
客户端->>服务端:Closing Handshake Request
服务端->>客户端:Closing Handshake Response

基本概念

  • websocket是HTML5开始提供的一种在单个tcp连接上进行的全双工的通讯协议;
  • websocket api被w3c定为标准
  • 基于tcp的应用层协议
  • 建立连接时会使用http协议
  • 在websocket api中,客户端与服务端只需要一个握手动作,就能在客户端与服务端之间建立一个快速通道,两者之间就可以进行数据的相互传送(可以由双向主动发起)
层次划分协议
应用层HTTP,websocket,DNS,FTP,TELNET,SMTP
传输层TCP,UDP
网络层IP,ICMP
链路层ARP,RARP

特点

  • 与http协议有良好的兼容性。 默认端口也是80和443,并且握手阶段采用http协议。因此握手时不容易被屏蔽,能通过各种http代理服务器;
  • 可以发送文本,也可以发送二进制数据;
  • 没有同源限制,客户端可以与任意服务端通信;
  • 数据格式比较轻量,性能开销小,通信效率高;

编程接口

  • 建立连接和断开连接
  • 发送数据和接收数据
  • 处理错误

应用场景

  • 即时通信聊天
  • 多玩家游戏
  • 在线协同画图、文档、编辑
  • 实时数据流的拉取和推送
  • 体育、游戏、股票

差异比较

websocket、http、tcp

  • websocket与http属于应用层协议,它们都是通过tcp协议传输数据的;
  • websocket是全双工通信协议,http是单向的;
  • 对于websocket来说,它必须依赖http协议来完成一次握手,握手成功后,数据就直接从tcp通道来传输了,后面的流程就和http没有关系了;

即时通信聊天

  • 多玩家游戏
  • 在线协同画图、文档、编辑
  • 实时数据流的拉取和推送
  • 体育、游戏、股票

PK一波,差异比较

websocket、http、tcp

  • websocket与http属于应用层协议,它们都是通过tcp协议传输数据的;
  • websocket是全双工通信协议,http是单向的;
  • 对于websocket来说,它必须依赖http协议来完成一次握手,握手成功后,数据就直接从tcp通道来传输了,后面的流程就和http没有关系了;
文章分类
后端
文章标签