Notes On TCP/IPv1 Ch.22
-
对报文的确认(单独一个ACK)并不是可靠传输, ACK用来确认报文, 但是没有ACK用来确认ACK. (Page.323)
-
如果TCP连接的一方进入发送了0窗口, 在一段时间后再次打开窗口, 而这个打开窗口的报文丢失了, 如果没有其他机制进行保护, 那么TCP连接的双方就会进入死锁状态: 一方等待对方发送数据, 一方等待对方打开窗口. Persist计时器就是用来解决这个问题的, 即使对方声明了0窗口, 另一方在persist计时器超时后也会尝试向对方发送”窗口探询”. (Page.323)
-
收到0窗口后启动persist计时器, 超时后马上发送窗口探询, 如果窗口探询的结果也是0窗口, 那么persist计时时间加倍(指数退避). Persist计时器也使用TCP超时重传时间, 但是persist计时时间会被限制在[5, 60], 超出这个范围会被调整到这个范围内. 窗口探询不会停止(不像超时重传9min, SYN超时75sec, FIN_WAIT_2完全关闭10min+75sec). (Page.325)
-
Persist计时器也使用500ms超时触发机制. (Page.325)
-
“糊涂窗口综合症(SWS)”就是接收方打开一个小窗口(i.e几个字节), 或者发送方随意发送小报文(i.e 也是几个字节), 或者两者皆有, 从而导致网络负担加重. (Page.325)
-
避免糊涂窗口综合症, 接收方如果要声明比上一次声明的窗口值更大的窗口, 这次的窗口值要比上次的窗口值大min(自己的MSS, 自己的rwnd/2); 而发送方如果要发送报文, 要么报文的体积要大于min(接收方的MSS, 接收方的rwnd/2), 或者对方声明的窗口大小允许一次性发送完缓存中的所有数据, 或者nagle算法被关闭. (Page.325, 326)
-
接收方每次读取数据时会检查是否满足发送窗口更新的条件, 满足的话会发送窗口更新. (Page.330)