整理SRv6Router代码,修bug,增加SRHInsert虚链路
This commit is contained in:
@@ -136,4 +136,19 @@ public class BBRCongestionAlgorithm implements CongestionAlgorithm ,DetnetConges
|
||||
return "BBR";
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getUpperDelayBound() {
|
||||
return MAX_GAIN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getLowerDelayBound() {
|
||||
return MIN_GAIN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getBurstLimit() {
|
||||
return burstLimit;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ public class DCTCPCongestionAlgorithm implements CongestionAlgorithm {
|
||||
}
|
||||
}else {
|
||||
if(windowUsed*3L>=congressWindowSize) {
|
||||
congressWindowSize+=4000;
|
||||
congressWindowSize+=4096;
|
||||
updateWindowSize();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,4 +4,7 @@ public interface DetnetCongestionAlgorithm extends CongestionAlgorithm {
|
||||
public void setUpperDelayBound(double upper);
|
||||
public void setLowerDelayBound(double lower);
|
||||
public void setBurstLimit(double limit);
|
||||
public double getUpperDelayBound( );
|
||||
public double getLowerDelayBound();
|
||||
public double getBurstLimit();
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ package org.kne.cloud.network.congestion;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.kne.cloud.network.monitor.DelaySampler;
|
||||
|
||||
public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCongestionAlgorithm {
|
||||
|
||||
// 可配置的时延膨胀比上下限 - Vegas2.0核心参数
|
||||
@@ -17,6 +19,7 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
|
||||
private Consumer<Long> windowControlConsumer;
|
||||
|
||||
private long MIN_RTTVAR = 30000000L;
|
||||
private volatile long RTTCurr = 1000000000L; // RTT
|
||||
private volatile long RTTMin = 1000000000L; // BaseRTT
|
||||
private volatile long RTTVar = 1000000000L;
|
||||
private volatile long RTTAvg = 1000000000L;
|
||||
@@ -25,11 +28,6 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
|
||||
private volatile long RTTCount = 0;
|
||||
private volatile long RTO = 1000000000L;
|
||||
|
||||
|
||||
private volatile long OWDTotal = 0;
|
||||
private volatile long OWDCount = 0;
|
||||
private volatile long OWDAvg2 = 1000000000L; // 当前平滑OWD
|
||||
private volatile long OWDMin = 1000000000L; // BaseRTT
|
||||
|
||||
private volatile long window = MIN_WINDOW;
|
||||
private volatile long window2 = MIN_WINDOW;
|
||||
@@ -58,106 +56,14 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void putAck(long packetSize, long RTTns, long OWDup, boolean ecn) {
|
||||
if(RTTns<0) {
|
||||
throw new IllegalArgumentException("RTT:"+ RTTns+" is negative!");
|
||||
}
|
||||
// 处理ECN信号 - 将其视为强烈的拥塞信号
|
||||
if (ecn) {
|
||||
// 当收到ECN时,更激进地减少窗口
|
||||
window2 = Math.max(0, window2 * 3 / 4);
|
||||
if (windowControlConsumer != null) {
|
||||
windowControlConsumer.accept(window2);
|
||||
}
|
||||
}
|
||||
|
||||
// 更新最小RTT(BaseRTT)
|
||||
if (RTTns <= RTTMin) {
|
||||
RTTMin = RTTns;
|
||||
} else {
|
||||
// 缓慢适应:当网络路径真正变化时,BaseRTT应能缓慢更新
|
||||
// 这里使用极慢的衰减因子,只有在持续观测到更低RTT时才快速更新
|
||||
RTTMin = (RTTMin * 999 + RTTns) / 1000;
|
||||
}
|
||||
|
||||
// 更新最小OWD(BaseOWD)
|
||||
if (OWDup <= OWDMin) {
|
||||
OWDMin = OWDup;
|
||||
} else {
|
||||
// 缓慢适应:当网络路径真正变化时,BaseRTT应能缓慢更新
|
||||
// 这里使用极慢的衰减因子,只有在持续观测到更低RTT时才快速更新
|
||||
OWDMin = (OWDMin * 999 + OWDup) / 1000;
|
||||
}
|
||||
|
||||
// 更新平滑RTT估计
|
||||
|
||||
RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - RTTns)) / 4;
|
||||
RTTAvg = (RTTAvg * 7 + RTTns) / 8;
|
||||
|
||||
|
||||
RTO = RTTAvg + Math.max(MIN_RTTVAR, RTTVar * 4);
|
||||
|
||||
RTTTotal += RTTns;
|
||||
RTTCount++;
|
||||
|
||||
OWDTotal += OWDup;
|
||||
OWDCount++;
|
||||
|
||||
long curr = System.nanoTime();
|
||||
// 每个RTT周期调整一次窗口(使用当前估计的RTT)
|
||||
if (curr - RTTstartTime > Math.max(BIAS, 2*RTTMin)) {
|
||||
long RTTCountx=RTTCount;
|
||||
if (RTTCountx > 0) {
|
||||
long currentRTT = RTTTotal / RTTCountx;
|
||||
//RTTAvg2 = (RTTAvg2 * 3 + currentRTT) / 4; // 平滑当前RTT
|
||||
RTTAvg2=currentRTT;
|
||||
RTTTotal = 0;
|
||||
RTTCount = 0;
|
||||
}
|
||||
|
||||
long OWDCountx=OWDCount;
|
||||
if (OWDCountx > 0) {
|
||||
long currentOWD = OWDTotal / OWDCountx;
|
||||
OWDAvg2=currentOWD;
|
||||
OWDTotal = 0;
|
||||
OWDCount = 0;
|
||||
}
|
||||
|
||||
|
||||
// ================== Vegas2.0核心逻辑 ==================
|
||||
// 1. 计算时延膨胀比
|
||||
double delayRatio = (double) OWDAvg2 / (double) Math.max(BIAS, OWDMin);
|
||||
//System.out.println(delayRatio+" "+RTTAvg2/1000000.0+" "+RTTMin/1000000.0);
|
||||
// 2. 基于比值的窗口调整(取代原来的基于差值的调整)
|
||||
if (delayRatio > delayUpperBound) {
|
||||
// 时延过高:减小窗口,减少幅度与超标程度成正比
|
||||
window2 -= 4096;
|
||||
} else if (delayRatio < delayLowerBound) {
|
||||
// 时延过低:增大窗口,增加幅度与低于目标程度成正比
|
||||
window2 += 4096;
|
||||
} else {
|
||||
|
||||
}
|
||||
// ===================================================
|
||||
|
||||
|
||||
|
||||
|
||||
updateWindowSize();
|
||||
RTTstartTime = curr;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
private DelaySampler dsp=new DelaySampler();
|
||||
|
||||
@Override
|
||||
public void putAck(long packetSize, long RTTns, boolean ecn) {
|
||||
if(RTTns<0) {
|
||||
throw new IllegalArgumentException("RTT:"+ RTTns+" is negative!");
|
||||
}
|
||||
this.RTTCurr=RTTns;
|
||||
// 处理ECN信号 - 将其视为强烈的拥塞信号
|
||||
if (ecn) {
|
||||
// 当收到ECN时,更激进地减少窗口
|
||||
@@ -167,14 +73,7 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
|
||||
}
|
||||
}
|
||||
|
||||
// 更新最小RTT(BaseRTT)
|
||||
if (RTTns <= RTTMin) {
|
||||
RTTMin = RTTns;
|
||||
} else {
|
||||
// 缓慢适应:当网络路径真正变化时,BaseRTT应能缓慢更新
|
||||
// 这里使用极慢的衰减因子,只有在持续观测到更低RTT时才快速更新
|
||||
RTTMin = (RTTMin * 999 + RTTns) / 1000;
|
||||
}
|
||||
dsp.recordDelay(RTTns);
|
||||
|
||||
// 更新平滑RTT估计
|
||||
|
||||
@@ -190,6 +89,15 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
|
||||
long curr = System.nanoTime();
|
||||
// 每个RTT周期调整一次窗口(使用当前估计的RTT)
|
||||
if (curr - RTTstartTime > Math.max(BIAS, 2*RTTMin)) {
|
||||
dsp.update();
|
||||
long rmin=dsp.getMinDelayNanos();
|
||||
if(rmin<=RTTMin) {
|
||||
RTTMin=rmin;
|
||||
}else {
|
||||
RTTMin=Math.min(rmin, RTTMin+1000);
|
||||
}
|
||||
|
||||
|
||||
long RTTCountx=RTTCount;
|
||||
if (RTTCountx > 0) {
|
||||
long currentRTT = RTTTotal / RTTCountx;
|
||||
@@ -206,12 +114,12 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
|
||||
// 2. 基于比值的窗口调整(取代原来的基于差值的调整)
|
||||
if (delayRatio > delayUpperBound) {
|
||||
// 时延过高:减小窗口,减少幅度与超标程度成正比
|
||||
window2 -= 4096;
|
||||
window2 =window2-4096;
|
||||
} else if (delayRatio < delayLowerBound) {
|
||||
// 时延过低:增大窗口,增加幅度与低于目标程度成正比
|
||||
window2 += 4096;
|
||||
window2 =window2+4096;
|
||||
} else {
|
||||
|
||||
//window2=window2+4096
|
||||
}
|
||||
// ===================================================
|
||||
|
||||
@@ -271,10 +179,12 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
|
||||
public long getBaseRTT() {
|
||||
return RTTMin;
|
||||
}
|
||||
|
||||
public long getCurrentRTT() {
|
||||
public long getAvgRTT() {
|
||||
return RTTAvg2;
|
||||
}
|
||||
public long getCurrentRTT() {
|
||||
return RTTCurr;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUpperDelayBound(double upper) {
|
||||
@@ -295,4 +205,19 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
|
||||
return "Vegas2";
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getUpperDelayBound() {
|
||||
return delayUpperBound;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getLowerDelayBound() {
|
||||
return delayLowerBound;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getBurstLimit() {
|
||||
return burstLimit;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user