概述
引言
保活机制 是一种在不影响数据流内容的情况下探测对方的方式。它是由一个 保活计时器 实现的。当计时器被触发,连接一端将发送一个 保活探测 (简称保活) 报文,另一端接收报文的同时会发送一个 ACK 作为响应
保活机制并不是 TCP 规范中的一部分,对此主机需求RFC 1122给出了三个理由:
- 在出现短暂的网络错误的时候,保活机制会使一个好的连接断开 (接收保活报文的一端可能只是因为一时的故障没有响应,故障可能很快会恢复,但另一端并不知情,他只知道自己发送的保活报文没有收到回应,那么就错误地认为对方不在工作了,于是断开连接)
- 保活机制会占用不必要的带宽 (因为不影响数据流,需要额外的报文的开销)
- 在按流量计费的情况下会在互联网上花掉更多的钱 (同样因为使用额外的报文)
保活功能一般是为服务器应用程序提供的,服务器应用程序希望知道客户主机是否崩溃或离开,从而决定是否为客户端绑定资源,毕竟作为一个服务提供方,如果对方已经不在工作了,自己自然就要结束提供服务的行为来节省自己的运行资源
利用 TCP 保活功能来探测离开的主机,有助于服务器与非交互性客户端进行相对短时间的对话,如 Web服务器,POP 等;而更多地实现长时间交互服务的服务器可能不希望使用保活功能,如 ssh 和 Windows 远程桌面 这样的远程登陆系统
描述
保活功能默认是关闭的,TCP 连接的任何一端都可以请求打开这一功能,可以设置在连接的一端,两端,或者两端都没有
如果在一段时间内 (称为 保活时间, k e e p a l i v e t i m e keepalive time keepalive time) 连接处于 非活动状态,开启保活功能的一端将向对方发送一个保活探测报文。如果发送端没有收到响应报文,那么经过 保活时间间隔 ( k e e p a l i v e i n t e r v a l keepalive interval keepalive interval),将继续发送保活探测报文,直到发送探测报文的次数达到 保活探测数 ( k e e p a l i v e p r o b e keepalive probe keepalive probe) (因为仅凭一次没有被响应不足以判断连接是否已停止工作),这时对方主机将被确认为不可到达,连接也将被中断
上面提及的三个变量在 Linux 系统中对应 sysctl 变量 net.ipv4.tcp_keepalive_time
,net.ipv4.tcp_keepalive_intvl
,net.ipv4.tcp_keepalive_probes
,默认是 7200 秒,75 秒和 9 次探测
保活探测报文为一个空报文段 (或只包含 1 字节),它的序列号等于对方主机发送的 ACK 报文的最大序列号减 1。这一序列号的数据已经被成功接收,所以不会对已到达的报文段造成影响,但探测报文返回的响应可以确定连接是否仍在工作
探测及其响应报文都不包含任何新的有效数据,当它们丢失时也不会进行重传
保活功能工作流程中,开启该功能的一方会发现对方处于以下四种状态之一:
- 对方主机仍在工作,并且可以到达。对方 TCP 响应保活探测报文正常,请求端就将保活计时器重置;如果在计时器超时之前有应用程序通过该链接传输数据 (结束了非活动状态),那么计时器也会再次被设定为保活时间值
- 对方主机已经崩溃。这时对方 TCP 将不会响应,那么经过保活时间间隔后会持续发送探测报文,直到一共发送了保活探测数指定的次数,都没有收到任何探测报文的响应,那么请求端就认为对方已经关闭,并断开连接
- 对方崩溃并已重启。此时请求端的连接相当于半开连接。这时请求端会收到一个对其探测报文的响应,但这个响应是一个重置报文段,请求端会断开连接,
- 对方主机仍在工作,但由于某些原因不能到达请求端,例如网络无法传输。这种情况与状态 2 类似,TCP 不能区分这两种状态
第 1 种情况下,请求端的应用层不会察觉到保活探测的进行 (除非请求端应用层激活保活功能),一切操作均在 TCP 层完成,对应用层是透明的;第 2,3,4 种情况下,请求端应用层将受到一个来自其 TCP 层的差错报告,例如 “连接超时”,“连接被对方重置” 等
最后
以上就是幸福小蚂蚁为你收集整理的[计算机网络]-TCP-保活机制引言描述的全部内容,希望文章能够帮你解决[计算机网络]-TCP-保活机制引言描述所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复