TCP数据流与窗口管理
TCP的动态数据传输。
为什么需要管理TCP数据流量呢?
因为网络的负载能力有限,当包的数量超过网络的负载能力,网络就会很慢。

为什么需要管理TCP窗口呢?
1、同管理数据流量相同,要减缓网络压力。
2、当包的发送速率大于接收速率时,可能会出现丢包的情况,为了避免丢包和考虑到接收方的处理的能力。

为了一定程度上减缓拥塞,下面两种方法,分别是延时确认和Nagle算法。

1、延时确认
TCP并不是对每个数据报都返回ACK,累积确认机制使得TCP可以延迟一段时间发送ACK。实践中通常最大延迟取200ms,在达到效果的同时要尽量保证不让正常的包发生超时。

在ssh中,从客户端到服务器键入的每个字符都会生成一个独立的包。(若用户的输入速度较快,每个包可能含有多个字符)如果只有一个字符的话,由wireshark可以看出,一个包的大小是88字节,有40字节作为头部,有效数据之后48字节,有效占比不到55%。

假设输入的是date,本来一个包就可以成功传输,但是现在需要四个包。这会造成网络在一定程度上的拥塞。
为了避免这样的情况,提出了Nagle算法。

2、Nagle算法
算法要求:当一个TCP连接中有在传数据时,长度小于发送方最大段大小SMSS的报文段不能被发送,直到所有的在传数据都收到ACK。并且,在收到ACK后,TCP需要收集这些小数据,将其整合到一个报文段中发送。

但是Nagle对于交互式的程序,比如多人网络游戏等,并不适用。因为把小包整合起来并且等到TCP连接中没有在传数据后才发送,反馈太慢。

窗口管理
滑动窗口。TCP发送方和接收方动态地告知对方最大窗口大小,一般二者相等。滑动窗口的左边界不能左移,只能右移。因为它控制的是已确认的ACK号。

零窗口
当窗口变为0,可以有效阻止发送端发送数据。

但是,如果当窗口更新的时候,携带窗口更新的ACK丢失了怎么办?
这样发送方一直不会发送,接收方一直等待接收数据,会形成死锁,为了避免这种情况,发送端会采用一个持续计时器间歇性地查询接收端,看其窗口是否增长,这成为窗口探测。
[RFC1122]建议在一个RTO之后发送第一个窗口探测,随后以指数时间间隔发送。

糊涂窗口综合征
待写

紧急机制
待写

与窗口管理相关的攻击
1、通知窗口较小会使得TCP传输减慢,因此会更长时间地占用资源,如存储空间。
2、基于已知的持续计时器的缺陷,采用客户端多“SYN cookies”技术。所有必要的连接状态都可以下载到受害主机进行,从而使得攻击方主机消耗最少的资源。