dctcp 比 reno,cubic 好在哪

devtools/2024/9/23 21:45:43/

dctcp 相比标准 aimd 如 reno,cubic 到底好在哪,理论上讲 dctcp 本质上也是 aimd 算法,但它的 cwnd 根据 mark rate 来实时缩放,而标准 reno/cubic 则一致缩放 β = 0.5(reno) or β = 0.3(cubic),直观上看 dctcp 是连续平滑的缩放,而 aimd 则是一瞬间缩放,这对随机丢包环境非常不抗造。

在非随机丢包的拥塞丢包场景,dctcp 对拥塞的敏感性要比 reno/cubic 强很多,它会按照 mark rate 来缓慢降 cwnd,并且在拥塞缓解时迅速感知,不必继续降 cwnd:

W = W − α 2 ⋅ W W=W-\dfrac{\alpha}{2}\cdot W W=W2αW

为此,我对 dctcp 做了如下的模拟:

d W d t = { 1 , y ≤ 0 − 0.5 ⋅ y ⋅ W , y > 0 \dfrac{dW}{dt} = \begin{cases} 1, & y \leq 0 \\ -0.5\cdot y\cdot W, & y \gt 0 \end{cases} dtdW={1,0.5yW,y0y>0

而相应的 reno/cubic 过程则是:

d W d t = { 1 , y ≤ 0 − β ⋅ W , y > 0 \dfrac{dW}{dt} = \begin{cases} 1, & y \leq 0 \\ -\beta\cdot W, & y \gt 0 \end{cases} dtdW={1,βW,y0y>0

这就能绘制出经典的 tcp 锯齿了,如下图:
在这里插入图片描述

可以非常清晰得看出在连续拥塞和缓解(sin 函数模拟),密集随机丢包和稀疏随机丢包三种模式下,dctcp 均可获得更小的 cwnd 损失。

dctcp 这个收益难道来自算法的精妙吗?不!它来自 ecn 带来的更加确定的信息。

上图的代码如下:

#!/opt/homebrew/bin/python3import sys
import numpy as np
import matplotlib.pyplot as plt
import randomtype = "0"
beta = 0.5def dxdt(x, y, t):if y > 0:return - 0.5 * y * xelse:return 1def dzdt(z, y, t):if y > 0:return - beta * zelse:return 1def ydt(y, t):if type == "sin":return 0.5*(-np.cos(0.1*t) +  np.cos(0.4*t))elif type == "xishu":prob = random.random()if prob < 0.8:return 0return 2*random.random() - 1elif type == "miji":return 2*random.random() - 1return 0if len(sys.argv) < 3:sys.exit()type = sys.argv[1]
beta = float(sys.argv[2])t = np.linspace(0, 50, 500)
x = np.zeros_like(t)
y = np.zeros_like(t)
z = np.zeros_like(t)x[0], z[0] = 5, 5for i in range(1, len(t)):dt = t[i] - t[i - 1]dy = ydt(y[i - 1], i)dx = dxdt(x[i - 1], dy, t[i - 1])dz = dzdt(z[i - 1], dy, t[i - 1])x[i] = x[i - 1] + (dx) * dtz[i] = z[i - 1] + (dz) * dty[i] = dyplt.plot(t, y, label='y') # mark rate < 1
plt.plot(t, x, label='x') # dctcp
plt.plot(t, z, label='z') # reno/cubic
plt.legend()
plt.xlabel('t')
plt.grid(True)
plt.show()

浙江温州皮鞋湿,下雨进水不会胖。


http://www.ppmy.cn/devtools/88604.html

相关文章

类和对象(上) - c++

1.类的定义 1.1 类定义格式 class 是定义类的关键字 ,后跟类的名字,{}部分为类的主体,(注意:最后类定义结束时不要忘了 ; )。 类体中内容称为类的成员&#xff1a;类中的变量称为成员变量; 类中的函数称为成员函数。在c中,struct也可以定义类(c兼容c语言),同时struct升级成类…

在自定义数据集上训练现有的Detectron2模型

这段内容介绍了将使用一个气球分割数据集&#xff08;仅包含一个类别&#xff1a;气球&#xff09;来训练一个气球分割模型。训练过程将以一个预训练在COCO数据集上的模型为基础&#xff0c;这些模型可以在Detectron2的模型库中获取。需要注意的是&#xff0c;COCO数据集本身并…

llamaindex+Internlm2 RAG实践

一、Llama-Index 1.1 Llama-Index简介 LlamaIndex 是一个基于 LLM 的应用程序的数据框架&#xff0c;受益于上下文增强。 这种 LLM 系统被称为 RAG 系统&#xff0c;代表 “检索增强生成”。 检索增强生成&#xff08;RAG&#xff09;是一种创新的方法&#xff0c;它将搜索系…

破解PyCharm SSH配置难题:一站式故障排查与修复指南

破解PyCharm SSH配置难题&#xff1a;一站式故障排查与修复指南 PyCharm作为流行的集成开发环境&#xff08;IDE&#xff09;&#xff0c;支持通过SSH&#xff08;Secure Shell&#xff09;连接到远程服务器进行开发。然而&#xff0c;在配置SSH时&#xff0c;用户可能会遇到各…

[环境配置]Pycharm:Failed to start [PowerShell.exe]

解决方法&#xff0c;点Local旁边的 号&#xff0c;点击Command Prompt&#xff0c;即可在Pycharm中呼出控制台。 如果要修改Command Prompt的启动时访问的cmd.exe的路径&#xff0c;可以去Settings→Tools→Terminal中&#xff0c;修改Shell Path实现&#xff0c;改为cmd.exe…

MATLAB优化模型(4)

一、前言 在MATLAB中&#xff0c;你可以使用内置的遗传算法(Genetic Algorithm)、模拟退火(Simulated Annealing)等优化工具箱函数&#xff0c;或者编写自定义代码来实现(Ant Colony Optimization, ACO) 蚁群算法和粒子群算法(Particle Swarm Optimization, PSO)。以下是一些基…

Java 并发编程:Java 线程池的介绍与使用

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 024 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

day2 高性能客户端

文章目录 Call 的设计实现 ClientDemo 本文代码地址&#xff1a; 本文是7天用Go从零实现RPC框架GeeRPC的第二篇。 实现一个支持异步和并发的高性能客户端&#xff0c;代码约 250 行 Call 的设计 对 net/rpc 而言&#xff0c;一个函数需要能够被远程调用&#xff0c;需要满足…