目录
易混淆概念:http的keep-alive和Tcp的keepalive区别
短链接
当通讯双方有数据交互时,会主动建立一个TCP连接,数据发送完成后断开此TCP连接。(Http1.0默认保持短链接)
例如Http请求:Http是无状态的(不代表不能保持TCP长连接),每次发起请求时步骤如下:
1、Client端会发起并建立TCP连接(三次握手)
2、Client端发送HttpRequest到Server端
3、Server端收到Request并处理
4、Server端响应HttpResponse给Client端,并立即调用socket.close()方法
5、Client端收到HTTPResponse之后也会收到断开TCP连接的信号。
6、Clinet端断开TCP连接(四次挥手)。
(建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接)
优点:
- 短链接对于服务器来说管理较为简单,存在的连接都是有用的,不需要额外控制。
- 每次都会断开连接安全性高。
- 节省服务端连接资源
缺点:
- 频繁建立、断开连接,网络开销比较大。效率低。
使用场景:
- 适用于网页浏览等数据刷新频次较低的场景
- 适用于并发量大的业务场景,
长连接
通讯双方建立连接传输数据后,连接不会马上断开,会保持一段时间,后续的传输继续使用此连接。连接通过发送心跳包来保持。(Http1.1默认保持长连接)
请求步骤如下:
1、Client端会发起并建立TCP连接(三次握手)
2、Client端发送HttpRequest到Server端
3、Server端收到Request并处理
4、连接不会关闭,后续传输继续使用此连接
5、最后一次发送后,Server端会进行等待,若等待超时,会主动关闭连接(四次挥手)
(建立连接——数据传输…(保持连接)…数据传输——关闭连接)
优点:
- 省去TCP建立和关闭连接的操作,减少耗时。
缺点:
- 连接复用存在安全问题
- 连接数持续增加会对Server端造成压力
使用场景:
- 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多的情况。例如游戏和聊天。
如何保持长连接:
设置Connection: Keep-alive,Keep-Alive: timeout=20
Httpd守护进程,设置keep-alive timeout超时时间,最后一个响应完成,若不再有请求,等待达到超时时间后就会关闭。
易混淆概念:http的keep-alive和Tcp的keepalive区别
HTTP的Keep-alive是要让一个TCP连接活久点。以便在同一个连接上传送多个http,提高socket效率。
TCP的keep alive是检查当前TCP连接是否活着。它们是不同层次的概
TCP keep alive支持三个系统内核配置参数:
1 echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
2 echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl
3 echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
TCP keep alive 是TCP的保鲜定时器,当建立连接后,闲置tcp_keepalive_time时间后,服务器内核就会尝试发送心跳包,判断TCP状态,若未收到Ack响应。在tcp_keepalive_intvl秒后重新发送。若一直未收到响应会重试tcp_keepalive_probes次。若依然未收到响应,则丢弃该TCP连接。(TCP连接默认闲置时间是2小时)
Http协议的短链接、长连接,本质是TCP协议的短连接、长连接。
参考:
1、https://www.jianshu.com/p/caeec6bd1d3f