📅  最后修改于: 2023-12-03 15:05:30.252000             🧑  作者: Mango
TCP New Reno是TCP Reno的一种变体,它是一个重传容错算法,主要用于处理拥塞控制。TCP New Reno相比于传统的TCP Reno,通过在CONGESTION AVOIDANCE (CA) 和FAST RETRANSMIT (FR)中添加新的数据块限制,可以更容易地处理网络拥塞。
TCP Reno是TCP的原始版本。在TCP Reno使用中,如果发送方收到3个或以上的重复的ACKs,将触发快速重传,并且设置一个重传标记。这个标记将使得发送方下一次重新发送数据,不考虑当前已经传输的数据。
改进的TCP New Reno算法在面对同样的情况时,不会马上触发快速重传,而是等待前面已经发送的数据块被确认后再进行快速重传。这就意味着,TCP New Reno可以减少不必要的重传,从而减少网络拥塞的情况。
TCP New Reno通过记录每个被发送数据块的ACK的数量来跟踪丢失的数据块。如果有这样的数据块,则会被快速重传。
TCP New Reno使用新的数据块的限制值,这个值反映了ECN的情况。如果有任何一个ECN被接收,在每个数据块的加速阶段的ssthresh是当前cwnd的大小除以2。
在传输过程中,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)