通俗地说,Nginx只能帮助完成引导WebSocket客户连接到哪一个WebSocket服务端实例,在IM集群情况下,如果两个用户处于不同的WebSocket实例下时,它们之间的跨实例通信,Nginx是没有办法实现的,这一块的逻辑还是得IM开发者自已来实现 。
总而言之,Nginx提供给WebSocket的所谓“负载均衡”,并不是IM开发者认为的那种全功能集群!
#
一、什么是长连接
HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接 。
1. HTTP协议与TCP/IP协议的关系
HTTP的长连接和短连接本质上是TCP长连接和短连接 。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议 。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致 。TCP协议是可靠的、面向连接的 。
在HTTP/1.0中默认使用短连接 。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接 。当客户端浏览器访问的某个html或其他类型的Web页中包含有其他的Web资源(如JAVAScript文件、图像文件、css文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话 。
**而从HTTP/1.1起,默认使用长连接,用以保持连接特性 。使用长连接的HTTP协议,会在响应头加入这行代码:
**
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接 。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间 。实现长连接需要客户端和服务端都支持长连接 。
**HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接 。
**
**2.1. TCP连接
**
当网络通信时采用TCP协议时,在真正的读写操作之前,客户端与服务器端之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时可以释放这个连接 。连接的建立依靠“三次握手”,而释放则需要“四次握手”,所以每个连接的建立都是需要资源消耗和时间消耗的 。
**2.2. TCP短连接
**
模拟一下TCP短连接的情况:client向server发起连接请求,server接到请求,然后双方建立连接 。client向server发送消息,server回应client,然后一次请求就完成了 。这时候双方任意都可以发起close操作,不过一般都是client先发起close操作 。上述可知,短连接一般只会在 client/server间传递一次请求操作 。
短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段 。
2.3. TCP长连接
我们再模拟一下长连接的情况:client向server发起连接,server接受client连接,双方建立连接,client与server完成一次请求后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接 。
TCP的保活功能主要为服务器应用提供 。如果客户端已经消失而连接未断开,则会使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,此时服务器将永远等待客户端的数据 。保活功能就是试图在服务端器端检测到这种半开放的连接 。
如果一个给定的连接在两小时内没有任何动作,服务器就向客户发送一个探测报文段,根据客户端主机响应探测4个客户端状态:
客户主机依然正常运行,且服务器可达 。此时客户的TCP响应正常,服务器将保活定时器复位 。
客户主机已经崩溃,并且关闭或者正在重新启动 。上述情况下客户端都不能响应TCP 。服务端将无法收到客户端对探测的响应 。服务器总共发送10个这样的探测,每个间隔75秒 。若服务器没有收到任何一个响应,它就认为客户端已经关闭并终止连接 。
客户端崩溃并已经重新启动 。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接 。
客户机正常运行,但是服务器不可达 。这种情况与第二种状态类似 。
长连接和短连接的优点和缺点由上可以看出,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间 。对于频繁请求资源的客户端适合使用长连接 。在长连接的应用场景下,client端一般不会主动关闭连接,当client与server之间的连接一直不关闭,随着客户端连接越来越多,server会保持过多连接 。这时候server端需要采取一些策略,如关闭一些长时间没有请求发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件允许则可以限制每个客户端的最大长连接数,这样可以完全避免恶意的客户端拖垮整体后端服务 。
推荐阅读
- 程序员|B站最惨程序员做的网站 连我奶都能干崩溃
- 小程序websocket开发指南
- 和平精英充会员送套装 和平精英充钱能干啥
- Websocket技术选型参考
- 房子被水泡了多久能干 发洪水把房子淹了
- 越能干的人干的活越多 为什么越干活越有劲
- sync-player使用websocket实现异地同步播放
- 常用的Websocket技术一览
- 看AI赋能都可干些啥!广州国际人工智能成果展16日举办
- ws+socket.io 精读Websocket原理大全需知,以及具体使用