TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,客户端与服务器端之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时可以释放这个连接。连接的建立依靠“三次握手”,而释放则需要“四次挥手”,所以每个连接的建立都会带来资源和时间开销。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。TCP连接是一个双向的通道,可以保持一段时间不关闭,因此TCP连接才有真正的长连接和短连接这一说。
什么是长连接和短连接
短连接就是客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会复用同一个 TCP 通道,直到客户端心跳检测失败或服务器连接超时。
长连接过程如下:
连接->传输数据->保持连接 -> 传输数据-> ... ->关闭连接。
短连接如下:
连接->传输数据->关闭连接
简而言之,若没有数据传输也要保持TCP连接,就是长连接,反之就是短连接。举个简单的例子,幼儿园老师和小朋友是长连接,老师需要时不时地关注有没有小朋友出意外;而大学老师和学生就是短连接,散养即可。
什么时候用长连接和短连接
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,无需重新建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源。如果用长连接,而且同时有成千上万的用户,那么每个用户都占用一个连接的话,结果可想而知;故在并发量大,但每个用户无需频繁操作的场景下,推荐使用短连接。
开启和关闭长连接
HTTP/1.0默认使用短连接,而从HTTP/1.1起,默认使用长连接,用以复用TCP连接,多个HTTP请求可以复用同一个TCP连接,从而降低TCP连接建立和断开的消耗。使用长连接的HTTP协议,会在请求头或者响应头header中加入这行代码:
Connection:keep-alive
实现长连接需要客户端和服务端都支持长连接,客户端可以通过设置 HTTP Header Connection: close
来关闭长连接。不论request还是response的header,只要包含了值为close的connection,都表明当前正在使用的tcp连接在本次请求处理完毕后会被断掉。以后客户端再进行请求时,就必须创建新的TCP连接。
长连接的过期时间
客户端的长连接不会永久保持连接,它有一个超时时间的概念,可以在header当中进行设置的。譬如:
图中的Keep-Alive: timeout=20表示这个TCP通道可以保持20秒。另外,还可能有max=XXX,表示这个长连接最多接收XXX次请求就断开。对于客户端来说,如果服务器没有告诉客户端超时时间也没关系,服务端可主动发起四次握手断开TCP连接,客户端能够知道该TCP连接已经无效;另外TCP还有心跳包来检测当前连接是否还活着,方法很多,避免浪费资源。