文章介绍了网络通信中的长连接和短连接的概念与不同的应用场景。
1. TCP连接
前文《传输层中的TCP和UDP浅析》介绍过传输层中的TCP,TCP(传输控制协议)是传输层的两大协议之一。TCP是一种面向链接的可靠协议,其通信的过程分成了三步:1. 开始传输前,端到端需要通过三次握手建立链接。2. 传输过程中双方按照TCP保证可靠性。3. 传输结束之后,双方再用三次握手关闭连接。
数据传输前,三次握手建立连接的过程如下图所示:
数据传输过程中保持连接。
数据传输结束后,四次握手关闭连接。
2 TCP短连接
TCP短连接就是一次请求+返回的TCP连接,无需保持连接,例如下面过程。client向server请求TCP连接,建立连接后,发送数据请求。server收到数据请求后,处理请求,并返回处理结果。client完成请求后,主动关闭TCP连接。这就是完成了一次TCP短连接。一般TCP短连接只是一次请求和返回,因为没有保持连接的必要,所以尽量把请求的内容在一次通信中完成,减少不必要的操作。一般也是client主动请求关闭TCP连接,因为server并不知道client是否已经完成请求,当然也会有特殊情况。
TCP短连接的应用最广泛,比如浏览器对某个web页面的请求就是一次TCP的短连接请求,获得页面HTML之后即关闭TCP连接。
3 TCP长连接
TCP长连接的目的是保持一个连接,可以随时监听对方发来的消息,长连接过程如下。client向server请求TCP连接,server接受连接,双方建立起连接。从此,双方保持它们之间的连接。
TCP保持连接(保活功能)一般通过心跳包来实现。保持连接一般靠服务器端实现,因为服务器端需要知道客户端是否崩溃。如果客户端已经不存在了,使得服务器剩余一个半开放的连接,一方面服务器监听客户端的消息,一方面服务器发送的消息都无法到达客户端。TCP的保活功能就是为了检查半开放的连接,对于半开放的连接,尝试重连,如果多次重连失败,就可以释放这部分资源。
长连接可能有四种状态,1) 客户端和服务器都正常工作,这是连接保持正常;2) 客户端不可达、服务器端正常;3) 客户端正常、服务器不可达;4) 客户端和服务器都不可达,这时连接被视为关闭。
为了能够保持连接,一般由服务器实现保活功能。服务器定时向客户端发送心跳包,如果收到心跳包相应,则认为客户端正常,连接正常。如果超时未收到心跳包相应,则等待一段时间重发心跳包。如果连续10次都无法接收到心跳包响应,则可以认为客户端已经不存在,可以关闭连接。
还有一种保持连接的方式就是双向心跳包。服务器定时向客户端发送心跳包,以侦测客户端是否存在;客户端也定事项服务器端发送心跳包,来侦测服务器端是否正常。双向心跳包的好处是可以保证服务器端服务可达,但是对于客户端也是一个负担。所以除非客户端对服务器端的实时响应要求很高,一般不推荐这种方式。在实时性要求不太强的场合,如果客户端请求服务器超时,可以重新请求一次,而不必要消耗资源来保持连接。
长连接的弊端
TCP长连接对于服务器而言是个很大的负担,由于长连接一般不会主动关闭,当保持连接较多时,服务器负担就比较重。如果每个线程监听一个长连接,每个线程分配2M资源,那么一个8G内存的主机,最多只能保持4000多条连接。如果客户端连接越来越多,可能会导致服务器的性能变差甚至内存不足。
这时候server端必须采用一些必要的策略。1) 限制每个客户端主机的最大连接数,可以避免某些客户端大量的长连接拖累服务器。2) 采用一个动态连接的方案,对于长时间没有读写时间的连接可以被关闭,用于其它客户端。
长连接由于对资源消耗较大,一般用于那些需要实时响应的应用。