HTTP协议中的短轮询、长轮询、长连接和短连接

长连接

HTTP是请求/响应模式的,发送请求到服务端只要服务端给了响应,本次HTTP连接就结束了,或者更准确的说,是本次HTTP请求就结束了,根本没有长连接这一说。那么自然也就没有短连接这一说了。

那么长连接从哪来的 ?

网络上说HTTP分为长连接和短连接,其实本质上是说的TCP连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才有真正的长连接和短连接这一说。

为什么会有长连接 ?

HTTP是基于TCP/IP协议的,创建一个http请求需要先创建tcp连接,而创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接(或者叫持久连接),可以用这个长连接来发多个http请求。

怎样设置长连接 ?

在HTTP1.0和HTTP1.1协议中都有对长连接的支持。其中HTTP1.0需要在request中增加 Connection:keep-alive;而HTTP1.1默认支持(目前主流http1.1)除非显式地在头部加上 Connection: close 进行关闭。与 connection 对应的一个字段是 keep-live,http 响应头中出现, 他的格式是 timeout=30, max=5, timeout 是两次 http 请求保持的时间(s),如果一段时间内,这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉。max 是这个 tcp 连接最多为几个 http 请求重用。

tupain 打开长连接

Connection为keep-alive就算是长连接了 ?

当然是的,但要服务器和客户端都设置。

1996年  HTTP/1.0 默认短连接 ,支持GET、POST、 HEAD请求
1999年  HTTP/1.1 默认长连接(一次TCP连接可以多次请求);支持PUT、DELETE、PATCH等六种请求
2015年  HTTP/2.0 多路复用、服务器主动推送解析基于二进制,报头压缩

http1.0请求与服务端的交互过程

  1. 客户端发出带有包含一个header:"Connection:keep-alive"的请求
  2. 服务端接收到这个请求后,根据http1.0和"Connection:keep-alive"判断出这是一个长连接,就会在response的header中也增加 "Connection:keep-alive" ,同时不会关闭已建立的tcp连接
  3. 客户端收到服务端的response后,发现其中包含 "Connection: keep-alive" ,就认为是一个长连接,不关闭这个连接

http1.1请求与服务端的交互过程

  1. 客户端发出http1.1的请求
  2. 服务端收到http1.1后就认为这是一个长连接,会在返回的response设置"Connection: keep-alive'",同时不会关闭已建立的连接.
  3. 客户端收到服务端的response后,发现其中包含”Connection: keep-alive“,就认为是一个长连接,不关闭这个连接。

如果客户端的请求头中的connection为close,则表示客户端需要关掉长连接。如果服务端最后的决定是Close,那么在响应的http头中, connection为close 。任意一遍都可要求关闭 长连接

短连接

浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。


长轮询与短轮询

什么是轮询,为什么会有轮询 ?

鉴于 http协议的被动性 , 服务器的数据改变时,服务器并不会通知到前端 ,这时候 我们的页面上的数据是旧的(过时的)而服务器中的数据是新的 ,只有前端再次请求服务器才能保证请求到的数据是最新的,但是前端并不知道 服务器的数据什么时候改变,为实现数据同步,就需要一直重复去请求服务器从而返回最新数据,这个重复的过程就是轮序。轮询表示客户端每经过固定的时间间隔就向服务器请求数据。
当我们在讨论轮询的时候,往往是在讨论“请求应答”场景下的“数据请求”的问题。长轮询和短轮询本质上都是轮询。

http协议介绍
http协议是请求/响应范式的: 每个http 响应都对应一个 http 请求,http协议是无状态的,多个http请求之间是没有关系的;
http协议的被动性:在标准的HTTP请求响应语义中,浏览器发起请求,服务器发送一个响应,这意味着在浏览器发起新请求前,服务器不能发送新信息给客户端浏览器;

什么是长轮询 ?

http 长轮询是server 收到请求后如果有数据(是否有数据服务器说了算),就立刻响应请求;如果没有数据就会就停留一段时间,这段时间内,如果 server 请求的数据到达(有满足要求的数据了),就会立刻响应;如果这段时间过后(即等到超时为止),还没有数据,则以空数据的形式响应http请求;若浏览器收到的数据为空,会再次(立马就发)发送同样的http请求到server。
特点是:长轮询必须使用长连接、长轮询是一种服务器推数据的技术长轮询 的缺点:server 没有数据到达时,http连接会停留一段时间,这会造成服务器资源浪费;

什么是短轮询 ?

http 短轮询是 server 收到请求 不管是否有数据到达都直接响应http 请求;如果浏览器收到的数据为空,则隔一段时间(因为立刻请求的话极大可能还是返回空,所有等一会),浏览器又会发送相同的http请求到server 以获取数据响应;
短轮询一个明显的缺点就是: 客户端定时发起请求,如果服务端数据长期没有变化,会产生大量无效的请求,浪费网络资源。


长短轮询和长短连接的区别

  1. 决定的方式,一个TCP连接是否为长连接,是通过设置HTTP的Connection Header来决定的,而且是需要两边都设置才有效。而一种轮询方式是否为长轮询,是根据服务端的处理方式来决定的,与客户端没有关系。
  2. 实现的方式,连接的长短是通过协议来规定和实现的。而轮询的长短,是服务器通过编程的方式手动挂起请求来实现的。

目前一些从服务器主动推送数据到客户端的方式

  • 长轮询
  • comet
  • websocket

出处:别人家的博客
https://www.cnblogs.com/zuoxiaolong/p/life49.html
https://blog.csdn.net/pacosonswjtu/article/details/52035252
https://www.cnblogs.com/aspirant/p/10833143.html

posted @ 2021-03-16 11:34  雨天。我  阅读(1300)  评论(0)    收藏  举报