TCP的KeepAlive是侧重在保持客户端和做事真个连接,一方会定时发送心跳包给另一方,当一方断掉的时候,其余一方定时发送几次心跳包,如果连续几次对方都返回的是RST,而不是ACK,那么就开释当前链接。
此时我们假设一下,如果TCP没有KeepAlive机制会涌现什么问题呢。一旦对方断开连接,而另一方没有开释的话,不出三天,做事器资源就会被挤爆。说到这里是不是觉得这种场景似曾相识呢,此时我们就会创造这种场景和TCP三次握手时候的半连接攻击一模一样。
大致流程如下:

1.如果对方主机不可达,一样平常在建立连接之前就会出错。
2.如果对方主机可达,运用程序正常,对方相应ACK应答,就认为是存活的。
3.如果对方主机可达,运用程序退出,对方相应RST应答,发送TCP撤消连接。
4.如果对方主机可达,运用程序崩溃,对方相应FIN应答。要求开释连接。
5.如果对方主机无相应,即同时无ACK, RST,那么就会持续发送,直到超时。此时开始撤消连接。这个韶光一样平常默认为两个小时。
举例解释:
这里是
SO_KEEPALIVE:KeepAlive掌握开关,打开或关闭。
TCP_KEEPIDLE:设置空闲韶光,即有多久没有发送报文就进行探测。
TCP_KEEPCNT:设置KeepAlive的考试测验次数,
TCP_KEEPINTVL:设置重试KeepAlive的报文间隔。
须要把稳的是TCP_KEEPIDLE和TCP_KEEPINTVL是不一样的,前者是须要进行KeepAlive探测的空闲韶光,而后者是在某次KeepAlive探测失落败,再次重试的间隔韶光。
对付上面的代码段来说,当该TCP连接有5秒没有进行数据传输时,就会发送KeepAlive探测报文。当探测报文失落败时,会隔2秒再次发送探测报文,3次探测失落败就判断连接失落败。
HTTP的Keep-Alive众所周知HTTP/1.0,默认利用的是短连接。也便是说,浏览器和做事器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。这是由于早期的Web要求比较大略,大部分是图文,一次性将页面所须要的数据全部加载,然后页面渲染。但是随着互联网的发展,涌现了各种各样比较繁芜的场景,最常见的便是在线视频,在线游戏等等。那么此时如果还是短链接,就会频繁地建立销毁链接,占用大量的资源。于是乎HTTP/1.1便开始默认长连接了。此时此刻我们的主角Keep-Alive该上场了。
怎么理解Keep-Alive呢,我们的直不雅观感想熏染便是一个标记而已,当开启Keep-Alive后,HTTP连接不会立马断开,而是可以被下一个要求连续复用,这就省去了频繁的创建和销毁。同样的,在吸收完相应报文后,客户端也不关闭连接,发送下一个 HTTP 要求时会重用该连接。
在 HTTP/1.0 协议中,如果要求头中包含:
Connection: Keep-Alive
前面我们说过HTTP/1.0默认的是短连接,但是如果在要求头中加上Connection: Keep-Alive理论上是可以实现长连接的,不过这个默认不开启。
在 HTTP/1.1 协议中,默认开启 keep-alive,除非显式地关闭它:
Connection: clos
举例解释:
任意取一个相应报文。
由上面的示例可以看到里面的相应头部有一个Connection: Keep-Alive,这个键值对的浸染是让HTTP保持连接状态,由于HTTP 协议采取“要求-应答”模式,当利用普通模式,即非 Keep-Alive 模式时,每个要求/应答客户和做事器都要新建一个连接,完成之后立即断开连接(HTTP 协议为无连接的协议);当利用 Keep-Alive 模式时,Keep-Alive 功能使客户端到做事器真个连接持续有效。
在HTTP 1.1版本后,默认都开启Keep-Alive模式,只有加入加入 Connection: close才关闭连接,当然也可以设置Keep-Alive模式的属性,例如 Keep-Alive: timeout=5, max=100,表示这个TCP通道可以保持5秒,max=100,表示这个长连接最多吸收100次要求就断开。
总结这里只是大略地先容了一下两者的差异,足够搪塞口试了。如果要深入理解,一定是涉及TCP和HTTP底层的,一天一夜也说不清楚。这里只须要明白两者是干什么的就行,大致差异即可,当然如果要理解更多的网络口试知识,可以关注一下
说了这么多,各位看官大人要怎么获取呢。很大略,关注
如果大家有比较好的资源欢迎相互互换,共同提高。同时有部分素材来源于网络,如侵,联删。