TCP窗口滑动协议与拥塞控制

滑动窗口

TCP全双工; A给B发送数据,则A有发送缓冲区; B有接收缓冲区。应用层的
所有需要发送的数据都被放在了发送者的发送缓冲区。发送窗口是发送缓存中的一部分,是可以被TCP协议发送的那部分。已发送并收到确认的数据、已发送但未收到确认的数据、允许发送但尚未发送的数据、以及暂不允许发送的数据;每次成功发送数据之后,发送窗口就会在发送缓冲区中按顺序移动,将新的数据包含到窗口中准备发送
在这里插入图片描述在这里插入图片描述

流量控制

建立连接的时候,B会告诉A,自己的接收窗口大小(rwnd)。B每次给A回复确认数据包(ACK)也会告诉A自己的接收窗口大小。如果B告诉A自己的缓冲区已满(rwnd=0),A则停止发送数据。
持续(persist) 定时器 如果B已经告诉A自己的缓冲区已满,于是A停止发送数据;等一段时间后,B的缓冲区出现了富余,于是发送报文告诉A我的RWND大小为400,但是这个报文不幸丢失了,于是就出现了A等待B的通知 || B等待A发送数据的死锁状态。
为了解决这个问题,TCP引入了持续计时器(Persistence timer)当A收到对方的零窗口通知时,就启动该计时器,时间到则发送一个字节的探测报文,对方会在此时回应自身的接受窗口的大小,如果结果仍为0,则重设持续计时器(更新),继续等待。

传输效率

单个发送字节单个确认,小包造成网络拥塞
Nagle算法:尽可能 一次多发送几个字节,避免网络因为太多的小包(协议头的比例非常之大)而拥塞只允许一个未被ACK的包存在于网络

  1. 如果包长度达到MSS(网络最大传输报文段 1460字节(以太网)),则允许发送;
  2. 如果该包含有FIN,则允许发送;
  3. 设置了TCP _NODEL AY选项,则允许发送;禁止Nagle算法。
  4. 未设置TCP CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送设置该选项后,内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去,当然若一定时间后(一般为200ms,该值尚待确认),内核仍然没有组合成一个MTU时也必须发送现有的数据,CORK算法的目的是提高网络的利用率,使得总体上协议头占用的比例尽可能的小。
    inton = 1;
    setsockopt (fd, SOL TCP, TCP CORK, &on, sizeof (on))
  5. 上述条件都未满足,但发生了超时( 一般为200ms),则立即发送接收方等待一段时间, 或者接收方获得足够的空间容纳一一个报文段或者等到接收缓存有一半空闲的时候,再通知发送方发送数据
    在这里插入图片描述

拥塞控制

慢开始算法

发送方维持一个“拥塞窗口(cwnd, congestion window)”的变量,单位为MSS (最大报文段长度,1460) 发送方让自己的发送窗口等于拥塞窗口,另外考虑到接收方的接收能力,发送窗口可能小于拥塞窗口,cwnd(拥塞窗口)和rwnd(接收窗口)的最小值决定了数据传送。发送窗口 = min(cwnd, rwnd)
当发送方开始发送数据时,cwnd=1 只发送1个报文,避免一下将大量数据发送到网络,造成拥塞;当收到确认后,cwnd=2 就发送2个报文;若再次收到2个确认,则发送4个报文,依次递增2的指数级;最后会达到一个提前预设的“慢开始门限(ssthresh)”,比如24,即一次发送了24个MSS, 此时遵循下面的条件判定:*
cwnd < ssthresh,继续 使用慢开始算法;
cwnd>ssthresh,停止使用慢开始算法,改用拥塞避免算法;
cwnd = ssthresh,既可以使用慢开始算法,也可以使用拥塞避免算法;
在这里插入图片描述

拥塞避免算法

加法增大:每经过个往返时间RTT(Round-TripTime), 拥塞窗口+1, 即让拥塞 窗口缓慢地增大, 按照线性规律增长;
很多题目中告知的是对每一个段进行确认,注意是每一个段。那么确认的时候,一定告诉了当前rwnd的大小,那么这个时刻的cwnd增长不是粗粒度,而是每收到一个确认,cwnd就加一个MSS.
为什么是指数增加
数据链路层的RTT是往返时延,而TCP中的RTT是一个传输轮次。就是当前发送窗口全部发出并全部得到确认。
因此,假设当前发送窗口是4,那么全部发出再全部确认,且此时还是在慢开始阶段,就意味着一个RTT后,发送窗口大小是8.
具体过程是这样的:

第一段的确认回来了,发送窗口 = 4+1 = 5;
第二段的确认回来了,发送窗口 = 5+1 = 6;
第三段的确认回来了,发送窗口 = 6+1 = 7;
第四段的确认回来了,发送窗口 = 7+1 = 8;

所以一个比较细致的过程是对一个MSS一个MSS增长的。
而达到门限值时,一个RTT才增长一个MSS,就不是每收到一个段的确认就加一个MSS那么快了。

乘法减小:当出现网络拥塞,比如丢包时,将慢开始门限(ssthresh) 设为原先的一一半,然后将cwnd设为1,执行慢开始算法(较低的起点,指数级增长) ;

快重传和快恢复

快重传和快恢复则是为了减少因为拥塞导致的数据包丢失带来的重传时间
快重传的机制是:

  1. 接收方如果一个包丢失,则对后续的包继续发送针对该包的重传请求;
  2. 一旦发送方接收到三个一样的确认(连续的4个相同的ACK,标志着1个数据段已丢失),就知道该包之后出现了错误,立刻重传该包:

当接收方收到了一个失序的报文,马上报告给发送方,我没收到,赶紧重传(天下武功唯快不破),加入M2收到了,M3没有收到,之后的M4,M5,M6又发送了,此时接收方一共连续给发送方反馈了4个M2确认报文。那么快重传规定,发送方只要连续收到3个重复确认,立即重传对方发来的M3

此时发送方开始执行“快恢复”算法:

  1. 慢开始门限减半;
  2. cwnd设为慢开始门限减半后的数值;执行拥塞避免算法(高起点,线性增长);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值