一、窗口控制
TCP以1个段为单位,每发一个数据段进行一次ACK确认应答的处理,这样的传输方式由一个缺点,就是包的往返时间越长通信的性能越差。
一发一答
解决这个问题,提高速度,TCP引入了窗口控制这个概念。具体做法就是连续发送上限为窗口大小的数据,然后再一个一个ACK确认。即使在往返时间较长的情况下,它也能控制网络性能的下降,提高速率。
窗口控制的多发多答
窗口大小:
指无需等待确认应答而可以继续发送数据的最大值。如上图窗口大小为4个段。
滑动窗口:
收到确认应答的情况下,将窗口滑动到确认应答中的序号的位置。这样可以顺序地将多个段同时发送提高通信性能。
再窗口控制中,出现段丢失怎么办呢?
重发控制:
情况一:A向B发数据,A的数据已经发送到B端,B返回确认应答信号ACK未能到达A端情况下,是不需要进行重发的。
注意:如果是没有使用窗口控制的时候,如果没收到确认应答,数据是会重发的
情况2:A发数据到B,如果A发的数据丢失没有达到B端,接收端B会返回没收到数据的ACK给发送端A,来告诉A端接收数据失败,要重新发送。
因此,在窗口比较大,又出现报文丢失的情况下,同一个序号的确认应答将会被重复不断地返回,而发送端如果连续3次收到同一个确认应答,将会重新发送数据段。
二、流量控制
接收端在收到数据包时候会做一些处理会消耗点时间,甚至在高负荷的情况(缓冲区满了)下无法接收任何数据。如此一来,接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源,就会触发重发机制,从而导致网络流量的无端浪费。
为了防止这种情况出现,TCP提供了一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量。控制发送方的发送速率,让接收方与发送方处于一种动态平衡的状态。
对数据发送方发送速率的控制,我们称之为流量控制
具体做法:
接收端向发送端通知自己接收数据的大小,于是发送端会发送不超过这个限度的数据,该大小限度就是窗口大小。
注意:窗口大小由接收方决定
TCP首部中有一个字段用来通知窗口大小
步骤:
1.通信双方主机上都分别有一个“发送窗口”和一个“接收窗口”
2.TCP连接阶段,双方协商窗口尺寸
3.发送方根据协商的结果,发送符合窗口尺寸的数据字节流,并等待对方的确认,等待确认机制
4.发送方根据确认信息,改变窗口的尺寸
窗口探测:如果接收端返回的窗口大小为0,即发送端会停止发送数据。要等接收到返回窗口大小不为0的ACK(更新通知),发送端才会继续发送数据。
为了避免更新通知在传送途中丢失而导致发送端和接收端都处于互相等待状态中。发送端会是不是发送一个叫窗口探测的数据,来查询接收端的(更新通知)ACK应答。
三、拥塞控制
有了TCP的窗口控制,收发主机之间即使不再以一个数据段为单位发送ACK确认应答,是以连续发送大量的ACK应答数据包。然而,如果再通信刚开始时就发送大量的数据,也有可能引发其他问题。
一般来说,网络的不稳定会导致网络出现拥堵的情况,在网络拥堵时,如果突然发送一个较大的数据,极有可能导致整个网络的瘫痪。
TCP为了防止该问题的出席那,在通信一开始就会通过一个叫慢开始的算法得出瓶颈值(MAX),再对发送数据量进行控制。
拥塞窗口:即在发送端设置一个窗口结构,根据网络的拥塞情况,动态调整该窗口大小,发送端只能发送小于滑动窗口和拥塞窗口的数据,在发送端设置的这个窗口就是拥塞窗口。
方法一:慢开始 + 拥塞控制:
①开始设置拥塞窗口大小为1,每次能正常收到ACK应答,就把拥塞窗口就加倍(慢开始),直到不能正常收到ACK应答,确定慢启动阀值sthresh。
②再线性增加(拥塞控制),直到不能正常收到ACK应答,确认瓶颈值(MAX)
③再把sthresh调小,调为MAX值的一半,即ssthresh = MAX / 2
④循环①和②,只不过是知道ssthresh的值
方法二:快重传 + 快恢复
当TCP通信开始后,网络吞吐量会逐渐上升,但是随着网络拥堵的发生,吞吐量页会急速下降。于是会再次静茹吞吐量慢慢上升的过程。
注意:
“拥塞控制”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。
“拥塞控制”是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
参考文献:图解TCP/IP