《TCP/IP详解 卷1》 笔记: TCP的保活定时器

来源:互联网 发布:淘宝全球购可靠吗 编辑:程序博客网 时间:2024/05/18 02:08
引言
    许多TCP/IP的初学者会很惊奇地发现可以没有任何数据流通过一个空闲的TCP连接。也就是说,如果TCP连接的双方都没有向对方发送数据,则连接上不会有任何其他信息。这意味着我们可以启动一个客户与服务器建立一个连接,然后离去数小时、数天、数个星期或者数月,而连接依然保持。中间路由器可以崩溃和重启,电话线可以被挂断再连通,但是只要两端的主机没有被重启,则连接依然保持建立。

    如果客户已经崩溃或者重启,使得在服务器上留下一个半打开的连接,而服务器又在等待来自客户的数据,则服务器将永远等待下去。保活的作用就是使服务器端能检测到这种半打开的连接。保活的功能是TCP使用保活(keepalive)定时器实现的。

描述

    通常服务器使用保活功能,如果客户希望知道服务器是否崩溃或重启,那么也可以使用保活功能。如果一个给定的连接在两个小时之内没有任何动作,则开启了保活功能的服务器就向客户发送一个保活探测报文。客户主机必须处于以下4个状态之一:

    1) 客户主机依然正常运行,并从服务器可达。客户的TCP响应保活探测报文,服务器的TCP在收到客户的响应后复位保活定时器。两小时后保活定时器会再次超时,如果在超时之前有数据流,则保活定时器会立即复位。
    2) 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应,服务器将在75秒后超时。服务器总共会发送10个这样的保活探测报文,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
    3) 客户主机崩溃并已经重新启动。这时服务器将收到一个对保活探测报文的响应,但是这个响应是一个复位,使得服务器终止这个连接。

    4) 客户主机正常运行,但是从服务器不可达。这与状态2相同,因为TCP不能够区分状态4与状态2。

    服务器不用关注客户主机被关闭(指的是用户关机,而不是主机崩溃)和重新启动的情况。当关机时,所有的应用进程也被终止,这会使客户的TCP在连接上发出一个FIN。接收到FIN将使服务器的TCP向服务器进程报告文件结束,使服务器可以检测到这个情况。

保活举例

 另一端崩溃

    对服务器而言,客户崩溃和不可达的情况是一样的,于是我们可以拔掉两者之间的网线来模拟客户崩溃。在这个例子中,我们在主机bsdi上和主机svr4上的标准回显服务之间建立一个连接,并开启客户的保活功能。先发送一行数据,等待四个小时,然后拔掉网线,再等待两个多小时。tcpdump的输出如下:


    可以观察到两小时后,客户的TCP发出一个保活探测报文(第6行)。这个保活探测报文不包含任何数据,如果能观察到报文段中的所有字段,我们就会发现序号字段比下一个将要发送的序号字段小1(在本例中,当下一个发送的序列号为14时,它就是13)。正是接收到这个不正确的序号,才导致服务器的TCP对保活探测报文进行响应。

    四小时后,我们拔掉网线,再等待两小时,我们观察到了10个ARP请求报文,这些ARP请求正是TCP发送保活探测报文引起的。这说明TCP总共要发送10个保活探测报文,每个报文间隔75秒。

 另一端崩溃并重启

    我们在上个例子中,断开网线后再将svr4主机重启就能模拟这种情况。等待两个小时后,tcpdump的输出如下:


    可以看到,在客户TCP发出保活探测报文后,立即收到服务器TCP响应的复位报文段。

阅读全文
0 0
原创粉丝点击