长连接和短连接
Tcp 保活功能,主要为服务器应用程序提供,服务器应用程序需要知道客户主机是否崩溃,从而可以代表客户使用资源.
如果一个给定的连接,在两个小时内没有任何的动作,则服务器就向客户发送一个探测报文段,客户主机可能有以下几种状态:1)客户主机依然正常运行,并从服务器可达,客户的 tcp 响应正常,而服务器也知道对方是正常的,服务器在两个小时后将保活定时器复位。2)客户主机已经崩溃,并且关闭或正在重新启动。在任何一种情况下,客户的 tcp 都没有响应,服务器不能收到对探测的响应,并在 75s 后超时,服务器总共发送 10 个这样的探测,每个间隔 75s。若服务器没有收到一个响应,他就认为客户主机已经关闭,并终止连接。
tcp 保活功能是探测长连接存活状况。
Tcp 的 keep-alive 是检查当前 tcp 是否还活着;http 的 keep-alive 是让一个 tcp 连接活多久,他们是不同层次的概念。
http的长连接和短连接,本质上是tcp层的长连接和短连接
(1) http 1.0 默认使用短连接,客户端和服务端每进行一次http操作,就建立一次连接,任务结束就中断连接。如果请求的html中有网络js和图片,则需要新建连接去取。
client发起请求--建立连接--server响应请求---发送消息--关闭连接
(2) http 1.1 默认使用长连接,在使用的http协议,在响应头会加上 Connection:keep-alive,当一个网页打开完成之后,连接不会马上关闭,再次访问这个服务时,会继续使用这个长连接,而是在一段时间后关闭,这个时间可以在浏览器设置。
建立连接--数据传输......保持连接......数据传输--关闭连接
RPC比HTTP请求快的原因
(1)http使用http协议,rpc使用tcp协议,比http少了应用层,表示层,会话层,这3层。
(2)rpc使用长连接,当网络通信使用tcp协议时,在真正的读写操作前,需要完成3次握手,来建立连接。当读写完成时,需要四次握手来释放连接,每个连接的建立和释放都是需要资源和时间的,所以长连接比短连接更节省资源,效率更高。
长连接和短连接的优点和缺点
(1)长连接,可以省去较多的tpc建立和关闭操作,减少资源的浪费,节约时间。长连接多用于操作频繁,点对点的通讯,而且连接数不能太多。数据库的连接就是使用长连接,如果用短连接频繁通讯会造成socke错误,而且频繁的Socket创建和销毁也是对资源的消耗比较大。
(2)短连接,短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段,web网站一般使用短连接,因为长连接对服务端来说会消耗一定资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的,对资源消耗过大
tcp的keep-alive和http的Keep-alive
(1) Tcp的keepalive是检查当前tcp是否存活,表现就是当一个连接在一段时间没有数据传输是,一方会发一个心跳包,如果对方有回包则表明当前连接有效,继续监控。
这个“一段时间”可以设置。
# cat /proc/sys/net/ipv4/tcp_keepalive_time 7200 # cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75 # cat /proc/sys/net/ipv4/tcp_keepalive_probes 9
tcp_keepalive_time,在TCP保活打开的情况下,如果在该时间内没有数据往来,则发送探测包。即允许的持续空闲时长,或者说每次正常发送心跳的周期,默认值为7200s(2h)。
tcp_keepalive_probes 尝试探测的次数。如果发送的探测包次数超过该值仍然没有收到对方响应,则认为连接已失效并关闭连接。默认值为9(次)
tcp_keepalive_intvl,探测包发送间隔时间。默认值为75s。
(2) http的Keep-alive是让一个tcp连接活久点。在浏览器设置
HTTP1.0中默认是关闭的,需要在HTTP头加入"Connection: Keep-Alive",才能启用Keep-Alive;HTTP1.1中默认启用Keep-Alive,加入"Connection: close ",才关闭。
等待时长timeout的值可以在http client和http server中指定。比如在请求头(request header)中加入:
Keep-Alive: timeout=5, max=1000
表示让http server保持连接5秒钟,本次连接最大请求数1000次。如果http server也设置来http keep alive 的timeout值,那么以两者最小的时间为准。比如http server设置了timeout=3,则会在返回头(response header)中添加:
Keep-Alive: timeout=3, max=1000
这次连接会在接收到最后一次请求后的3秒钟,被http server断开。