📜  TCP New Reno 是什么?(1)

📅  最后修改于: 2023-12-03 15:05:30.252000             🧑  作者: Mango

TCP New Reno

TCP New Reno是TCP Reno的一种变体,它是一个重传容错算法,主要用于处理拥塞控制。TCP New Reno相比于传统的TCP Reno,通过在CONGESTION AVOIDANCE (CA) 和FAST RETRANSMIT (FR)中添加新的数据块限制,可以更容易地处理网络拥塞。

TCP Reno vs New Reno

TCP Reno是TCP的原始版本。在TCP Reno使用中,如果发送方收到3个或以上的重复的ACKs,将触发快速重传,并且设置一个重传标记。这个标记将使得发送方下一次重新发送数据,不考虑当前已经传输的数据。

改进的TCP New Reno算法在面对同样的情况时,不会马上触发快速重传,而是等待前面已经发送的数据块被确认后再进行快速重传。这就意味着,TCP New Reno可以减少不必要的重传,从而减少网络拥塞的情况。

TCP New Reno的实现
算法细节
  1. TCP New Reno通过记录每个被发送数据块的ACK的数量来跟踪丢失的数据块。如果有这样的数据块,则会被快速重传。

  2. TCP New Reno使用新的数据块的限制值,这个值反映了ECN的情况。如果有任何一个ECN被接收,在每个数据块的加速阶段的ssthresh是当前cwnd的大小除以2。

  3. 在传输过程中,TCP New Reno维护着一个指向最后已经成功传输的数据块的指针,通过这个指针可以突出一些可能的错误。

代码实现
//TCP New Reno的拥塞控制算法实现

def new_reno():
    last_ack = None
    ack_count = 0
    threshold = None
    ssthresh = 65535
    congestion_window = 200
    packets_in_flight = 0
    slow_start = True

    # 网络模拟器模拟的包延迟
    simulated_delay = 0

    while True:
        # 发送一个数据包
        if packets_in_flight < congestion_window:
            send_packet()
            packets_in_flight += 1

        # 获取ACK
        ack = get_ack()

        # 到达终点
        if ack >= destination:
            break

        # 显示处理ACK
        if ack == last_ack:
            ack_count += 1

            # 重试接收丢失的包
            if ack_count == 3:
                ack_count = 0
                congestion_window = min(ssthresh, congestion_window / 2)
                last_ack = ack
                packets_in_flight = 0
        else:
            ack_count = 1
            last_ack = ack
            packets_in_flight -= 1

            # 慢启动
            if slow_start:
                congestion_window += 1
                if congestion_window >= threshold:
                    slow_start = False

            # 拥塞解除
            else:
                congestion_window += 1 / congestion_window
                if ack >= threshold:
                    ssthresh = min(congestion_window, ack)
                    congestion_window = ssthresh
                    slow_start = True

        # 添加延迟
        time.sleep(simulated_delay)
参考文献