第22章 TCP的坚持定时器
TCP通过让接收方指明希望从发送方接收的数据字节数(即窗口大小)来进行流量控制。如果窗口大小为0将有效阻止发送方传送数据,直到窗口变为非0为止。
ACK的传输不可靠,TCP不对ACK报文段进行确认,TCP只确认那些包含有数据的ACK报文段。
为了防止 “接收方等待接收数据(因为它已经向发送方通告了一个非0窗口),而发送方在等待允许它继续发送数据的窗口更新” 这种死锁发生,发送方使用一个坚持定时器(persist timer)来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查(window probe)。
坚持状态与重传超时之间的一个不同的特点就是TCP从不放弃发送窗口探查,这个过程将持续到 或者窗口被打开,或者应用程序使用的连接被终止。
糊涂窗口综合症
糊涂窗口综合症(SWS,Silly Window Syndrome)发生时会出现:少量的数据将通过连接进行交换,而不是满长度的报文段。
该现象可发生在两端中的任何一端:接收方可以通告一个小的窗口(而不是一直等到有大的窗口时才通告),而发送方也可以发送少量的数据(而不是等待其他的数据以便发送一个大的报文段)。可以在任何一端采取措施避免出现糊涂窗口综合症的现象。
- 接收方不通告小窗口。通常的算法是接收方不通告一个比当前窗口大的窗口(可以为0),除非窗口可以增加一个报文段大小(也就是将要接收的MSS)或者可以增加接收方缓存空间的一半,不论实际有多少。
第23章 TCP的保活定时器
保活定时器不是TCP规范的一部分。
保活功能主要是为服务器应用程序提供,试图在服务器端检测客户端已消失的半开放的连接。
使用保活选项的一端称为服务器,另一端则为客户端,可以两端都使用。
如果一个给定连接在两个小时内没有任何动作,则服务器向客户发送一个探查报文段。客户主机必须处于以下4个状态之一:
- 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常工作的。服务器在两小时以后将保活定时器复位。如果在两个小时定时器到时间之前有应用程序的通信量通过此连接,则定时器在交换数据后的未来2小时再复位。
- 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务器将不能够收到对探查的响应,并在75秒后超时。服务器总共发送10个这样的探查,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
- 客户主机崩溃并已经重新启动。这时服务器将收到一个对其保活探查的响应,但是这个响应是一个复位,使得服务器终止这个连接。
- 客户主机正常运行,但是从服务器不可达。这与状态2相同,因为TCP不能够区分状态4与状态2之间的区别,它所能发现的就是没有收到探查的响应。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。