莫愁前路无知己,天下谁人不识君。——《别董大二首》唐·高适
滑动窗口发送数据
滑动窗口是以字节为单位发送数据。
通过窗口的滑动来高效的发送数据到缓存。
TCP的流量控制
利用滑动窗口实现流量控制
流量控制即为让发送方发送数据不要太快,要让接收方来得及处理。
当发送方与接收方在建立连接之初就会协商一个发送窗口值s和接收窗口值r(通常s<=r,单位是字节)。当接收方发现发送来的数据丢失就会缩小接收窗口,当接收窗口的缓存已被数据填满,那么就不会允许再次发来数据,并置接收窗口值为0。
此刻,可能会出现死锁情况:当接收窗口被置为0后,接收端处理了缓存中的数据,再次发送一个大于0的窗口值给发送端,若是该报文段丢失了,那么会出现相互等待的情况,即发送端等待接收端发送一个不为0的报文段,而接收端等待发送端发送数据,由此形成了死锁。
为解决该问题TCP使用了接收持续计时器,即连接中的一方收到0窗口值后就会启动该计时器,计时器满,就会发送一个试探报文段(它只携带一个字节数据),若另一方收到该报文段就会发送给对方自己现在的窗口值,若窗口值还是0,那么重置计时器,若不是,则继续发送数据,死锁打破。
TCP的传输效率
未完待续。。。。。。
流量控制和拥塞控制的区别
拥塞控制是控制整个输入网络中的数据,使路由器和链路中的负荷不至于过载;流量控制是减少发送端发送数据的速率,是接收端来得及处理。
范围不同
流量控制针对的是TCP连接的两端,而拥塞控制针对的是整个互联网络,包括所有的路由器和主机。
TCP的拥塞控制
拥塞控制的一般原理
什么是网络拥塞?
某段时间内对网络中的某种资源的需求大于它能提供的资源数量,就会产生网络拥塞,当网络中许多资源同时产生拥塞,网络吞吐量量就会产生明显下降。
实践证明,拥塞控制是很难设计的,因为它是一个动态的(而不是静态的)问题。当前网络正朝着高速化的方向发展,这很容易出现缓存不够大而造成分组的丢失。但分组的丢失是网络发生拥塞的征兆而不是原因。在许多情况下,甚至正是拥塞控制本身成为引起网络性能恶化甚至发生死锁的原因。这点应特别引起重视。
开环控制和闭环控制
开环控制
在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞。
闭环控制
基于反馈环路的概念。属于闭环控制的有以下几种措施:
(1) 监测网络系统以便检测到拥塞在何时、何处发生。
(2) 将拥塞发生的信息传送到可采取行动的地方。
(3) 调整网络系统的运行以解决出现的问题。
检测网络拥塞的指标
由于缺少缓存空间而被丢弃的分组的百分数;
平均队列长度;
超时重传的分组数;
平均分组时延;
分组时延的标准差,等等
拥塞控制的判断
1 重传计时器超时
2 收到三个重复的确认
拥塞控制算法
控制方法
TCP采用基于窗口的拥塞控制,该方法属于闭环控制。TCP发送端将会维持一个拥塞窗口(cwnd),该窗口大小取决于网络拥塞程度。实际值=Min(公告窗口值,拥塞窗口值)。
慢开始算法
思路:将会由小到大增加拥塞窗口的数值。呈指数级增长,所以增加很快。
cwnd:通常会把初始拥塞窗口值设为不超过2到4个最大报文段(SMSS)值。
ssthresh:慢开始门限,是为了防止拥塞窗口过大引起网络拥堵
拥塞窗口控制:在每收到一个对新的报文段的确认后(不算重传,即每经过一个传输伦次后就加倍),可以把拥塞窗口增加最多一个 SMSS 的数值。(通常增加原来的2倍数)
传输伦次:一个传输伦次就是往返时间RTT,“一轮”是指把拥塞窗口所允许的报文数都连续发传去。
拥塞窗口cwnd每次的增加量 = min (N, SMSS)
其中 N 是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。不难看出,当 N < SMSS 时,拥塞窗口每次的增加量要小于 SMSS。用这样的方法逐步增大发送方的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。
拥塞避免算法
当拥塞窗口cwnd>=ssthresh门限值时,就会开始执行拥塞避免算法
思路:让拥塞窗口缓慢增大,这个时候不是加倍,而是只加一.
此时也处于“加法增大”阶段
无论在慢开始还是拥塞避免阶段,当出现超时重传时,就会执行慢开始算法
ssthresh = max(cwnd/2,2)
cwnd = 1
执行慢开始算法
这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
当连续收到三个重复确认时就会执行快重传/快恢复算法
快重传算法
采用快重传FR (Fast Retransmission) 算法可以让发送方尽早知道发生了个别报文段的丢失。
快重传 算法首先要求接收方不要等待自己(接收方)发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。
发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。
快恢复算法
当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR (Fast Recovery) 算法:
(1) 慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2 ;
(2) 新拥塞窗口 cwnd = 慢开始门限 ssthresh ;
(3) 开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
拥塞控制流程图
这一节学得不是很好,待后来慢慢体会和感悟,加油!