#include #include class CTCP: public CCC { public: void init() { m_bSlowStart = true; m_issthresh = 83333; m_dPktSndPeriod = 0.0; m_dCWndSize = 2.0; setACKInterval(2); setRTO(1000000); } virtual void onACK(const int& ack) { if (ack == m_iLastACK) { if (3 == ++ m_iDupACKCount) DupACKAction(); else if (m_iDupACKCount > 3) m_dCWndSize += 1.0; else ACKAction(); } else { if (m_iDupACKCount >= 3) m_dCWndSize = m_issthresh; m_iLastACK = ack; m_iDupACKCount = 1; ACKAction(); } } virtual void onTimeout() { m_issthresh = getPerfInfo()->pktFlightSize / 2; if (m_issthresh < 2) m_issthresh = 2; m_bSlowStart = true; m_dCWndSize = 2.0; } protected: virtual void ACKAction() { if (m_bSlowStart) { m_dCWndSize += 1.0; if (m_dCWndSize >= m_issthresh) m_bSlowStart = false; } else m_dCWndSize += 1.0/m_dCWndSize; } virtual void DupACKAction() { m_bSlowStart = false; m_issthresh = getPerfInfo()->pktFlightSize / 2; if (m_issthresh < 2) m_issthresh = 2; m_dCWndSize = m_issthresh + 3; } protected: int m_issthresh; bool m_bSlowStart; int m_iDupACKCount; int m_iLastACK; }; class CUDPBlast: public CCC { public: CUDPBlast() { m_dPktSndPeriod = 1000000; m_dCWndSize = 83333.0; } public: void setRate(double mbps) { m_dPktSndPeriod = (m_iMSS * 8.0) / mbps; } };