SRT拥塞控制分析

一 变量解释

  1. m_LastRCTime:这个变量通常用来记录最后一次接收到数据包的时间戳。它用于计算往返时间(RTT),即数据包从发送端发送到接收端,再从接收端返回确认(ACK)的时间。这个时间戳对于拥塞控制和网络状况的评估非常重要。
  2. m_iRCInterval:这个变量可能指的是接收端发送ACK数据包的时间间隔。它决定了ACK数据包的发送频率,从而影响发送端对网络状况的感知速度。
  3. m_bSlowStart:这是一个布尔变量,用于指示当前是否处于慢启动阶段。在慢启动阶段,发送端会逐渐增加发送速率,直到网络出现丢包,这时会触发拥塞控制机制,减少发送速率。
  4. m_iDeliveryRate:这个变量表示接收端的数据包到达率,即每秒接收到的数据包数量。它反映了接收端每秒能够接收的数据包的数量,是衡量网络接收性能的一个重要参数。
  5. m_dCWndSize:拥塞窗口的大小,用于控制发送端在网络中可以发送的最大数据量,而不会导致网络拥塞或丢包。这个值是动态调整的,以适应网络条件的变化。
  6. m_dPktSndPeriod:数据包发送周期,用于控制发送数据包的频率。这个值通常与拥塞窗口大小和往返时间(RTT)一起使用,来决定数据包的发送速率。
  7. m_bLoss:这个布尔变量可能用于指示是否检测到丢包。如果检测到丢包,发送端可能需要触发重传机制或者调整发送策略。
  8. m_maxSR:这个变量可能与SRT的最大传输速率有关,它限制了发送端可以发送数据的最大速率。
  9. m_dLastDecPeriod:这个变量可能记录了最后一次降低发送速率的时间间隔。在拥塞控制中,如果网络出现丢包,发送端可能会增加数据包发送间隔,以减少网络拥塞。
  10. m_iAvgNAKNum:平均NACK(负确认)数量,用于统计在一定时间内接收端请求重传的数据包的平均数量。这个值可以帮助发送端评估网络丢包情况。
  11. m_iNAKCount:NACK计数器,用于记录在一定时间内接收端发送的NACK数量。这个值反映了接收端缺失数据包的数量。
  12. m_iDecCount:这个变量可能与拥塞控制中的减速事件计数有关,用于记录在一定时间内发送端降低发送速率的次数。
  13. m_iLastDecSeq:记录最后一次降低发送速率时的数据包序列号。这个值用于跟踪拥塞控制事件和调整发送策略。
  14. m_iDecRandom:这个变量可能与拥塞控制中的随机性因素有关,用于在拥塞事件发生时引入随机性,以避免多个发送端同时降低速率导致的网络振荡

二 拥塞控制逻辑分析

onACK()

onLossReport()

onRTO()

onACK()

{

const steady_clock::time_point currtime = steady_clock::now();

if (count_microseconds(currtime - m_LastRCTime) < m_iRCInterval)

return;

m_LastRCTime = currtime;

//上面更新拥塞调控时间点,调整间隔为10ms

if (m_bSlowStart) //慢启动过程

{

m_dCWndSize += CSeqNo::seqlen(m_iLastAck, ack); //拥塞窗口 += 本次ack的数据量

m_iLastAck = ack;

if (m_dCWndSize > m_dMaxCWndSize) //达到拥塞窗口最大值

{

m_bSlowStart = false; //慢启动结束

if (m_parent->deliveryRate() > 0) //发送速率根据对端ack的数据计算出来的,

//对端会统计和数据接收速度

{

m_dPktSndPeriod = 1000000.0 / m_parent->deliveryRate();

HLOGC(cclog.Debug, log << "FileCC: UPD (slowstart:ENDED) wndsize="

<< m_dCWndSize << "/" << m_dMaxCWndSize

<< " sndperiod=" << m_dPktSndPeriod << "us = 1M/("

<< m_parent->deliveryRate() << " pkts/s)");

}

else

{

m_dPktSndPeriod = m_dCWndSize / (m_parent->SRTT() + m_iRCInterval); //发包间隔计算,倒数就是带宽了。

HLOGC(cclog.Debug, log << "FileCC: UPD (slowstart:ENDED) wndsize="

<< m_dCWndSize << "/" << m_dMaxCWndSize

<< " sndperiod=" << m_dPktSndPeriod << "us = wndsize/(RTT+RCIV) RTT="

<< m_parent->SRTT() << " RCIV=" << m_iRCInterval);

}

}

else

{

HLOGC(cclog.Debug, log << "FileCC: UPD (slowstart:KEPT) wndsize="

<< m_dCWndSize << "/" << m_dMaxCWndSize

<< " sndperiod=" << m_dPktSndPeriod << "us");

}

}

else //非慢启动阶段

{

//m_iRCInterval ACK间隔

m_dCWndSize = m_parent->deliveryRate() / 1000000.0 (m_parent->SRTT() + m_iRCInterval) + 16;//16为增益,拥塞窗口 = 发送速率 / 1000000rt**t + 1**0 + 1**6

HLOGC(cclog.Debug, log << "FileCC: UPD (speed mode) wndsize="

<< m_dCWndSize << "/" << m_dMaxCWndSize << " RTT = " << m_parent->SRTT()

<< " sndperiod=" << m_dPktSndPeriod << "us. deliverRate = "

<< m_parent->deliveryRate() << " pkts/s)");

}

//非慢启动阶段

}

onLossReport

{

2%以下丢包,不处理

onRTO

{

发生在慢启动阶段,和前面丢包处理一样,重新计算发送周期,如果不是慢启动阶段,暂时不处理, 因为会有丢包,这样上面onLossReport直接处理了。

}

}

相关推荐
承渊政道4 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
冻柠檬飞冰走茶5 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing036 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊6 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆6757 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩7 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
大白玉米7 小时前
MoxPlayer 弹幕播放器源码智能解析线路管理系统自研内核
php
爱和冰阔落9 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
Hhy_11079 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
starzy19909 小时前
深入理解Scala函数定义:从方法到函数的类型跨越
开发语言·scala