Tcp Http WebSocket全家桶解析

首先捋一下总的关系: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的确认链接,就会关闭掉本次链接。spa

Http协议

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

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 来传输数据。rem

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

  1. WebSocket是双向通讯协议,模拟Socket协议,能够双向发送或接受信息。HTTP是单向的。
  2. WebSocket是须要握手进行创建链接的。

相同点class

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

 联系

WebSocket在创建握手时,数据是经过HTTP传输的。可是创建以后,在真正传输时候是不须要HTTP协议的。

相关文章
相关标签/搜索