首先捋一下总的关系:Http协议和WebSocket协议都是建立在Tcp协议之上的应用层协议。

TCP协议

下面这张图可以代表Tcp的三次握手过程,以及它相较于UDP“可靠性保证”的由来。

  1. 首先客户端(Client)请求建立连接,所以SYN=1,由于TCP规定SYN=1时不能携带数据,但要消耗一个序号,所以Client随机取一个初始序号seq=(这里没有什么响应,so跟ACK没啥关系,认为ACK=0)
  2. 服务器(Server端)收到请求后作出了响应,向Client发送确认,所以SYN=1, ACK=1,同时同理随机取一个序号seq=y。目前Server端收到了x序号的数据,so它还告诉Client:希望下次给我发送包的序号是x+1,所以ack=x+1
  3. Client收到确认后还需再次发送确认,同时携带要发送给Server的数据:ACK=1, seq=x+1, ack= y+1;因为有 响应 动作,所以ACK=1(因为要携带发送的数据,所以这儿没SYN什么事)。因为(2)中Server 已经告诉了这次它想收到包的初始序列号是x+1,所以初始序号为seq=x+1。又因为Client到 y为止的所有数据都已正确收到了,准备接收序列号为y+1的包,所以ack=y+1

这就是一个比较完整的三次握手过程

这里写图片描述
为什么不能改成两次握手?
有人会困惑为什么要进行三次握手呢(两次确认)?这主要是为了防止已失效的请求连接报文忽然又传送到了,从而产生错误。
假定A向B发送一个连接请求,由于一些原因,导致A发出的连接请求在一个网络节点逗留了比较多的时间。此时A会将此连接请求作为无效处理 又重新向B发起了一次新的连接请求,B正常收到此连接请求后建立了连接,数据传输完成后释放了连接。如果此时A发出的第一次请求又到达了B,B会以为A又发起了一次连接请求,如果是两次握手:此时连接就建立了,B会一直等待A发送数据,从而白白浪费B的资源。 如果是三次握手:由于A没有发起连接请求,也就不会理会B的连接响应,B没有收到A的确认连接,就会关闭掉本次连接。

Http协议

HTTP协议使用的是请求-应答通信模式,所以它也是无状态协议,数据传输完成后就断开连接,避免了资源的无效占用。基于TCP/IP协议“尽量”保证数据的送达。同时header采用明文传输:这是一把双刃剑,在带给开发者便利的同时,也会导致相应的风险。

WebSocket协议

WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket 一样。WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。

连接过程 —— 握手过程

  1. 浏览器、服务器建立TCP连接,三次握手。这是通信的基础,传输控制层,若失败后续都不执行。
  2. TCP连接成功后,浏览器通过HTTP协议向服务器传送WebSocket支持的版本号等信息。(开始前的HTTP握手)
  3. 服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据。
  4. 当收到了连接成功的消息后,通过TCP通道进行传输通信。

HTTP 客户端与服务器的交互
WebSocket 请求响应客户端服务器交互
可以看到,相较于传统Http的请求应答模式,WebSocket 是类似 Socket 的 TCP 长连接的通讯模式,一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输。在客户端断开 WebSocket 连接或 Server 端断掉连接前,不需要客户端和服务端重新发起连接请求。WebSocket能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据。

WebSocket和 HTTP 最大不同是:
HTTP协议是非持久化的,单向的网络协议,在建立连接后只允许浏览器向服务器发出请求后,服务器才能返回相应的数据。这样的方法最明显的缺点就是需要不断的发送请求,而且通常HTTP request的Header是非常长的,为了传输一个很小的数据 需要付出巨大的代价,是很不合算的,占用了很多的带宽。会导致过多不必要的请求,浪费流量和服务器资源,每一次请求、应答,都浪费了一定流量在相同的头部信息上。
然而WebSocket的出现可以弥补这一缺点。在WebSocket中,只需要服务器和浏览器通过HTTP协议进行一个握手的动作,然后单独建立一条TCP的通信通道进行数据的传送。
不同点

  1. WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息。HTTP是单向的。
  2. WebSocket是需要握手进行建立连接的。

相同点

  1. 都是一样基于TCP的,都是可靠性传输协议。
  2. 都是应用层协议。

 联系

WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。


吴静仪
26 声望2 粉丝

无我