📜  在 TCP Tahoe 中找到最终的拥塞窗口大小

📅  最后修改于: 2022-05-13 01:56:09.807000             🧑  作者: Mango

在 TCP Tahoe 中找到最终的拥塞窗口大小

给定初始拥塞窗口大小cwnd 、阈值ssthresh 、连接时间rtt和数组arr ,其中 arr[i] 表示检测到丢包的时间。任务是在发送方遇到所有丢包时找到最终的拥塞窗口大小。

例子:

方法:想法是牢记所有约束并编写代码以最小的时间和空间复杂度运行。按照以下步骤操作:

  • 当连接处于活动状态时,遍历所有时间单位。
  • 将下一个丢包时间存储在可变超时
  • 检查当前时间是否等于超时。如果是,则减少ssthresh = cwnd/2并将cwnd 重置为 10
    • 如果 cwnd 小于ssthresh ,则将cwnd值加倍。
    • 如果cwnd的两倍大于ssthresh ,则设置cwnd=ssthresh。
    • 如果cwnd大于ssthresh ,则每次将cwnd增加 1。
  • 循环终止后返回最终的cwnd值。

下面是上述方法的实现。

C++
// C++ code to find the final size
// of congestion window in TCP TAHOE
 
#include 
using namespace std;
 
// TCP Tahoe Utility function
int tcpTahoeCongestionWindow(
    int initcwnd, int cwnd,
    int ssthresh, int rtt,
    vector time)
{
    int ind = 0, timeout = time[ind];
    for (int t = 1; t <= rtt; t++) {
 
        // Packet loss occurs.
        // Reduce ssthresh to half of
        // current cwnd value.
        // Reset cwnd to 10
        if (t == timeout) {
            ssthresh = cwnd / 2;
            cwnd = initcwnd;
            timeout = time[++ind];
            continue;
        }
 
        // Threshold is not reached.
        // Keep doubling
        if (cwnd < ssthresh)
            cwnd = min(2 * cwnd,
                       ssthresh);
 
        // Threshold is reached.
        // Increase additively.
        else
            cwnd += 1;
    }
 
    // Return final cwnd value.
    return cwnd;
}
 
// Driver code
int main()
{
    int initcwnd = 10, cwnd = 10;
    int ssthresh = 300;
    int rtt = 50;
    vector time{ 12, 20, 31, 45 };
 
    // Function call
    cwnd = tcpTahoeCongestionWindow(
        initcwnd, cwnd,
        ssthresh, rtt, time);
    cout << cwnd;
    return 0;
}


Javascript



输出
Final congestion window size = 29

时间复杂度: O(N),N是连接活跃的时间。
辅助空间: O(1)