HTTP、WebSocket、STOMP、MQTT 协议

一、计算机网络的层次结构

1、两种模型(TCP/IP四层模型与OSI体系)对应的结构,以及TCP/IP模型各个层级对应的协议

在这里插入图片描述

1、TCP/IP协议

  • TCP/IP 是用于因特网 (Internet) 的通信协议,是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信。
  • TCP/IP是基于TCP和IP这两个最初的协议之上的不同的通信协议的大集合,是一个协议族。

1-1、TCP(传输控制协议,Transmission Control Protocol)

  • 在计算机网络中属于传输层,是TCP/IP协议栈中最核心的协议之一
  • 面向连接:一种可靠的传输服务,使用前必须先建立连接,传输完成后释放
  • 点对点:每一条tcp协议只能是一对一的,TCP 连接的端点叫做套接字,套接字 socket = (IP 地址:端口号),每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。(注意:该socket和经常说的socket编程中的socket不是一个东西,后者的全称应该是Socket API
  • 全双工通信:允许通信双方的应用进程在任何时候都能发送数据
  • 流模式:数据被作为无结构的字节流
  • 有序的:为每个由其传输的字段指定顺序号,对于发送的每一个分段,接收主机必须在一个指定的时间内返回一个确认信息,发送者未收到确认,数据会被重新发送

1-2、IP协议(互联网协议,Internet Protocol)

  • 在计算机网络中属于网际层(网络层/网络互连层),是TCP/IP协议栈中最核心的协议之一
  • 无连接的协议:主要通过IP地址,保证了联网设备的唯一性
  • 不可靠的数据传输:不能保证数据包一定能到达对方,数据是否会被丢弃以及丢弃之后如何处理

二、HTTP协议(超文本传输协议,HyperText Transfer Protocol)

  • 基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
  • 无状态协议:HTTP协议本身不会对发送过的请求和相应的通信状态进行持久化处理,由于HTTP是无状态协议,通常在网页上引入cookie之类技术来记录状态
  • 无连接协议:基于请求-响应的模式,每次连接只处理一个请求,即一个Request和一个Response对应了整个连接,响应后断开连接。(在后续的版本中添加了Connection: Keep-Alive实现长连接)
  • 任意类型的数据对象:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
  • 半双工通信:允许数据在两个方向上传输,但是在某一时刻,只允许数据在一个方向上传输

HTTP工作原理

1、客户端连接到服务器

一个HTTP客户端与服务器建立一个TCP套接字连接

2、发送HTTP请求

通过TCP套接字,向服务器发送一个文本的请求报文(请求行、请求头、请求数据、空行)

3、服务器接受请求并返回HTTP响应

服务器解析请求,将资源写到TCP套接字,由客户端读取响应内容(状态行、响应头部、空行、响应数据)

4、释放连接TCP连接

若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection模式为keepalive,则该连接会保持段时间,在该时间内可以继续接收请求

5、客户端解析响应数据

通过状态行、响应头等相关内容进行资源解析

三、WebSocket协议

要使用HTTP实现双向通讯,传统的方式即进行轮询已达到效果(即每隔一段时间,想服务器发出请求获取最新的数据),常见的轮询方式分为轮询(定时请求)和长轮询(请求后服务器在有数据变化时才响应,客户端在请求快过期前或请求响应后,再次发起请求)。

这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而 HTTP 请求与响应可能会包含较长的头部,其中真正有效的数据可能只是很小的一部分,所以这样会消耗很多带宽资源。

HTML5定义了 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

  • 基于TCP协议的应用层传输协议
  • 持久连接:连接创建后,客户端和服务端的数据传输不用新建连接。
  • 全双工通信:客户端和服务端可以双向通信
  • 较少的开销:数据交换时,数据包头较小

1、WebSocket连接的建立

当客户端想要使用 WebSocket 协议与服务端进行通信时, 首先需要确定服务端是否支持 WebSocket 协议, 因此 WebSocket 协议的第一步是进行握手, WebSocket 握手采用 HTTP Upgrade 机制, 客户端可以发送如下所示的结构发起握手 (请注意 WebSocket 握手只允许使用 HTTP GET 方法):

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

在 HTTP Header 中设置 Upgrade 字段, 其字段值为 websocket, 并在 Connection 字段指示 Upgrade, 服务端若支持 WebSocket 协议, 并同意握手:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13

客户端校验返回内容,握手成功则将通信协议升级到WebSocket,至此就可以使用WebSocket协议进行客户端-服务端数据交换。

2、WebSocket端口:

WebSockets使用HTTP Upgrade机制升级到Web Socket协议,因此HTTP服务器可以与WebSocket服务器共享默认的HTTP与HTTPS端。默认情况下:WebSocket 协议使用 80 端口、若运行在 TLS 之上时,默认使用 443 端口

3、WebSocket与Socket的关系

  • WebSocket 和 Socket 并无关系
  • 套接字(socket)在TCP/IP之上,位于传输层和应用层之间的一个抽象层,并不是一个协议,传输层的低一层协议服务socket,socket服务应用层。socket其实就是是一组API,提供了对TCP/IP的相关操作

4、WebSocket与HTTP的关系

  • 都属于应用层协议,基于TCP/IP协议,是可靠的传输协议
  • WebSocket支持持久连接,HTTP不支持持久连接(HTTP使用Connection: Keep-Alive也可实现长连接,但HTTP的生命周期还是属于一个Request对应一个Response)
  • WebSocket是双向通信协议,HTTP是单向协议
  • WebSocket协议在第一次握手连接时,通过HTTP协议
  • HTTP服务器可以与WebSocket服务器共享默认的HTTP与HTTPS端(80和443)

四、STOMP协议(简单(流)文本定向消息协议,Simple (or Streaming) Text Orientated Messaging Protocol)

WebSocket协议只会将字节流转换为文本/二进制消息,使用时需要定义应用间所发送消息的语义,还需要确保Client和Server都能遵循这些语义。比如:在消息中有一个type,当type为subscribe时,表示订阅消息,当type为message时表示发送了一条消息。在使用WebSocket的时候,我们不同的地方使用都要做类似的工作:“设计message”,也就是常说的“WebSocket的通信形式层级过低”

  • STOMP是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议,提供了一个可互操作的连接格式,用于client之间进行异步消息传输的简单文本协议
  • STOMP协议并不是为websocket设计的, 它是属于消息队列的一种协议,STOMP协议可以建立在WebSocket之上,也可以建立在其他应用层协议之上(一般也就是WebSocket了)
  • STOMP 提供了一个基于帧的线路格式(借鉴了HTTP),使用不同的帧,表示不同的含义
    在这里插入图片描述

在这里插入图片描述

五、MQTT协议(消息队列遥测传输协议,Message Queuing Telemetry Transport)

  • 基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,属于应用层协议
  • 消息不是直接从发送器发送到接收器,是由MQTT server(或称为 MQTT Broker)分发。(区别于WebSocket的点对点)
  • 可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务,常用于物联网(IoT)应用中的设备间通信
  • MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。发布者和消费者之间并不关心对方,都只和代理(Broker)(服务器)打交道
  • 提供心跳机制、遗嘱消息、QoS 质量等级+离线消息、主题和安全管理等多种特性

六、MQTT与WebSocket

1、相同点

  • MQTT 和 WebSocket 都是应用层协议
  • 都是使用 TCP 协议确保可靠传输数据
  • 都支持双向通信
  • 都使用二进制传输

2、通信模型

  • WebSocket 是一种简单的报文协议,仅仅定义了会话的发起方式和报文格式及类型。如何使用报文通信全由应用程序控制
  • MQTT 是一种比较复杂的消息协议,规定了客户端和服务器的通信模型,是一种面向主题(topic)的消息广播协议,基于发布/订阅模式
  • MQTT 是一套比较复杂的消息投递协议,而 WebSocket则只是在TCP协议之上实现了简单的报文通信。两种协议工作层次不一样,也就是常说的“WebSocket的通信形式层级过低”

3、连接建立方式

  • WebSocket 基于 HTTP/1.1 的 Upgrade 机制协商会话,协商完成后协议由HTTP升级到WebSocket,完成双工信道的建立
  • MQTT 协议则需要通过 CONNECT 报文协商会话,TCP连接建立之后,客户端会主动发送 CONNECT 报文。服务端准备好之后会回应 CONNACK 报文,完成双工信道的建立

4、消息收发方式

  • WebSocket 收发消息不需要对方确认
  • MQTT 收发消息需要根据投递级别(QoS)进行确认:QoS 0(最多一次)、QoS 1(最少一次)、QoS 2(恰好一次)

5、保活机制

  • WebSocket 只规定了 ping/pong 两种报文,用于心跳探测,但协议并不强制要求定时收发心跳包
  • MQTT 则有明确的心跳协商机制。协商会话使用的 CONNECT 报文包含 Keep Alive 头部信息,使用两个字节传输心跳间隔,单位是秒。会话协商后需要定时收发 PINGREQ 和 PINGRESP 报文。

6、使用场景

  • MQTT是为了物联网场景设计的基于TCP的Pub/Sub协议,有许多为物联网优化的特性,比如适应不同网络的QoS、层级主题、遗言等等
  • WebSocket是为了HTML5应用方便与服务器双向通讯而设计的协议,HTTP握手然后转TCP协议,用于取代之前的Server Push、Comet、长轮询等老旧实现
  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值