9 短连接与长连接
短连接是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。
短连接操作步骤: 连接→数据传输→关闭连接
长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态,且在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包,以维持此连接。
长连接操作步骤:
连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接
在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。
HTTP1.1规定了默认保持长连接(HTTP persistentconnection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据。
上图中的Keep-Alive:timeout=20,表示这个TCP通道可以保持20秒。另外还可能有max=XXX,表示这个长连接最多接收XXX次请求就断开。对于客户端来说,如果服务器没有告诉客户端超时时间也没关系,服务端可能主动发起四次握手断开TCP连接,客户端能够知道该TCP连接已经无效。
短连接用于并发量大,但每个用户无需频繁操作情况,如WEB网站的HTTP服务。
因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。
长连接多用于操作频繁、点对点的通讯,如:PUSH和IM等功能。
每个TCP连接都需要三步握手,这需要时间,如果每个操作都是短连接,再次操作的话还需重新建立连接,那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。