LastByteAcked:第?部分和第?部分的分界线 LastByteSent:第?部分和第三部分的分界线 LastByteAcked + AdvertisedWindow:第三部分和第四部分的分界线 对于接收端来讲,它的缓存?记录的内容要简单?些 。
拥塞控制和流量控制的区别拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是:
- 慢开始、拥塞避免
- 快重传、快恢复
接收端数据结构第?部分:接受并且确认过的 。也就是我领导交代给我,并且我做完的 。第?部分:还没接收,但是?上就能接收的 。也即是我??的能够接受的最??作量 。第三部分:还没接收,也没法接收的 。也即超过?作量的部分,实在做不完 。对应的数据结构就像这样 。
MaxRcvBuffer:最?缓存的量; LastByteRead之后是已经接收了,但是还没被应?层读取的; NextByteExpected是第?部分和第?部分的分界线 。第?部分的窗?有多?呢?NextByteExpected和LastByteRead的差其实是还没被应?层读取的部分占?掉的MaxRcvBuffer的量,我们定义为A 。AdvertisedWindow其实是MaxRcvBuffer减去A 。也就是:AdvertisedWindow=MaxRcvBuffer-((NextByteExpected-1)-LastByteRead) 。那第?部分和第三部分的分界线在哪?呢?NextByteExpected加AdvertisedWindow就是第?部分和第三部分的分界线,其实 也就是LastByteRead加上MaxRcvBuffer 。其中第?部分??,由于受到的包可能不是顺序的,会出现空挡,只有和第?部分连续的,可以?上进?回复,中间空着的部 分需要等待,哪怕后?的已经来了 。
流量控制如何控制接收方每次收到数据包,可以在发送确定报文的时候,同时告诉发送方自己的缓存区还剩余多少是空闲的,我们也把缓存区的剩余大小称之为接收窗口大小,用变量win来表示接收窗口的大小 。
发送方收到之后,便会调整自己的发送速率,也就是调整自己发送窗口的大小,当发送方收到接收窗口的大小为0时,发送方就会停止发送数据,防止出现大量丢包情况的发生 。

文章插图
640830×573
发送方何时再继续发送数据当发送方停止发送数据后,该怎样才能知道自己可以继续发送数据?
我们可以采用这样的策略:当接收方处理好数据,接受窗口 win > 0 时,接收方发个通知报文去通知发送方,告诉他可以继续发送数据了 。当发送方收到窗口大于0的报文时,就继续发送数据 。
不过这时候可能会遇到一个问题,假如接收方发送的通知报文,由于某种网络原因,这个报文丢失了,这时候就会引发一个问题:接收方发了通知报文后,继续等待发送方发送数据,而发送方则在等待接收方的通知报文,此时双方会陷入一种僵局 。
为了解决这种问题,我们采用了另外一种策略:当发送方收到接受窗口 win = 0 时,这时发送方停止发送报文,并且同时开启一个定时器,每隔一段时间就发个测试报文去询问接收方,打听是否可以继续发送数据了,如果可以,接收方就告诉他此时接受窗口的大小;如果接受窗口大小还是为0,则发送方再次刷新启动定时器 。

文章插图
640867×696
拥塞控制的算法我们在开始假定:
- 数据是单方向传递,另一个窗口只发送确认;
- 接收方的缓存足够大,因此发送方的大小的大小由网络的拥塞程度来决定 。
慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小 。
这里用报文段的个数作为拥塞窗口的大小举例说明慢开始算法,实际的拥塞窗口大小是以字节为单位的 。
一个传输轮次所经历的时间其实就是往返时间RTT,而且没经过一个传输轮次(transmission round),拥塞窗口cwnd就加倍 。
为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量 。ssthresh的用法如下:当cwnd<ssthresh时,使用慢开始算法 。当cwnd>ssthresh时,改用拥塞避免算法 。当cwnd=ssthresh时,慢开始与拥塞避免算法任意
推荐阅读
- 跑步怎么控制呼吸呢
- 运动强度需控制
- 运动对血压的控制
- 如何控制孩子玩手机的时间 用手机控制另一台手机
- 手机如何控制另一台手机同步
- 飓风算法3.0即将上线,控制跨领域采集及站群问题
- 超详细的网络抓包神器 tcpdump 使用指南
- 使用此开源窗口环境一次运行多个控制台
- 葡萄干有助控制血压
- 高流量大并发Linux TCP性能调优
