首页 > 技术文章 > 轮询、长轮询、长连接、socket连接、WebSocket

sebastian-tyd 2020-08-29 10:16 原文

   

兼容性:轮询 > 长轮询 > 长连接 > WebSocket

性能:WebSocket > 长连接 > 长轮询 > 轮询

   

  • 轮询
    • 客户端定时向服务器发送 Ajax 请求,服务器接收到请求后马上返回响应信息并关闭连接
    • 优点:后端编码比较简单
    • 缺点:请求中有大半是无用的,浪费带宽和服务器资源(每一次的 http 请求和响应都带有完整的 http 头信息,这就增加了每次传输的数据量)
    • 实例:适用于小型应用
  • 长轮询
    • 客户端向服务器发送 Ajax 请求,服务器接收到请求后,立马 Hold 住连接,直到有新消息才返回响应信息并关闭连接,或到了设定的超时时间关闭连接,客户端处理完响应信息后再向服务器发送新的请求
    • 优点:在没有消息的情况下不会频繁的请求,节省了网络流量,解决了服务器端一直疲于接收请求的窘境
    • 缺点:服务器 Hold 连接会消耗资源,需要同时维护多个线程,服务器所能承载的 TCP 连接是有上限的,这种轮询很容易把连接数顶满
    • 实例:WebQQHi 网页版、Facebook IM
  • 长连接
    • Http 1.1 通过使用 Connection:keep-alive 进行长连接,Http 1.1 默认进行持久连接,在一次 TCP 连接中可以完成多个 Http 请求,但是对于每个请求仍要单独发 Header
    • 在页面中嵌入一个隐藏的 iframe,将这个隐藏的 iframe src 属性设为对一个长连接的请求,服务器端就能源源不断的往客户端输入数据
    • 优点:消息即时到达,不发无用请求
    • 缺点:服务器维护一个长连接会增加开销
    • 实例:Gmail 聊天
  • Socket
    • 在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示
    • 优点:实现真正的即时通信,而不是伪即时
    • 缺点:客户端必须安装Flash插件;非HTTP协议,无法自动穿越防火墙
    • 实例:网络互动游戏
  • WebSocket
    • WebSocket 协议本质上是一个基于 TCP 的协议,为了建议一个 WebSocket 连接,客户端浏览器首先要向服务器发器一个 http 请求,这个请求和通常的 http 请求不同,包含了一些附加头信息( Upgrade:WebSocket )表明这是一个申请协议升级的 http 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接

推荐阅读