写在前面:本文章是针对《计算机网络第七版》的学习笔记
1. TCP的流量控制
所谓流量控制,就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口实现流量控制
设A向B发送数据,在建立连接时,B告诉A它的接收窗口大小是rwnd = 400,发送方的发送窗口的大小不能超过接收方的接收窗口的大小。设每一个报文段的大小是100字节,初始时序号为1。
B进行了3个流量控制。第一次将窗口大小降为300,第二次降为100,第三次降为0。降为0时,发送方A将停止发送直到B发送新的窗口值为止。B向A发送的三个报文段的ACK=1,只有在ACK=1时确认字段才有效。
但是如果B一直没有发送新的窗口值,这种死锁情况会一直持续。为了解决这个问题,TCP为每一个连接设有一个持续计时器。只要发送方收到窗口为0的确认报文就开启,若持续计时器设置的时间到了,就发送一个零窗口的探测报文段(仅仅一个字节),而对方在接收到了这个报文段后就确认并发送新的窗口值,如果窗口值仍为0,则重置持续计时器,继续计时。
2. TCP的拥塞控制
为什么出现拥塞?
- 网络中的带宽资源、交换节点的缓存以及处理机等资源有限,当对资源的需求大于可用的资源时,则会出现拥塞。
拥塞控制与流量控制的区别?
拥塞控制与流量控制关系密切。拥塞控制就是防止过多的数据注入到网络,这样使网络中的链路或路由器不至于过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程。
而流量控制往往是点对点的控制,是端到端的问题(接收到控制发送端)。流量控制就是抑制发送端发送数据的速率,以便接收端来得及接收。
拥塞控制的方法
TCP进行拥塞控制的方法主要有四种:慢开始、拥塞避免、快重传、快恢复。我们先假定:
数据是单方面传输的,对方只传送确认报文;
接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度确定。
我们讨论的是基于窗口的拥塞控制。首先,发送方维持一个叫做拥塞窗口cwnd的状态变量。发送方让自己的发送窗口等于拥塞窗口。
判断网络出现拥塞的依据:是否出现了超时。
慢开始算法: 当主机开始发送数据时,由小到大的增大窗口值。初始窗口值设为不超过2-4个SMSS(最大报文段)的数值。慢开始规定,每收到一个对新的报文段的确认后:
拥塞窗口cwnd每次增加的量 = min(N,SMSS)
其中N是原先未被确认的,但是刚刚收到的确认报文段所确认的字节数。
一开始设置cwnd = 1,发送第一个报文段M1,接收方收到后确认M1;
收到M1的确认后,cwnd设置为2,并发送M2,M3,接收方确认M2,M3;
收到M2,M3的确认后,cwnd设置为4,并发送M4,M5,M5,M7;
......
在TCP的实际运行中,发送方只要收到一个对新报文段的确认,其拥塞窗口cwnd就立即加1,并可以立即发送新的报文段,而不需要等这个轮次中所有的确认都收到后再发送新的报文段。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。慢开始门限ssthresh的用法:
当cwnd<ssthresh时,使用上述的慢开始算法;
当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法;
当cwnd=ssthresh时,既可以使用慢开始算法,也可以使用拥塞避免算法。
拥塞避免算法 :让cwnd缓慢的增大(线性),即每次经过一个RDD时间就把发送方的拥塞窗口加1。因此,拥塞避免阶段就有“加法增大”的特点。
如图:
初始时,将cwnd设为1,慢开始门限值设为ssthresh = 16,一开始先采用慢开始算法进行指数增长,直到cwnd=16;
当cwnd=16时,采用拥塞避免算法,cwnd开始线性增长;
当cwnd=24时,网络出现的超时,判断为拥塞情况。于是将ssthresh设为当前cwnd的一半,也就是12,同时设置cwnd为1,重新开始慢开始算法;
当cwnd=12时,开始执行拥塞避免算法;
假设在cwnd=16时,出现了一个新的情况,就是发送方一连收到三个对同一个报文段的重复确认。这是因为:个别报文会在网络中丢失,但是网络并未发生拥塞,如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞,错误的导致发送方启动慢开始,降低了传输效率。
快重传算法: 采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是立即发送确认,即使收到失序的报文段也发送对已收到报文段的重复确认。如上图,M1和M2都收到了确认,但是M3丢失了,因此在发送M4,M5,M6时接收方要重复发送对M2的确认。当发送方收到3个连续的M2确认后,就知道M3丢失了,因此立即重传M3,这时就不会出现超时。快重传算法使网络吞吐量增大20%。
发送方知道只是丢失了个别报文段,因此不重启慢开始算法,而是使用快恢复算法。
快恢复算法: 发送方将门限值ssthresh设为cwnd的一半,并将cnwd设为门限值,开始执行拥塞避免算法。快恢复算法具有“乘法减小”特点。
当然也有的快恢复算法是把cwnd再增大一些(+3),因为受到3个重复的确认,表明有三个分组离开了网络,这三个分组不占用网络的资源而是存储在接收方的缓存中,因此cwnd可以扩大3。
另外,发送窗口的大小不能大于接收窗口的大小。