diff --git a/.classpath b/.classpath
index a73e078..60354f2 100644
--- a/.classpath
+++ b/.classpath
@@ -1,12 +1,6 @@
-
-
-
-
-
-
@@ -27,5 +21,13 @@
+
+
+
+
+
+
+
+
diff --git a/klalb-config.json b/klalb-config.json
index 52f6b3e..ad0c519 100644
--- a/klalb-config.json
+++ b/klalb-config.json
@@ -1,7 +1,7 @@
[
{
"language": "ZH_CN",
- "nogui": true,
+ "nogui": false,
"VirtualAddress": "2486:1:0:0:0:0:0:8888",
"VirtualASN": 2142606939373348329,
"DNS": [
@@ -37,13 +37,14 @@
"{UDP}ntp.ntsc.ac.cn:123",
"{UDP}us.ntp.org.cn:123"
],
- "denyLineTableQuery": false,
- "denyLineTableBroadcast": false,
+ "denyLineTableQuery": true,
+ "denyLineTableBroadcast": true,
"congestionAlgorithm": "BBR",
- "delayUpperBound": 1.506,
- "delayLowerBound": 1.25,
+ "burstLimit": 1.5,
+ "delayUpperBound": 1.3,
+ "delayLowerBound": 1.3,
"nagleDelayTime": 1000000,
- "linkNagleDelayTime": 1000000,
+ "linkNagleDelayTime": 0,
"linkConnectionsCount": 1,
"TUNName": "KLALB_SRv6",
"NetworkInterfaceExcepts": [],
diff --git a/lib/KNEOptimize.jar b/lib/KNEOptimize.jar
index ca0b6ec..a31c251 100644
Binary files a/lib/KNEOptimize.jar and b/lib/KNEOptimize.jar differ
diff --git a/lib/KNElib1.0.jar b/lib/KNElib1.0.jar
index eb9fac1..2d38b26 100644
Binary files a/lib/KNElib1.0.jar and b/lib/KNElib1.0.jar differ
diff --git a/src/klalb_en_US.properties b/src/klalb_en_US.properties
index cb4314e..112f698 100644
--- a/src/klalb_en_US.properties
+++ b/src/klalb_en_US.properties
@@ -55,7 +55,7 @@ delay=Delay
virtualnetsettings=Virtual network settings
tunnelnetsettings=Tunnel network settings
linksettings=Link settings
-klalbperf=KLALB-perf Speedtest tool
+klalbperf=KLALB-perf Speedtest
speedtest=Network speed test
starttest=Start test
testreport=Test report
@@ -91,5 +91,17 @@ tunname=Virtual network device name
dashboard=Dashboard
backplanedelay=Backplane delay
backplanepps=Backplane PPS
+backplaneecnrate=Backplane ECN rate
+backplanelossrate=Backplane Loss rate
uisettings=UI settings
-nogui=No GUI mode
\ No newline at end of file
+nogui=No GUI mode
+bufferusagemonitor=Buffer usage monitor
+buffer=Buffer
+usedbuffer=Used buffer
+maxbuffer=Max buffer
+queueused=Used queue
+downloadbasedelay=Download Base
+uploadbasedelay=Upload Base
+burstlimit=Burst limit
+performancesettings=Performance settings
+performancestrategy=Performance strategy
\ No newline at end of file
diff --git a/src/klalb_zh_CN.properties b/src/klalb_zh_CN.properties
index 7e6e745..2df6772 100644
--- a/src/klalb_zh_CN.properties
+++ b/src/klalb_zh_CN.properties
@@ -55,7 +55,7 @@ delay=延迟
virtualnetsettings=虚拟网络设置
tunnelnetsettings=隧道网络设置
linksettings=链路设置
-klalbperf=KLALB-perf测速工具
+klalbperf=KLALB-perf网速测试
speedtest=网速测试
starttest=开始测试
testreport=测速报告
@@ -91,5 +91,17 @@ tunname=虚拟网卡名称
dashboard=仪表盘
backplanedelay=背板处理延迟
backplanepps=背板包转发率
+backplaneecnrate=背板ECN率
+backplanelossrate=背板丢包率
uisettings=UI设置
-nogui=无GUI模式
\ No newline at end of file
+nogui=无GUI模式
+bufferusagemonitor=缓冲区监视器
+buffer=缓冲区
+usedbuffer=已用缓冲区
+maxbuffer=最大缓冲区
+queueused=已用队列
+downloadbasedelay=下载延迟基线
+uploadbasedelay=上传延迟基线
+burstlimit=突发限制
+performancesettings=性能设置
+performancestrategy=性能策略
\ No newline at end of file
diff --git a/src/org/kne/cloud/network/BufferedChannel.java b/src/org/kne/cloud/network/BufferedChannel.java
index b9440fd..71d9c5f 100644
--- a/src/org/kne/cloud/network/BufferedChannel.java
+++ b/src/org/kne/cloud/network/BufferedChannel.java
@@ -15,10 +15,8 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
private final ByteBuffer readBuffer;
private final ByteBuffer writeBuffer;
- private final ReentrantLock readLock = new ReentrantLock();
- private final ReentrantLock writeLock = new ReentrantLock();
- private final AtomicBoolean closed = new AtomicBoolean(false);
+ // private final AtomicBoolean closed = new AtomicBoolean(false);
private final AtomicBoolean inputShutdown = new AtomicBoolean(false);
private final AtomicBoolean outputShutdown = new AtomicBoolean(false);
@@ -43,12 +41,11 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
@Override
public int read(ByteBuffer dst) throws IOException {
- if (closed.get() || inputShutdown.get()) {
+ if ( inputShutdown.get()) {
throw new ClosedChannelException();
}
- readLock.lock();
- try {
+
// 检查底层通道是否仍然打开
if (inputChannel != null && !inputChannel.isOpen()) {
inputShutdown.set(true);
@@ -102,10 +99,7 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
}
return totalRead;
-
- } finally {
- readLock.unlock();
- }
+
}
/**
@@ -126,9 +120,7 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
@Override
public long read(ByteBuffer[] dsts, int offset, int length) throws IOException {
- if (closed.get() || inputShutdown.get()) {
- throw new ClosedChannelException();
- }
+
long totalRead = 0;
for (int i = offset; i < offset + length; i++) {
@@ -150,12 +142,9 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
@Override
public int write(ByteBuffer src) throws IOException {
- if (closed.get() || outputShutdown.get()) {
- throw new ClosedChannelException();
- }
+
- writeLock.lock();
- try {
+
// 检查底层通道是否仍然打开
if (outputChannel != null && !outputChannel.isOpen()) {
outputShutdown.set(true);
@@ -188,9 +177,7 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
}
return totalWritten;
- } finally {
- writeLock.unlock();
- }
+
}
@Override
@@ -200,9 +187,7 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
@Override
public long write(ByteBuffer[] srcs, int offset, int length) throws IOException {
- if (closed.get() || outputShutdown.get()) {
- throw new ClosedChannelException();
- }
+
long totalWritten = 0;
for (int i = offset; i < offset + length; i++) {
@@ -222,23 +207,18 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
* 安全的刷新方法
*/
public void flush() throws IOException {
- if (closed.get()) {
- throw new ClosedChannelException();
- }
+
if (outputChannel == null || outputShutdown.get()) {
return;
}
- writeLock.lock();
try {
flushInternal();
} catch (IOException e) {
outputShutdown.set(true);
throw e;
- } finally {
- writeLock.unlock();
- }
+ }
}
/**
@@ -274,16 +254,13 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
*/
@Override
public void close() throws IOException {
- if (!closed.compareAndSet(false, true)) {
- return; // 已经关闭
- }
+
IOException exception = null;
// 先刷新输出缓冲区
if (outputChannel != null && !outputShutdown.get()) {
- writeLock.lock();
- try {
+
if (writeBuffer.position() > 0) {
try {
flushInternal();
@@ -291,9 +268,7 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
exception = e;
}
}
- } finally {
- writeLock.unlock();
- }
+
}
// 关闭底层通道
@@ -322,20 +297,14 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
}
// 清理缓冲区状态
- readLock.lock();
- try {
+
readBuffer.clear();
readBuffer.limit(0); // 标记为已清空
- } finally {
- readLock.unlock();
- }
- writeLock.lock();
- try {
+
+
writeBuffer.clear();
- } finally {
- writeLock.unlock();
- }
+
// 设置关闭状态
inputShutdown.set(true);
@@ -351,13 +320,10 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
*/
public void shutdownInput() throws IOException {
inputShutdown.set(true);
- readLock.lock();
- try {
+
readBuffer.clear();
readBuffer.limit(0);
- } finally {
- readLock.unlock();
- }
+
if (inputChannel instanceof SocketChannel) {
((SocketChannel) inputChannel).shutdownInput();
@@ -366,14 +332,11 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
public void shutdownOutput() throws IOException {
outputShutdown.set(true);
- writeLock.lock();
- try {
+
if (writeBuffer.position() > 0) {
flushInternal();
}
- } finally {
- writeLock.unlock();
- }
+
if (outputChannel instanceof SocketChannel) {
((SocketChannel) outputChannel).shutdownOutput();
@@ -382,7 +345,7 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
@Override
public boolean isOpen() {
- return !closed.get() &&
+ return
(inputChannel == null || inputChannel.isOpen()) &&
(outputChannel == null || outputChannel.isOpen());
}
@@ -391,51 +354,39 @@ public class BufferedChannel implements ReadableByteChannel, WritableByteChannel
* 检查是否还有可读数据(包括缓冲区中的)
*/
public boolean hasRemaining() throws IOException {
- if (closed.get() || inputShutdown.get()) {
+ if ( inputShutdown.get()) {
return false;
}
- readLock.lock();
- try {
+
return readBuffer.hasRemaining() ||
(inputChannel != null && inputChannel.isOpen());
- } finally {
- readLock.unlock();
- }
+
}
/**
* 获取缓冲区状态信息(用于调试)
*/
public String getBufferState() {
- readLock.lock();
- writeLock.lock();
- try {
+
return String.format(
"ReadBuffer[pos=%d, lim=%d, cap=%d], WriteBuffer[pos=%d, lim=%d, cap=%d], " +
"closed=%b, inputShutdown=%b, outputShutdown=%b",
readBuffer.position(), readBuffer.limit(), readBuffer.capacity(),
- writeBuffer.position(), writeBuffer.limit(), writeBuffer.capacity(),
- closed.get(), inputShutdown.get(), outputShutdown.get()
+ writeBuffer.position(), writeBuffer.limit(), writeBuffer.capacity(), inputShutdown.get(), outputShutdown.get()
);
- } finally {
- writeLock.unlock();
- readLock.unlock();
- }
+
}
// 其他方法保持不变...
public int available() throws IOException {
- if (closed.get() || inputShutdown.get()) {
+ if ( inputShutdown.get()) {
return 0;
}
- readLock.lock();
- try {
+
return readBuffer.remaining();
- } finally {
- readLock.unlock();
- }
+
}
public long skip(long n) throws IOException {
diff --git a/src/org/kne/cloud/network/ByteBufferAllocator.java b/src/org/kne/cloud/network/ByteBufferAllocator.java
index 739246c..6a0e7c2 100644
--- a/src/org/kne/cloud/network/ByteBufferAllocator.java
+++ b/src/org/kne/cloud/network/ByteBufferAllocator.java
@@ -1,26 +1,10 @@
package org.kne.cloud.network;
import java.lang.foreign.Arena;
-import java.lang.foreign.MemorySegment;
-import java.lang.foreign.SegmentAllocator;
-import java.lang.ref.Cleaner;
-import java.lang.ref.PhantomReference;
-import java.lang.ref.Reference;
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicReference;
-import org.kne.debug.TimeDebugger;
import org.kne.membandboost.MembandBoost;
-import jdk.internal.misc.Unsafe;
public class ByteBufferAllocator {
public ByteBufferAllocator(boolean isDirect) {
@@ -43,31 +27,8 @@ public class ByteBufferAllocator {
throw new InternalError();
return buf;
}
- private static jdk.internal.misc.Unsafe usf;
- private static Method meth;
- static {
- Class> name;
- try {
- name = Class.forName("jdk.internal.misc.Unsafe");
- Field field = name.getDeclaredField("theUnsafe");
- field.setAccessible(true);
- usf= (Unsafe) field.get(null);
- meth=name.getMethod("allocateUninitializedArray", Class.class,int.class);
-
- } catch (java.lang.reflect.InaccessibleObjectException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static byte[] allocateUninitializedArray(int capacity) {
- if(usf!=null) {
- return (byte[]) usf.allocateUninitializedArray(byte.class, capacity);
- }else {
- return new byte[capacity];
- }
- }
-
+
+
public static ByteBuffer allocateHeap(int capacity) {
/*if(capacity<=2048) {
return MembandBoost.allocateUninitializedHeapBufferBlocked(capacity);
@@ -75,10 +36,6 @@ public class ByteBufferAllocator {
return MembandBoost.allocateUninitializedHeapBuffer(capacity);
//}
}
- public static ByteBuffer allocateHeap0(int capacity) {
- return ByteBuffer.wrap((byte[])allocateUninitializedArray(capacity)) ;
- }
-
}
diff --git a/src/org/kne/cloud/network/DatagramServerSocket.java b/src/org/kne/cloud/network/DatagramServerSocket.java
index f2e999a..670dfce 100644
--- a/src/org/kne/cloud/network/DatagramServerSocket.java
+++ b/src/org/kne/cloud/network/DatagramServerSocket.java
@@ -1,34 +1,24 @@
package org.kne.cloud.network;
import java.io.IOException;
-import java.io.InterruptedIOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
-import java.net.DatagramSocketImpl;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
-import java.net.ServerSocket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
-import java.util.Collections;
import java.util.Enumeration;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
-import java.util.Vector;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Flow.Subscriber;
import java.util.concurrent.locks.LockSupport;
-import org.kne.cloud.network.klalb.DATATPacket;
-import org.kne.cloud.network.klalb.KLALBRemoteLine;
-
public class DatagramServerSocket implements java.io.Closeable{
public static final ByteArrayPool dataarraypool=new ByteArrayPool(100, 65535);
@@ -93,10 +83,7 @@ public class DatagramServerSocket implements java.io.Closeable{
if (backlog < 1)
backlog = 50;
- @SuppressWarnings("removal")
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- security.checkListen(epoint.getPort());
+
synchronized (stateLock) {
if (closed)
diff --git a/src/org/kne/cloud/network/DirectBufferedArena.java b/src/org/kne/cloud/network/DirectBufferedArena.java
deleted file mode 100644
index 9fb0fe2..0000000
--- a/src/org/kne/cloud/network/DirectBufferedArena.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.kne.cloud.network;
-
-import java.lang.foreign.Arena;
-import java.lang.foreign.MemorySegment;
-import java.lang.foreign.MemorySegment.Scope;
-import java.lang.ref.PhantomReference;
-import java.lang.ref.Reference;
-import java.lang.ref.ReferenceQueue;
-import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.locks.ReentrantLock;
-
-public class DirectBufferedArena implements Arena{
- private static long blockSize=1024*1024L;
- private volatile PreAlloc buffer;
- public static long getBlockSize() {
- return blockSize;
- }
-
-
-
- public static void setBlockSize(long blockSizex) {
- blockSize = blockSizex;
- }
-
-
-
-
- private class PreAlloc{
- private MemorySegment segment;
- private AtomicLong pos=new AtomicLong(0);
- private AtomicLong refs=new AtomicLong(0);
- public MemorySegment getSegment() {
- return segment;
- }
- public AtomicLong getPos() {
- return pos;
- }
- public PreAlloc(MemorySegment segment) {
- super();
- this.segment = segment;
- }
- public long byteSize() {
- return segment.byteSize();
- }
- public AtomicLong getRefs() {
- return refs;
- }
-
- }
-
- private void allocateNew(long blockSize2) {
- MemorySegment raw=MemorySegment.ofArray(ByteBufferAllocator.allocateUninitializedArray((int) blockSize2));
- buffer=new PreAlloc(raw);
-
- }
-
-
- public DirectBufferedArena() {
- super();
- allocateNew(blockSize);
- }
-
- @Override
- public MemorySegment allocate(long byteSize, long byteAlignment) {
- if(byteSize>blockSize)
- throw new IndexOutOfBoundsException("byteSize can't large than buffer block");
- long pos;
- PreAlloc bufferx;
- do{
- bufferx=this.buffer;
- pos=bufferx.getPos().getAndAdd(byteSize);
- if(pos+byteSize>bufferx.byteSize()) {
- allocateNew(blockSize);
- }else {
- break;
- }
- }while(true);
- bufferx.getRefs().incrementAndGet();
- MemorySegment sliced=bufferx.getSegment().asSlice(pos, byteSize);
- return sliced;
-
- }
-
- @Override
- public Scope scope() {
- return null;
- }
-
- @Override
- public void close() {
- }
- public static DirectBufferedArena ofBuffered() {
- return new DirectBufferedArena();
- }
-
-}
diff --git a/src/org/kne/cloud/network/HeapBufferedArena.java b/src/org/kne/cloud/network/HeapBufferedArena.java
deleted file mode 100644
index c532219..0000000
--- a/src/org/kne/cloud/network/HeapBufferedArena.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.kne.cloud.network;
-
-import java.lang.foreign.Arena;
-import java.lang.foreign.MemorySegment;
-import java.lang.foreign.MemorySegment.Scope;
-import java.lang.ref.PhantomReference;
-import java.lang.ref.Reference;
-import java.lang.ref.ReferenceQueue;
-import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.locks.ReentrantLock;
-
-public class HeapBufferedArena implements Arena{
- private static long blockSize=32768L;
- private MemorySegment segment;
- private long pos=0;
-
-
-
-
- public static void setBlockSize(long blockSizex) {
- blockSize = blockSizex;
- }
-
-
-
-
- private void allocateNew(long blockSize2) {
- segment=MemorySegment.ofArray(ByteBufferAllocator.allocateUninitializedArray((int) blockSize2));
- pos=0;
- }
-
-
- public HeapBufferedArena() {
- super();
- allocateNew(blockSize);
- }
-
- @Override
- public MemorySegment allocate(long byteSize, long byteAlignment) {
- if(byteSize>blockSize)
- return MemorySegment.ofArray(ByteBufferAllocator.allocateUninitializedArray((int) byteSize));
- do{
- long newpos=pos+byteSize;
- if(newpos>blockSize) {
- allocateNew(blockSize);
- }else {
- MemorySegment ms=segment.asSlice(pos, byteSize);
- pos=newpos;
- return ms;
- }
- }while(true);
-
- }
-
- @Override
- public Scope scope() {
- return null;
- }
-
- @Override
- public void close() {
- }
- public static HeapBufferedArena ofBuffered() {
- return new HeapBufferedArena();
- }
-
-}
diff --git a/src/org/kne/cloud/network/IPMulticastDiscovery.java b/src/org/kne/cloud/network/IPMulticastDiscovery.java
index 0b491bf..f540110 100644
--- a/src/org/kne/cloud/network/IPMulticastDiscovery.java
+++ b/src/org/kne/cloud/network/IPMulticastDiscovery.java
@@ -15,16 +15,14 @@ import java.net.NetworkInterface;
import java.net.NoRouteToHostException;
import java.net.SocketException;
import java.net.UnknownHostException;
-import java.time.Duration;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
-import java.util.Set;
import java.util.UUID;
import java.util.function.Consumer;
-public class IPMulticastDiscovery extends Thread implements Closeable, AutoCloseable {
+public class IPMulticastDiscovery implements Closeable, AutoCloseable {
private static final boolean debug=false;
private MulticastSocket soc;
@@ -79,9 +77,7 @@ public class IPMulticastDiscovery extends Thread implements Closeable, AutoClose
this.timeInterval=timeInterval;
}
- @Override
- public void run() {
- Thread.currentThread().setName("线路发现线程");
+ public void start() {
ThreadTool.makeVDaemonThreadIfSupport("线路通知线程", () -> {
try {
@@ -143,6 +139,7 @@ public class IPMulticastDiscovery extends Thread implements Closeable, AutoClose
}).start();
+ ThreadTool.makeVDaemonThreadIfSupport("线路发现线程",()->{
try {
loop:while (!closed) {
try {
@@ -199,6 +196,7 @@ public class IPMulticastDiscovery extends Thread implements Closeable, AutoClose
e.printStackTrace();
}
}
+ });
}
@Override
diff --git a/src/org/kne/cloud/network/MemorySegmentPool.java b/src/org/kne/cloud/network/MemorySegmentPool.java
deleted file mode 100644
index 51ff5ff..0000000
--- a/src/org/kne/cloud/network/MemorySegmentPool.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.kne.cloud.network;
-
-import java.lang.foreign.Arena;
-import java.lang.foreign.MemorySegment;
-import java.nio.ByteBuffer;
-import java.util.Queue;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReferenceArray;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.kne.concurrent.SpinLock;
-import org.kne.debug.TimeDebugger;
-
-
-public class MemorySegmentPool {
- private AtomicReferenceArray< MemorySegment> rec;
- private volatile AtomicInteger pos=new AtomicInteger( 0);
- //private Lock lock=new SpinLock();
-
- private int maxcount;
- private long length;
- private int mcj;
- private boolean direct;
- public MemorySegmentPool(int maxcount, long length,boolean direct) {
- super();
- this.maxcount = maxcount;
- this.length = length;
- this.direct=direct;
- rec=new AtomicReferenceArray(maxcount);
- mcj= rec.length()-1;
- }
- public MemorySegmentPool(int maxcount, int length) {
- this(maxcount, length, true);
- }
- public void back(MemorySegment b) {
- if(b.byteSize()!=length)
- throw new IllegalArgumentException("wrong length");
-
-
- if(pos.get()<=mcj) {
- int d=pos.getAndIncrement();
- if(d>mcj)
- d=mcj;
- if(d<0)
- d=0;
- rec.compareAndSet(d,null,b);
- }
-
- }
- public MemorySegment borrow() {
- MemorySegment b=null;
-
- if(pos.get()>0) {
- int d=pos.decrementAndGet();
- if(d>mcj)
- d=mcj;
- if(d<0)
- d=0;
- b=rec.getAndSet(d,null);
- }
-
- if(b==null) {
- //ByteBufferAllocator.t.interrupt();
- if(direct) {
- b=((jdk.internal.foreign.ArenaImpl)Arena.ofAuto()).allocateNoInit(length,1);
- System.out.println(length);
- }else {
- b=MemorySegment.ofArray(new byte[(int) length]);
- }
- }
- return b;
- }
- public int getMaxCount() {
- return maxcount;
- }
- public long getLength() {
- return length;
- }
-
-}
diff --git a/src/org/kne/cloud/network/NetworkPacket.java b/src/org/kne/cloud/network/NetworkPacket.java
index d0aef06..0815c0e 100644
--- a/src/org/kne/cloud/network/NetworkPacket.java
+++ b/src/org/kne/cloud/network/NetworkPacket.java
@@ -3,53 +3,12 @@ package org.kne.cloud.network;
import java.io.IOException;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.kne.cloud.network.klalb.KLALBPacket;
-import org.kne.debug.TimeDebugger;
public abstract class NetworkPacket{
- private static final boolean debugPassport=false;
public static final ByteBufferAllocator bufferAllocator=new ByteBufferAllocator(true);
- //public static final ByteArrayPool dataarraypool_65535=new ByteArrayPool(10000, 65535);
-
- //public static final ByteBufferPool databufferpool_65535=new ByteBufferPool(10000, 65535,false);
-
- //public static final ByteBufferPool databufferpool_2048=new ByteBufferPool(10000, 2048,false);
-
- //public static final ByteBufferPool databufferpool_40=new ByteBufferPool(10000, 40,false);
-
-
- private final TimeDebugger passport;
- {
- if(debugPassport) {
- passport=new TimeDebugger();
- passport.putTime(getClass().getSimpleName()+ "_create");
- }else {
- passport=null;
- }
- }
-
- public final void putTimePassport(String label) {
- if(passport!=null) {
- passport.putTime(label);
- }
- }
-
- public final void printPassport() {
- if(passport!=null) {
- passport.printWithTimeFilter(100000000L);
- }
-
- }
-
-
-
public abstract long getTotalLength();
diff --git a/src/org/kne/cloud/network/ProtocolDetectorServerSocket.java b/src/org/kne/cloud/network/ProtocolDetectorServerSocket.java
index 4e0b766..af60406 100644
--- a/src/org/kne/cloud/network/ProtocolDetectorServerSocket.java
+++ b/src/org/kne/cloud/network/ProtocolDetectorServerSocket.java
@@ -29,7 +29,7 @@ public class ProtocolDetectorServerSocket extends FilterServerSocket {
public ProtocolDetectorSocket accept() throws IOException {
ProtocolDetectorSocket s=(ProtocolDetectorSocket) super.accept();
int sot=s.getSoTimeout();
- s.setSoTimeout(1000);
+ s.setSoTimeout(200);
InputStream ins=s.getInputStream();
ProtocolStack psd= protocolDetector.detect(ins);
s.setSoTimeout(sot);
diff --git a/src/org/kne/cloud/network/SocketChannelListener.java b/src/org/kne/cloud/network/SocketChannelListener.java
index 892d81b..8fb3702 100644
--- a/src/org/kne/cloud/network/SocketChannelListener.java
+++ b/src/org/kne/cloud/network/SocketChannelListener.java
@@ -2,17 +2,12 @@ package org.kne.cloud.network;
import java.io.Closeable;
import java.io.IOException;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.function.Consumer;
-import javax.net.ServerSocketFactory;
-
public class SocketChannelListener implements Closeable,AutoCloseable{
protected ServerSocketChannel serverSocketChannel;
public ServerSocketChannel getServerSocketChannel() {
@@ -28,7 +23,7 @@ public class SocketChannelListener implements Closeable,AutoCloseable{
while(flag){
try {
SocketChannel soce=serverSocketChannel.accept();
- ThreadTool.makePThreadIfSupport("端口请求处理线程",()->{
+ ThreadTool.makeVThreadIfSupport("端口请求处理线程",()->{
if(con!=null) {
try {
con.accept(soce);
diff --git a/src/org/kne/cloud/network/SocketListener.java b/src/org/kne/cloud/network/SocketListener.java
index be7298d..fd2213d 100644
--- a/src/org/kne/cloud/network/SocketListener.java
+++ b/src/org/kne/cloud/network/SocketListener.java
@@ -26,7 +26,7 @@ public class SocketListener implements Closeable,AutoCloseable{
while(flag){
try {
Socket soce=serverSocket.accept();
- ThreadTool.makePThreadIfSupport("端口监听线程",()->{
+ ThreadTool.makeVThreadIfSupport("端口监听线程",()->{
if(con!=null) {
try {
con.accept(soce);
@@ -66,7 +66,7 @@ public class SocketListener implements Closeable,AutoCloseable{
protected void open() throws UnknownHostException, IOException {
if(serverSocket==null)
serverSocket=multipurposeSocketAddress.listenServerSocket();
- new Thread(r).start();
+ ThreadTool.makeVThread("端口监听线程", r).start();
}
public void close() {
flag=false;
diff --git a/src/org/kne/cloud/network/congestion/ArrayListMessageBatcher.java b/src/org/kne/cloud/network/congestion/ArrayListMessageBatcher.java
index d5828e4..73445e5 100644
--- a/src/org/kne/cloud/network/congestion/ArrayListMessageBatcher.java
+++ b/src/org/kne/cloud/network/congestion/ArrayListMessageBatcher.java
@@ -2,13 +2,9 @@ package org.kne.cloud.network.congestion;
import java.lang.ref.Cleaner;
import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
-import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Consumer;
import org.kne.cloud.network.ThreadTool;
@@ -78,11 +74,11 @@ public class ArrayListMessageBatcher implements MessageBatcher{
impl.close();
}
public static void main(String[] args) throws InterruptedException {
- for(;;){
+ /*for(;;){
ArrayListMessageBatchermes=new ArrayListMessageBatcher<>(10, 1000000L);
System.gc();
- }
- /*ArrayListMessageBatchermes=new ArrayListMessageBatcher<>(10, 1000000L);
+ }*/
+ ArrayListMessageBatchermes=new ArrayListMessageBatcher<>(10, 1000000L);
mes.setConsumer((x)->{System.out.println(x);});
int n=0;
for(;;){
@@ -91,7 +87,7 @@ public class ArrayListMessageBatcher implements MessageBatcher{
mes.putMessage(n++);
mes.putMessage(n++);
Thread.sleep(1);
- }*/
+ }
}
}
class ArrayListMessageBatcherReleaser extends Releaser>{
@@ -114,18 +110,17 @@ class ArrayListMessageBatcherReleaser extends Releaser> consumer;
private final Thread batchThread;
- private final AtomicBoolean closed;
+ private final AtomicBoolean closed = new AtomicBoolean(false);
private long firstTime;
/**
* 构造函数
* @param batchSize 批量大小,当消息达到此数量时触发发送
- * @param maxDelayMillis 最大延迟时间(毫秒),即使消息数量不足也会触发发送
+ * @param maxDelay 最大延迟时间(毫秒),即使消息数量不足也会触发发送
*/
public ArrayListMessageBatcher0(int batchSize, long maxDelay) {
this.batchSize = batchSize;
this.maxDelay = maxDelay;
- this.closed = new AtomicBoolean(false);
// 创建并启动批量处理线程
this.batchThread = ThreadTool.makeVDaemonThread("ArrayListMessageBatcher Thread", this );
diff --git a/src/org/kne/cloud/network/congestion/BBRCongestionAlgorithm.java b/src/org/kne/cloud/network/congestion/BBRCongestionAlgorithm.java
index a87d424..1317607 100644
--- a/src/org/kne/cloud/network/congestion/BBRCongestionAlgorithm.java
+++ b/src/org/kne/cloud/network/congestion/BBRCongestionAlgorithm.java
@@ -1,7 +1,5 @@
package org.kne.cloud.network.congestion;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class BBRCongestionAlgorithm implements CongestionAlgorithm ,DetnetCongestionAlgorithm{
@@ -12,9 +10,7 @@ public class BBRCongestionAlgorithm implements CongestionAlgorithm ,DetnetConges
private static long MIN_WINDOW = 16384;
private Consumer windowControlConsumer;
- private BiConsumer speedControlConsumer;
- private AtomicBoolean firstUpdate = new AtomicBoolean(true);
private long MIN_RTTVAR = 5000000L;
private volatile long RTTMin = 1000000000L;
private volatile long RTTVar = 1000000000L;
@@ -26,23 +22,19 @@ public class BBRCongestionAlgorithm implements CongestionAlgorithm ,DetnetConges
private volatile long window=MIN_WINDOW;
- private volatile long speed=MIN_SPEED;
private volatile long maxwindow=99999999999L;
private long congressSpeed=MIN_SPEED;
private double MIN_GAIN=1.05;
private double MAX_GAIN=1.20;//2.8853900817779
private double windowGain=MIN_GAIN;
- private double speedGain=MAX_GAIN;//1.20 MAX_GAIN
+ private double burstLimit=1.20;
@Override
public void reset() {
window = MIN_WINDOW;
if (windowControlConsumer != null) {
windowControlConsumer.accept(window);
}
- speed = MIN_SPEED;
- if (speedControlConsumer != null) {
- speedControlConsumer.accept(speed, BURST_TIME);
- }
+
windowGain=MAX_GAIN;
}
@@ -51,10 +43,7 @@ public class BBRCongestionAlgorithm implements CongestionAlgorithm ,DetnetConges
this.windowControlConsumer = windowControlConsumer;
}
- @Override
- public void setSpeedControlConsumer(BiConsumer speedControlConsumer) {
- this.speedControlConsumer = speedControlConsumer;
- }
+
private long RTTstartTime = System.nanoTime();
private long bandwidth;
@@ -65,14 +54,9 @@ public class BBRCongestionAlgorithm implements CongestionAlgorithm ,DetnetConges
} else {
RTTMin = (RTTMin * 99999 + latencyns) / 100000;
}
- if (firstUpdate.compareAndSet(true, false)) {
- RTTAvg = latencyns;
- RTTVar = latencyns / 2;
- RTTAvg2 = latencyns;
- } else {
- RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - latencyns)) / 4;
- RTTAvg = (RTTAvg * 7 + latencyns) / 8;
- }
+ RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - latencyns)) / 4;
+ RTTAvg = (RTTAvg * 7 + latencyns) / 8;
+
RTO = RTTAvg + Math.max(MIN_RTTVAR, RTTVar * 4);// RTTVar*4
RTTTotal += latencyns;
@@ -100,14 +84,10 @@ public class BBRCongestionAlgorithm implements CongestionAlgorithm ,DetnetConges
} else {
congressSpeed = (congressSpeed * 49 + bandwidth) / 50;
}
- speed=(long) (congressSpeed * speedGain)+MIN_SPEED ;
window= ((long) (congressSpeed*windowGain )*(RTTMin+BIAS)/1000000000L)+MIN_WINDOW;
if (windowControlConsumer != null) {
windowControlConsumer.accept(window);
}
- if (speedControlConsumer != null) {
- speedControlConsumer.accept(speed, BURST_TIME);
- }
}
}
@@ -124,6 +104,7 @@ public class BBRCongestionAlgorithm implements CongestionAlgorithm ,DetnetConges
@Override
public void setCurrentWindowUsed(long used) {
+ this.maxwindow = (long) (used*burstLimit) + MIN_WINDOW;
}
@@ -138,7 +119,6 @@ public class BBRCongestionAlgorithm implements CongestionAlgorithm ,DetnetConges
@Override
public void setUpperDelayBound(double upper) {
MAX_GAIN=upper;
- speedGain=MAX_GAIN;
}
@Override
@@ -146,5 +126,14 @@ public class BBRCongestionAlgorithm implements CongestionAlgorithm ,DetnetConges
MIN_GAIN=lower;
windowGain=MIN_GAIN;
}
+ @Override
+ public void setBurstLimit(double limit) {
+ burstLimit=limit;
+ }
+
+ @Override
+ public String getName() {
+ return "BBR";
+ }
}
diff --git a/src/org/kne/cloud/network/congestion/BBRVegasCongressAlgorithm.java b/src/org/kne/cloud/network/congestion/BBRVegasCongressAlgorithm.java
deleted file mode 100644
index c9068f6..0000000
--- a/src/org/kne/cloud/network/congestion/BBRVegasCongressAlgorithm.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package org.kne.cloud.network.congestion;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-
-public class BBRVegasCongressAlgorithm implements CongestionAlgorithm {
-
- private static final long BURST_TIME = 2000000L;
- private static final long BIAS = 2000000L;
- private static long MIN_SPEED = 128 * 1024L;
- private static long MIN_WINDOW = 8192;
-
- private Consumer windowControlConsumer;
- private BiConsumer speedControlConsumer;
-
- private AtomicBoolean firstUpdate = new AtomicBoolean(true);
- private long MIN_RTTVAR = 50000000L;
- private volatile long RTTMin = 1000000000L;
- private volatile long RTTVar = 1000000000L;
- private volatile long RTTAvg = 1000000000L;
- private volatile long RTTAvg2 = 1000000000L;
- private volatile long RTTTotal = 0;
- private volatile long RTTCount = 0;
- private volatile long RTO = 1000000000L;
-
-
- private volatile long window=MIN_WINDOW;
- private volatile long speed=MIN_SPEED;
- private volatile long maxwindow=99999999999L;
- private long congressSpeed=MIN_SPEED;
- private double MAX_GAIN=2.8853900817779;//2.8853900817779
- private double MIN_GAIN=1.1;
- private double gain=MAX_GAIN;
- @Override
- public void reset() {
- window = MIN_WINDOW;
- if (windowControlConsumer != null) {
- windowControlConsumer.accept(window);
- }
- speed = MIN_SPEED;
- if (speedControlConsumer != null) {
- speedControlConsumer.accept(speed, BURST_TIME);
- }
- gain=MAX_GAIN;
- }
-
- @Override
- public void setWindowControlConsumer(Consumer windowControlConsumer) {
- this.windowControlConsumer = windowControlConsumer;
- }
-
- @Override
- public void setSpeedControlConsumer(BiConsumer speedControlConsumer) {
- this.speedControlConsumer = speedControlConsumer;
- }
-
- private long RTTstartTime = System.nanoTime();
- @Override
- public synchronized void putAck(long packetSize, long latencyns, boolean ecn) {
- if (latencyns <= RTTMin) {
- RTTMin = latencyns;
- } else {
- RTTMin = (RTTMin * 99999 + latencyns) / 100000;
- }
- if (firstUpdate.compareAndSet(true, false)) {
- RTTAvg = latencyns;
- RTTVar = latencyns / 2;
- RTTAvg2 = latencyns;
- } else {
- RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - latencyns)) / 4;
- RTTAvg = (RTTAvg * 7 + latencyns) / 8;
- }
- RTO = RTTAvg + Math.max(MIN_RTTVAR, RTTVar * 4);// RTTVar*4
-
- RTTTotal += latencyns;
- RTTCount++;
- long curr=System.nanoTime();
- if(curr-RTTstartTime>RTTMin) {
- if(RTTCount>0) {
- RTTAvg2=(RTTAvg2+RTTTotal/RTTCount)/2;
- RTTTotal=0;
- RTTCount=0;
- }
- long RTTAvg2x=Math.max(RTTAvg2-BIAS,RTTMin);
- double excepted=window/(double)RTTMin;
- double actual=window/(double)RTTAvg2x;
- double diff=(excepted-actual)*RTTMin;
- if(diff>65536*3+3) {
- gain-=0.0005;
- }
- if(diff<65536*3+1) {
- gain+=0.0005;
- }
- if(gain>=MAX_GAIN){
- gain=MAX_GAIN;
- //System.out.println("window:"+window);
- }
- if(gain= congressSpeed) {
- congressSpeed = (congressSpeed * 49 + bandwidth) / 50;
- } else {
- congressSpeed = (congressSpeed *2 + bandwidth) / 3;
- }*/
- if (bandwidth >= congressSpeed) {
- //congressSpeed = bandwidth;
- congressSpeed = (congressSpeed + bandwidth) / 2;
- } else {
- congressSpeed = (congressSpeed * 49 + bandwidth) / 50;
- }
- speed=Math.max(MIN_SPEED,(long) (congressSpeed * gain)) ;
- window=Math.max( (Math.max(MIN_SPEED,(long) (congressSpeed*gain ))*Math.max(2000000L,RTTMin)/1000000000L),MIN_WINDOW);
- if (windowControlConsumer != null) {
- windowControlConsumer.accept(window);
- }
- if (speedControlConsumer != null) {
- speedControlConsumer.accept(speed, BURST_TIME);
- }
- //System.out.println(gain);
- //System.out.println(bandwidth+" "+congressSpeed+" "+window);
- }
-
-}
diff --git a/src/org/kne/cloud/network/congestion/CongestionAlgorithm.java b/src/org/kne/cloud/network/congestion/CongestionAlgorithm.java
index 9f46731..ec41593 100644
--- a/src/org/kne/cloud/network/congestion/CongestionAlgorithm.java
+++ b/src/org/kne/cloud/network/congestion/CongestionAlgorithm.java
@@ -1,16 +1,18 @@
package org.kne.cloud.network.congestion;
-import java.util.function.BiConsumer;
import java.util.function.Consumer;
public interface CongestionAlgorithm {
public void reset();
public void setWindowControlConsumer(ConsumerwindowControlConsumer);
- public void setSpeedControlConsumer(BiConsumerspeedControlConsumer);
- public void putAck(long packetSize,long latencyns,boolean ecn);
+ public void putAck(long packetSize,long RTTns,boolean ecn);
+ default public void putAck(long packetSize,long RTTns,long OWDup,boolean ecn) {
+ putAck(packetSize,RTTns,ecn);
+ }
public void putLoss(long packetSize,long lossns,int losscounter);
public void setCurrentWindowUsed(long maxwindow);
public void setCurrentBandwidth(long bandwidth);
public long getRTO();
+ public String getName();
}
diff --git a/src/org/kne/cloud/network/congestion/DCTCP2CongestionAlgorithm.java b/src/org/kne/cloud/network/congestion/DCTCP2CongestionAlgorithm.java
index c6cf508..611b9e5 100644
--- a/src/org/kne/cloud/network/congestion/DCTCP2CongestionAlgorithm.java
+++ b/src/org/kne/cloud/network/congestion/DCTCP2CongestionAlgorithm.java
@@ -1,44 +1,33 @@
package org.kne.cloud.network.congestion;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.function.BiConsumer;
import java.util.function.Consumer;
+import org.jctools.counters.FixedSizeStripedLongCounter;
+import org.kne.cloud.network.klalb.KLALBUtils;
+
public class DCTCP2CongestionAlgorithm implements CongestionAlgorithm {
private static final long BURST_TIME = 1000000L;
private static final long BIAS = 2000000L;
- private static long MIN_SPEED = 64 * 1024L;
- private static long MIN_WINDOW = 32768;
+ private static long MIN_WINDOW = 8192;
private Consumer windowControlConsumer;
- private BiConsumer speedControlConsumer;
- private AtomicBoolean firstUpdate = new AtomicBoolean(true);
- private long MIN_RTTVAR = 400000000L;
- private volatile long RTTMin = 1000000000L;
+ private long MIN_RTTVAR = 100000000L;
private volatile long RTTVar = 1000000000L;
private volatile long RTTAvg = 1000000000L;
private double ECNAvg2 = 0L;
private double alpha=0;
- private volatile AtomicLong ECNSize = new AtomicLong(0);
- private volatile AtomicLong TotalSize = new AtomicLong(0);
- private volatile long RTO = 1000000000L;
+ private volatile FixedSizeStripedLongCounter ECNSize = KLALBUtils.createCounter();
+ private volatile FixedSizeStripedLongCounter TotalSize = KLALBUtils.createCounter();
+ private volatile long RTO = 500000000L;
private volatile long window=MIN_WINDOW;
- private volatile long windowUsed=MIN_WINDOW;
+ private volatile long maxwindow = 99999999999L;
private volatile long congressWindowSize=MIN_WINDOW;
- private volatile long speed=MIN_SPEED;
- private long congressSpeed=MIN_SPEED;
private long RTTstartTime = System.nanoTime();
- private long bandwidth=MIN_SPEED;
- private double MAX_GAIN=1.5;//2.8853900817779
- private double MIN_GAIN=1.2;
- private double gain=MAX_GAIN;
@Override
public void reset() {
@@ -46,11 +35,6 @@ public class DCTCP2CongestionAlgorithm implements CongestionAlgorithm {
if (windowControlConsumer != null) {
windowControlConsumer.accept(window);
}
- speed = MIN_SPEED;
- if (speedControlConsumer != null) {
- speedControlConsumer.accept(speed, BURST_TIME);
- }
- gain=MAX_GAIN;
}
@Override
@@ -58,73 +42,44 @@ public class DCTCP2CongestionAlgorithm implements CongestionAlgorithm {
this.windowControlConsumer = windowControlConsumer;
}
- @Override
- public void setSpeedControlConsumer(BiConsumer speedControlConsumer) {
- this.speedControlConsumer = speedControlConsumer;
- }
@Override
public synchronized void putAck(long packetSize, long latencyns, boolean ecn) {
- if (latencyns <= RTTMin) {
- RTTMin = latencyns;
- } else {
- RTTMin = (RTTMin * 99999 + latencyns) / 100000;
- }
- if (firstUpdate.compareAndSet(true, false)) {
- RTTAvg = latencyns;
- RTTVar = latencyns / 2;
- } else {
- RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - latencyns)) / 4;
- RTTAvg = (RTTAvg * 7 + latencyns) / 8;
- }
+
+
+ RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - latencyns)) / 4;
+ RTTAvg = (RTTAvg * 7 + latencyns) / 8;
+
RTO = RTTAvg + Math.max(MIN_RTTVAR, RTTVar * 4);// RTTVar*4
if(ecn) {
- ECNSize.addAndGet(packetSize);
+ ECNSize.inc(packetSize);
}
- TotalSize.addAndGet(packetSize);
+ TotalSize.inc(packetSize);
long curr=System.nanoTime();
if(curr-RTTstartTime>(RTTAvg+BIAS)) {
RTTstartTime=curr;
- long totalSize=TotalSize.getAndSet(0);
- long ecnSize=ECNSize.getAndSet(0);
+ long totalSize=TotalSize.getAndReset();
+ long ecnSize=ECNSize.getAndReset();
if(totalSize!=0) {
ECNAvg2=ecnSize/(double)totalSize;
- alpha=(alpha*15+ECNAvg2)/16;
+ alpha=(alpha*7+ECNAvg2)/8;
}
if(ECNAvg2>0.5) {
- gain=MIN_GAIN;
- if(congressWindowSize>MIN_WINDOW) {
congressWindowSize-=200;
- updateWindowSize();
- }
- }else if(ECNAvg2>0.1){
- if(windowUsed*3L>=congressWindowSize) {
+ }else if(ECNAvg2>0.01){
congressWindowSize+=200;
- updateWindowSize();
- }
}else {
- if(windowUsed*3L>=congressWindowSize) {
- congressWindowSize+=8000;
- updateWindowSize();
- }
+ congressWindowSize+=4000;
}
//System.out.println(ECNAvg2);
//System.out.println(speed+" "+window);
- if (bandwidth >= congressSpeed) {
- congressSpeed = bandwidth;
- } else {
- congressSpeed = (congressSpeed * 99 + bandwidth) / 100;
- }
- speed=Math.max(MIN_SPEED,(long) (congressSpeed * gain)) ;
- if (speedControlConsumer != null) {
- speedControlConsumer.accept(speed, BURST_TIME);
- }
+ updateWindowSize();
}
@@ -132,6 +87,11 @@ public class DCTCP2CongestionAlgorithm implements CongestionAlgorithm {
}
private void updateWindowSize() {
+ if(congressWindowSizemaxwindow) {
+ congressWindowSize=maxwindow;
+ }
window=Math.max( congressWindowSize,MIN_WINDOW);
if (windowControlConsumer != null) {
windowControlConsumer.accept(window);
@@ -150,12 +110,17 @@ public class DCTCP2CongestionAlgorithm implements CongestionAlgorithm {
@Override
public void setCurrentWindowUsed(long used) {
- this.windowUsed=used;
+ this.maxwindow=(long) (used*1.5)+MIN_WINDOW;
}
@Override
public void setCurrentBandwidth(long bandwidth) {
- this.bandwidth=bandwidth;
+
+ }
+
+ @Override
+ public String getName() {
+ return "DCTCP2";
}
}
diff --git a/src/org/kne/cloud/network/congestion/DCTCPCongestionAlgorithm.java b/src/org/kne/cloud/network/congestion/DCTCPCongestionAlgorithm.java
index 361596c..936b431 100644
--- a/src/org/kne/cloud/network/congestion/DCTCPCongestionAlgorithm.java
+++ b/src/org/kne/cloud/network/congestion/DCTCPCongestionAlgorithm.java
@@ -2,8 +2,6 @@ package org.kne.cloud.network.congestion;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class DCTCPCongestionAlgorithm implements CongestionAlgorithm {
@@ -11,13 +9,12 @@ public class DCTCPCongestionAlgorithm implements CongestionAlgorithm {
private static final long BURST_TIME = 1000000L;
private static final long BIAS = 2000000L;
private static long MIN_SPEED = 64 * 1024L;
- private static long MIN_WINDOW = 32768;
+ private static long MIN_WINDOW = 8192;
private Consumer windowControlConsumer;
- private BiConsumer speedControlConsumer;
private AtomicBoolean firstUpdate = new AtomicBoolean(true);
- private long MIN_RTTVAR = 400000000L;
+ private long MIN_RTTVAR = 100000000L;
private volatile long RTTMin = 1000000000L;
private volatile long RTTVar = 1000000000L;
private volatile long RTTAvg = 1000000000L;
@@ -31,14 +28,10 @@ public class DCTCPCongestionAlgorithm implements CongestionAlgorithm {
private volatile long window=MIN_WINDOW;
private volatile long windowUsed=MIN_WINDOW;
private volatile long congressWindowSize=MIN_WINDOW;
- private volatile long speed=MIN_SPEED;
- private long congressSpeed=MIN_SPEED;
private long RTTstartTime = System.nanoTime();
- private long bandwidth=MIN_SPEED;
private double MAX_GAIN=2.8853900817779;//2.8853900817779
private double MIN_GAIN=1.2;
- private double gain=MAX_GAIN;
@Override
public void reset() {
@@ -46,11 +39,6 @@ public class DCTCPCongestionAlgorithm implements CongestionAlgorithm {
if (windowControlConsumer != null) {
windowControlConsumer.accept(window);
}
- speed = MIN_SPEED;
- if (speedControlConsumer != null) {
- speedControlConsumer.accept(speed, BURST_TIME);
- }
- gain=MAX_GAIN;
}
@Override
@@ -58,10 +46,6 @@ public class DCTCPCongestionAlgorithm implements CongestionAlgorithm {
this.windowControlConsumer = windowControlConsumer;
}
- @Override
- public void setSpeedControlConsumer(BiConsumer speedControlConsumer) {
- this.speedControlConsumer = speedControlConsumer;
- }
@Override
public synchronized void putAck(long packetSize, long latencyns, boolean ecn) {
@@ -86,7 +70,7 @@ public class DCTCPCongestionAlgorithm implements CongestionAlgorithm {
long curr=System.nanoTime();
- if(curr-RTTstartTime>(RTTAvg+BIAS)) {
+ if(curr-RTTstartTime>Math.max(BIAS, 2*RTTMin)) {
RTTstartTime=curr;
long totalSize=TotalSize.getAndSet(0);
@@ -94,37 +78,23 @@ public class DCTCPCongestionAlgorithm implements CongestionAlgorithm {
if(totalSize!=0) {
ECNAvg2=ecnSize/(double)totalSize;
alpha=(alpha*15+ECNAvg2)/16;
+ //System.out.println(ECNAvg2);
}
- if(ECNAvg2>0.6) {
- gain=MIN_GAIN;
+ if(ECNAvg2>0.5) {
if(congressWindowSize>MIN_WINDOW) {
congressWindowSize=Math.max(MIN_WINDOW,(long) (congressWindowSize*(1-alpha/10)));
updateWindowSize();
}
- }else if(ECNAvg2>0.2){
- if(windowUsed*3L>=congressWindowSize) {
- congressWindowSize+=200;
- updateWindowSize();
- }
}else {
if(windowUsed*3L>=congressWindowSize) {
- congressWindowSize+=8000;
+ congressWindowSize+=4000;
updateWindowSize();
}
}
//System.out.println(ECNAvg2);
//System.out.println(speed+" "+window);
- if (bandwidth >= congressSpeed) {
- congressSpeed = bandwidth;
- } else {
- congressSpeed = (congressSpeed * 99 + bandwidth) / 100;
- }
- speed=Math.max(MIN_SPEED,(long) (congressSpeed * gain)) ;
- if (speedControlConsumer != null) {
- speedControlConsumer.accept(speed, BURST_TIME);
- }
}
@@ -155,7 +125,14 @@ public class DCTCPCongestionAlgorithm implements CongestionAlgorithm {
@Override
public void setCurrentBandwidth(long bandwidth) {
- this.bandwidth=bandwidth;
+
}
+ @Override
+ public String getName() {
+ return "DCTCP";
+ }
+
+
+
}
diff --git a/src/org/kne/cloud/network/congestion/DetnetCongestionAlgorithm.java b/src/org/kne/cloud/network/congestion/DetnetCongestionAlgorithm.java
index 9d2bce1..83d401a 100644
--- a/src/org/kne/cloud/network/congestion/DetnetCongestionAlgorithm.java
+++ b/src/org/kne/cloud/network/congestion/DetnetCongestionAlgorithm.java
@@ -3,4 +3,5 @@ package org.kne.cloud.network.congestion;
public interface DetnetCongestionAlgorithm extends CongestionAlgorithm {
public void setUpperDelayBound(double upper);
public void setLowerDelayBound(double lower);
+ public void setBurstLimit(double limit);
}
diff --git a/src/org/kne/cloud/network/congestion/EmptyCongestionAlgorithm.java b/src/org/kne/cloud/network/congestion/NOCongestionAlgorithm.java
similarity index 73%
rename from src/org/kne/cloud/network/congestion/EmptyCongestionAlgorithm.java
rename to src/org/kne/cloud/network/congestion/NOCongestionAlgorithm.java
index 373aaab..a736748 100644
--- a/src/org/kne/cloud/network/congestion/EmptyCongestionAlgorithm.java
+++ b/src/org/kne/cloud/network/congestion/NOCongestionAlgorithm.java
@@ -1,9 +1,8 @@
package org.kne.cloud.network.congestion;
-import java.util.function.BiConsumer;
import java.util.function.Consumer;
-public class EmptyCongestionAlgorithm implements CongestionAlgorithm{
+public class NOCongestionAlgorithm implements CongestionAlgorithm{
private long timeout;
@@ -23,11 +22,7 @@ public class EmptyCongestionAlgorithm implements CongestionAlgorithm{
}
- @Override
- public void setSpeedControlConsumer(BiConsumer speedControlConsumer) {
- // TODO 自动生成的方法存根
-
- }
+
@Override
public void putAck(long packetSize, long latencyns, boolean ecn) {
@@ -53,7 +48,7 @@ public class EmptyCongestionAlgorithm implements CongestionAlgorithm{
}
- public EmptyCongestionAlgorithm(long timeout) {
+ public NOCongestionAlgorithm(long timeout) {
super();
this.timeout = timeout;
}
@@ -63,4 +58,9 @@ public class EmptyCongestionAlgorithm implements CongestionAlgorithm{
return timeout;
}
+ @Override
+ public String getName() {
+ return "NO";
+ }
+
}
diff --git a/src/org/kne/cloud/network/congestion/ReceiveByteSlidingWindow.java b/src/org/kne/cloud/network/congestion/ReceiveByteSlidingWindow.java
deleted file mode 100644
index 8185309..0000000
--- a/src/org/kne/cloud/network/congestion/ReceiveByteSlidingWindow.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.kne.cloud.network.congestion;
-
-import java.util.Objects;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReferenceArray;
-
-public class ReceiveByteSlidingWindow {
- private AtomicReferenceArray array;
- private AtomicInteger windowSize =new AtomicInteger();
- private AtomicLong windowPosition=new AtomicLong();
-
- public int getWindowSize() {
- return windowSize.get();
- }
-
- public void setWindowSize(int windowSize) {
- this.windowSize.set(windowSize);
- }
-
- public long getWindowPosition() {
- return windowPosition.get();
- }
-
- public void setWindowPosition(long windowPosition) {
- this.windowPosition.set(windowPosition);
- }
-
- public ReceiveByteSlidingWindow(int capacity){
- array=new AtomicReferenceArray(capacity);
- }
-
- public boolean push(E object) {
- Objects.requireNonNull(object);
- if(array.get((int) ((windowPosition.get()-windowSize.get())%array.length()))==null ) {
- array.set((int) (windowPosition.getAndIncrement()%array.length()), object);
- return true;
- }
- return false;
- }
-
- public E pull(long number) {
- return array.getAndSet((int) (number%array.length()), null);
- }
-}
diff --git a/src/org/kne/cloud/network/congestion/SendByteSlidingWindow.java b/src/org/kne/cloud/network/congestion/SendByteSlidingWindow.java
deleted file mode 100644
index 653443c..0000000
--- a/src/org/kne/cloud/network/congestion/SendByteSlidingWindow.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.kne.cloud.network.congestion;
-
-import java.util.Iterator;
-import java.util.Objects;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReferenceArray;
-
-public class SendByteSlidingWindow implements Iterable{
- private Object[] array;
- private volatile int windowSize ;
- private volatile long windowPosition;
-
- public int getWindowSize() {
- return windowSize;
- }
-
- public void setWindowSize(int windowSize) {
- this.windowSize=windowSize;
- }
-
- public long getWindowPosition() {
- return windowPosition;
- }
-
- public void setWindowPosition(long windowPosition) {
- this.windowPosition=windowPosition;
- }
-
- public SendByteSlidingWindow(int capacity,int windowSize){
- if(windowSize>capacity) {
- throw new IllegalArgumentException("windowSize>capacity!");
- }
- array= new Object[capacity];
- this.windowSize=windowSize;
- }
-
- public boolean checkPush() {
- if(array[calcPosition(windowPosition-windowSize)]==null ) {
- return true;
- }
- return false;
- }
-
- public void push(E object) {
-
- array[calcPosition(windowPosition)]= object;
- }
-
- public E remove(long number) {
- if(number=windowPosition-windowSize) {
- int indp=calcPosition(number);
- E old=(E) array[indp];
- array[indp]=null;
- return old;
- }else {
- return null;
- }
- }
-
- public boolean isEmpty() {
- for (long i = windowPosition-windowSize; i < windowPosition; i++) {
- if(array[calcPosition(i)]!=null) {
- return false;
- }
- }
- return true;
- }
-
- public E get(long number) {
- if(number=windowPosition-windowSize) {
- return (E) array[calcPosition(number)];
- }else {
- return null;
- }
- }
-
- @Override
- public Iterator iterator() {
- return new Iterator() {
- private long pointer=windowPosition-windowSize;
- @Override
- public boolean hasNext() {
- return pointer implements Closeable, AutoCloseable {
- private Map> sendMap = new ConcurrentHashMap<>(1024, 0.2f);
- private AtomicLong sendmapWindowUsed=new AtomicLong(0);
- //private LongAdder sendmapWindowUsed = new LongAdder();
+ private ThreadParker tp=new ThreadParker();
+
+ private Map> sendMap = new ConcurrentHashMap<>(2048);
+ private AtomicLong sendWindowUsed=new AtomicLong(0);
+ //private LongAdder sendWindowUsed = new LongAdder();
private int headerCalibrate = 0;
@@ -36,14 +33,14 @@ public class SendPacketSlidingWindow implements Clos
private Consumer resendConsumer;
private Consumer closingConsumer;
- private volatile boolean closed = false;
private ResendChecker checker = new ResendChecker();
- private AtomicLong windowSize = new AtomicLong();
private Lock lock;
private Condition condition;
private boolean removeAtResend;
+ private volatile long windowSize =0;
+ private volatile boolean closed = false;
public SendPacketSlidingWindow(CongestionAlgorithm algorithm, long windowSize) {
this(algorithm, windowSize, 0, true);
@@ -58,17 +55,17 @@ public class SendPacketSlidingWindow implements Clos
this.headerCalibrate = headerCalibrate;
this.removeAtResend = removeAtResend;
this.algorithm = algorithm;
- this.windowSize.set(windowSize);
+ this.windowSize=windowSize;
Thread t = ThreadTool.makeVThread("重路由计时器线程", checker);
t.start();
}
public long getWindowSize() {
- return windowSize.get();
+ return windowSize;
}
public void setWindowSize(long windowSize) {
- this.windowSize.set(windowSize);
+ this.windowSize=windowSize;
}
public Consumer getResendConsumer() {
@@ -87,8 +84,8 @@ public class SendPacketSlidingWindow implements Clos
this.closingConsumer = closingConsumer;
}
- public long getSendmapWindowUsed() {
- return sendmapWindowUsed.get();
+ public long getSendWindowUsed() {
+ return sendWindowUsed.get();
}
public int getHeaderCalibrate() {
@@ -99,20 +96,38 @@ public class SendPacketSlidingWindow implements Clos
return algorithm;
}
- public boolean isCongress(IPv6Packet iPv6Packet, double scale) {
- boolean congress = sendmapWindowUsed.get() > windowSize.get() * scale;
+ public boolean isCongestion( double scale) {
+ boolean congress = sendWindowUsed.get() > windowSize * scale;
return congress;
}
+ public boolean isCongestion() {
+ boolean congress = sendWindowUsed.get() > windowSize ;
+ return congress;
+ }
+
+ public void waitForAvaliable() throws SocketException {
+ while(isCongestion()) {
+ if(closed) {
+ throw new SocketException("Send window closed!");
+ }
+ tp.parkNanos(1000000L);
+ }
+ }
+ public void putBlocked(K sequence, V packet) throws SocketException {
+ waitForAvaliable();
+ put(sequence,packet);
+ }
+
public void put(K sequence, V packet) {
- SendItem newitem = new SendItem(packet);
+ SendItem newitem = new SendItem(packet,headerCalibrate);
SendItem old = sendMap.put(sequence, newitem);
long dx=0;
if (old != null) {
- dx=-(old.getPacketLength() + headerCalibrate);
+ dx=-old.getPacketLength() ;
}
- long newWindow =sendmapWindowUsed.addAndGet(newitem.getPacketLength() + headerCalibrate+dx);
+ long newWindow =sendWindowUsed.addAndGet(newitem.getPacketLength() +dx);
algorithm.setCurrentWindowUsed(newWindow);
}
public V ack(K sequence) {
@@ -122,10 +137,11 @@ public class SendPacketSlidingWindow implements Clos
public V ack(K sequence,boolean ecn) {
SendItem ipv6;
if ((ipv6 = sendMap.remove(sequence)) != null) {
- long newWindow =sendmapWindowUsed.addAndGet(-(ipv6.getPacketLength() + headerCalibrate));
+ long newWindow =sendWindowUsed.addAndGet(-ipv6.getPacketLength() );
algorithm.setCurrentWindowUsed(newWindow);
long RTTC = System.nanoTime() - ipv6.getSendtime();
algorithm.putAck(ipv6.getPacketLength(), RTTC, ecn);
+ tp.unpark();
// System.out.println("remove:"+aseq.getSequence()+" "+sendMap.size());
Lock lockx = lock;
if (lockx != null) {
@@ -146,6 +162,34 @@ public class SendPacketSlidingWindow implements Clos
}
}
+ public V ack(K sequence,boolean ecn,long OWDdown) {
+ SendItem ipv6;
+ if ((ipv6 = sendMap.remove(sequence)) != null) {
+ long newWindow =sendWindowUsed.addAndGet(-ipv6.getPacketLength() );
+ algorithm.setCurrentWindowUsed(newWindow);
+ long RTTC = System.nanoTime() - ipv6.getSendtime();
+ algorithm.putAck(ipv6.getPacketLength(), RTTC,OWDdown, ecn);
+ tp.unpark();
+ // System.out.println("remove:"+aseq.getSequence()+" "+sendMap.size());
+ Lock lockx = lock;
+ if (lockx != null) {
+ lockx.lock();
+ try {
+ Condition cds = condition;
+ if (cds != null) {
+ cds.signalAll();
+ }
+ } finally {
+ lockx.unlock();
+ }
+ }
+ return ipv6.getPacket();
+ } else {
+ // System.out.println("miss:"+aseq.getSequence()+" "+sendMap.size());
+ return null;
+ }
+ }
+
private class ResendChecker implements Runnable {
@Override
@@ -159,8 +203,9 @@ public class SendPacketSlidingWindow implements Clos
if (current - sitm.getSendtime() > algorithm.getRTO()) {
if (removeAtResend) {
iterator.remove();
- long newWindow = sendmapWindowUsed.addAndGet((int) -(sitm.getPacketLength() + headerCalibrate));
+ long newWindow = sendWindowUsed.addAndGet((int) -sitm.getPacketLength() );
algorithm.setCurrentWindowUsed(newWindow);
+ tp.unpark();
} else {
sitm.setSendtime(current);
}
@@ -183,7 +228,7 @@ public class SendPacketSlidingWindow implements Clos
}
}
sendMap.clear();
- sendmapWindowUsed.set(0);
+ sendWindowUsed.set(0);
}
}
@@ -215,7 +260,20 @@ public class SendPacketSlidingWindow implements Clos
@Override
public String toString() {
- return "SendPacketSlidingWindow [sendmapWindowUsed=" + sendmapWindowUsed + ", windowSize=" + windowSize + "]";
+ return "SendPacketSlidingWindow [sendWindowUsed=" + sendWindowUsed + ", windowSize=" + windowSize + ", closed="
+ + closed + "]";
}
+ public void waitForEmpty() throws SocketException {
+ while(!isEmpty()) {
+ if(isClosed()) {
+ throw new SocketException("Send window closed!");
+ }
+ tp.parkNanos(1000000L);
+ }
+ }
+
+
+
+
}
diff --git a/src/org/kne/cloud/network/congestion/Vegas2CongestionAlgorithm.java b/src/org/kne/cloud/network/congestion/Vegas2CongestionAlgorithm.java
index f52d4ac..fc8bc39 100644
--- a/src/org/kne/cloud/network/congestion/Vegas2CongestionAlgorithm.java
+++ b/src/org/kne/cloud/network/congestion/Vegas2CongestionAlgorithm.java
@@ -1,7 +1,5 @@
package org.kne.cloud.network.congestion;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCongestionAlgorithm {
@@ -9,19 +7,15 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
// 可配置的时延膨胀比上下限 - Vegas2.0核心参数
private double delayUpperBound = 1.20; // RTT上限为基础RTT的1.2倍
private double delayLowerBound = 1.15; // RTT下限为基础RTT的1.05倍
+ private double burstLimit=1.20;
private static final long BURST_TIME = 2000000L;
- private static final long BIAS = 500000L;
- private static long MIN_SPEED = 256 * 1024L;
+ private static final long BIAS = 1000000L;
private static long MIN_WINDOW = 16384;
- // 新增:窗口调整参数(可基于当前窗口大小动态调整)
- private static final double WINDOW_ADJUST_FACTOR = 0.01; // 1%的窗口调整幅度
private Consumer windowControlConsumer;
- private BiConsumer speedControlConsumer;
- private AtomicBoolean firstUpdate = new AtomicBoolean(true);
private long MIN_RTTVAR = 30000000L;
private volatile long RTTMin = 1000000000L; // BaseRTT
private volatile long RTTVar = 1000000000L;
@@ -31,12 +25,15 @@ 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;
- private volatile long speed = MIN_SPEED;
private volatile long maxwindow = 99999999999L;
- private long congressSpeed=MIN_SPEED;
-
public Vegas2CongestionAlgorithm() {
reset();
}
@@ -47,10 +44,7 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
if (windowControlConsumer != null) {
windowControlConsumer.accept(window);
}
- speed = MIN_SPEED;
- if (speedControlConsumer != null) {
- speedControlConsumer.accept(speed, BURST_TIME);
- }
+
}
@Override
@@ -58,15 +52,17 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
this.windowControlConsumer = windowControlConsumer;
}
- @Override
- public void setSpeedControlConsumer(BiConsumer speedControlConsumer) {
- this.speedControlConsumer = speedControlConsumer;
- }
+
private long RTTstartTime = System.nanoTime();
- @Override
- public synchronized void putAck(long packetSize, long latencyns, boolean ecn) {
+
+
+ @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时,更激进地减少窗口
@@ -77,35 +73,128 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
}
// 更新最小RTT(BaseRTT)
- if (latencyns <= RTTMin) {
- RTTMin = latencyns;
+ if (RTTns <= RTTMin) {
+ RTTMin = RTTns;
} else {
// 缓慢适应:当网络路径真正变化时,BaseRTT应能缓慢更新
// 这里使用极慢的衰减因子,只有在持续观测到更低RTT时才快速更新
- RTTMin = (RTTMin * 9999 + latencyns) / 10000;
+ RTTMin = (RTTMin * 999 + RTTns) / 1000;
+ }
+
+ // 更新最小OWD(BaseOWD)
+ if (OWDup <= OWDMin) {
+ OWDMin = OWDup;
+ } else {
+ // 缓慢适应:当网络路径真正变化时,BaseRTT应能缓慢更新
+ // 这里使用极慢的衰减因子,只有在持续观测到更低RTT时才快速更新
+ OWDMin = (OWDMin * 999 + OWDup) / 1000;
}
// 更新平滑RTT估计
- if (firstUpdate.compareAndSet(true, false)) {
- RTTAvg = latencyns;
- RTTVar = latencyns / 2;
- RTTAvg2 = latencyns;
- } else {
- RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - latencyns)) / 4;
- RTTAvg = (RTTAvg * 7 + latencyns) / 8;
- }
+
+ RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - RTTns)) / 4;
+ RTTAvg = (RTTAvg * 7 + RTTns) / 8;
+
RTO = RTTAvg + Math.max(MIN_RTTVAR, RTTVar * 4);
- RTTTotal += latencyns;
+ 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;
+
+
+
+
+ }
+ }
+
+ @Override
+ public void putAck(long packetSize, long RTTns, 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;
+ }
+
+ // 更新平滑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++;
long curr = System.nanoTime();
// 每个RTT周期调整一次窗口(使用当前估计的RTT)
- if (curr - RTTstartTime > Math.max(BIAS, RTTMin)) {
- if (RTTCount > 0) {
- long currentRTT = RTTTotal / RTTCount;
- RTTAvg2 = (RTTAvg2 * 3 + currentRTT) / 4; // 平滑当前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;
}
@@ -113,64 +202,47 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
// ================== Vegas2.0核心逻辑 ==================
// 1. 计算时延膨胀比
double delayRatio = (double) RTTAvg2 / (double) Math.max(BIAS, RTTMin);
-
+ //System.out.println(delayRatio+" "+RTTAvg2/1000000.0+" "+RTTMin/1000000.0);
// 2. 基于比值的窗口调整(取代原来的基于差值的调整)
- long adjustStep = Math.max(512, (long)(window2 * WINDOW_ADJUST_FACTOR));
-
if (delayRatio > delayUpperBound) {
// 时延过高:减小窗口,减少幅度与超标程度成正比
- double exceedRatio = delayRatio / delayUpperBound;
- window2 -= (long)(adjustStep * exceedRatio);
+ window2 -= 4096;
} else if (delayRatio < delayLowerBound) {
// 时延过低:增大窗口,增加幅度与低于目标程度成正比
- double belowRatio = delayLowerBound / delayRatio;
- window2 += (long)(adjustStep * belowRatio);
+ window2 += 4096;
} else {
- // 在理想区间内:微调以维持稳定
- // 计算目标RTT = BaseRTT × 目标膨胀比
- long targetRTT = (long)(Math.max(BIAS, RTTMin) * (delayLowerBound + delayUpperBound) / 2.0);
-
- if (RTTAvg2 > targetRTT) {
- // 略高于目标:小幅减少
- window2 = Math.max(0, window2 - 256);
- } else if (RTTAvg2 < targetRTT) {
- // 略低于目标:小幅增加
- window2 = Math.min(maxwindow, window2 + 256);
- }
- // 非常接近目标:保持窗口不变
+
}
// ===================================================
- // 窗口边界检查
- if (window2 >= maxwindow) {
- window2 = maxwindow;
- }
- if (window2 < 0) {
- window2 = 0;
- }
+
+
+ updateWindowSize();
RTTstartTime = curr;
- if (bandwidth >= congressSpeed) {
- congressSpeed = bandwidth;
- //congressSpeed = (congressSpeed + bandwidth) / 2;
- } else {
- congressSpeed = (congressSpeed * 49 + bandwidth) / 50;
- }
- // 速度计算:基于当前窗口和RTT,考虑一个安全边界
- // 使用目标膨胀比而非固定1.2倍,确保与窗口控制逻辑一致
- window=window2+MIN_WINDOW;
- speed=(long) (congressSpeed * delayUpperBound)+MIN_SPEED ;
- if (windowControlConsumer != null) {
- windowControlConsumer.accept(window);
- }
- if (speedControlConsumer != null) {
- speedControlConsumer.accept(speed, BURST_TIME);
- }
+
}
}
+
+ private void updateWindowSize() {
+ // 窗口边界检查
+ if (window2 >= maxwindow) {
+ window2 = maxwindow;
+ }
+ if (window2 < 0) {
+ window2 = 0;
+ }
+ // 速度计算:基于当前窗口和RTT,考虑一个安全边界
+ // 使用目标膨胀比而非固定1.2倍,确保与窗口控制逻辑一致
+ window=window2+MIN_WINDOW;
+
+ if (windowControlConsumer != null) {
+ windowControlConsumer.accept(window);
+ }
+ }
@Override
public void putLoss(long packetSize, long lossns, int losscounter) {
@@ -183,14 +255,12 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
@Override
public void setCurrentWindowUsed(long used) {
- this.maxwindow = used * 16 + 65536;
+ this.maxwindow = (long) (used * burstLimit )+ MIN_WINDOW;
}
- private long bandwidth;
@Override
public void setCurrentBandwidth(long bandwidth) {
// 可选:基于已知带宽信息调整参数
- this.bandwidth=bandwidth;
}
// 新增方法:获取当前状态信息(用于监控和调试)
@@ -215,4 +285,14 @@ public class Vegas2CongestionAlgorithm implements CongestionAlgorithm,DetnetCong
public void setLowerDelayBound(double lower) {
delayLowerBound=lower;
}
+
+ @Override
+ public void setBurstLimit(double limit) {
+ burstLimit=limit;
+ }
+ @Override
+ public String getName() {
+ return "Vegas2";
+ }
+
}
\ No newline at end of file
diff --git a/src/org/kne/cloud/network/ipv6/AbstractIPv6NetworkLink.java b/src/org/kne/cloud/network/ipv6/AbstractIPv6NetworkLink.java
index 778c40c..f6bafc6 100644
--- a/src/org/kne/cloud/network/ipv6/AbstractIPv6NetworkLink.java
+++ b/src/org/kne/cloud/network/ipv6/AbstractIPv6NetworkLink.java
@@ -1,16 +1,9 @@
package org.kne.cloud.network.ipv6;
-import java.io.IOException;
-import java.net.Inet6Address;
-import java.util.List;
import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.Lock;
import java.util.function.BiConsumer;
-import java.util.function.Consumer;
import java.util.function.Supplier;
-import org.kne.cloud.network.klalb.KLALBRemoteLine;
import org.kne.cloud.network.srv6.SRv6Router;
public abstract class AbstractIPv6NetworkLink implements IPv6NetworkLink {
diff --git a/src/org/kne/cloud/network/ipv6/ControlledIPv6NetworkLink.java b/src/org/kne/cloud/network/ipv6/ControlledIPv6NetworkLink.java
index 14b3884..ddcd3ff 100644
--- a/src/org/kne/cloud/network/ipv6/ControlledIPv6NetworkLink.java
+++ b/src/org/kne/cloud/network/ipv6/ControlledIPv6NetworkLink.java
@@ -6,11 +6,10 @@ import java.util.function.Consumer;
public interface ControlledIPv6NetworkLink extends IPv6NetworkLink {
- public boolean isCongress(IPv6Packet iPv6Packet,double scale);
+ public boolean isCongestion(IPv6Packet iPv6Packet,double scale);
public default boolean isCongress(IPv6Packet iPv6Packet) {
- return isCongress(iPv6Packet, 1.0);
+ return isCongestion(iPv6Packet, 1.0);
}
void setRerouteConsumer(Consumer rerouteConsumer);
- public boolean isReachSpeedLimit(IPv6Packet iPv6Packet);
public void setCongressCondition(Lock lock,Condition condition);
}
diff --git a/src/org/kne/cloud/network/ipv6/ICMPv6Packet.java b/src/org/kne/cloud/network/ipv6/ICMPv6Packet.java
index 34c5ae2..785705c 100644
--- a/src/org/kne/cloud/network/ipv6/ICMPv6Packet.java
+++ b/src/org/kne/cloud/network/ipv6/ICMPv6Packet.java
@@ -34,7 +34,7 @@ public class ICMPv6Packet extends IPv6Payload {
private boolean isDefault;
protected ICMPv6Packet(ByteBuffer header,boolean isDefault) {
- super(ICMPv6_PROTOCOL_NUMBER, false);
+ super(ICMPv6_PROTOCOL_NUMBER);
this.header=header;
this.isDefault=isDefault;
@@ -45,7 +45,7 @@ public class ICMPv6Packet extends IPv6Payload {
}
protected ICMPv6Packet(int type, int code,boolean isDefault) {
- super(ICMPv6_PROTOCOL_NUMBER, false);
+ super(ICMPv6_PROTOCOL_NUMBER);
header = NetworkPacket.bufferAllocator.allocate(ICMPv6_HEADER_LENGTH);
getHeader().put((byte) type);
getHeader().put((byte) code);
diff --git a/src/org/kne/cloud/network/ipv6/IPv6Packet.java b/src/org/kne/cloud/network/ipv6/IPv6Packet.java
index ab94b65..f84638f 100644
--- a/src/org/kne/cloud/network/ipv6/IPv6Packet.java
+++ b/src/org/kne/cloud/network/ipv6/IPv6Packet.java
@@ -4,32 +4,21 @@ import java.io.EOFException;
import java.io.IOException;
import java.io.StreamCorruptedException;
import java.net.Inet6Address;
-import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import java.util.UUID;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
-import org.kne.cloud.network.ByteBufferAllocator;
import org.kne.cloud.network.NetworkPacket;
-import org.kne.cloud.network.ipv6.IPv6Packet.IPv6ExtHeader;
-import org.kne.cloud.network.ipv6.IPv6Packet.IPv6SegmentRoutingHeader;
import org.kne.cloud.network.klalb.KLALBPacket;
+import org.kne.cloud.network.kltp.KLTPPacket;
import org.kne.cloud.network.srv6.IPv6SegmentRoutingTLV;
-import org.kne.cloud.network.srv6.IpV6RoutingSRHData;
-import org.kne.cloud.network.srv6.SRv6Pad1TLV;
-import org.kne.cloud.network.srv6.SRv6PadNTLV;
-import org.kne.cloud.network.srv6.SRv6StreamSequenceTLV;
-import org.kne.cloud.network.srv6.SRv6TLV;
import org.kne.cloud.network.tcp.UDPPacket;
import org.kne.io.KNEChannels;
-import org.pcap4j.packet.namednumber.IpNumber;
/**
* IPv6数据包类,继承自NetworkPacket,用于处理IPv6网络数据包
@@ -231,15 +220,7 @@ public class IPv6Packet extends NetworkPacket {
nextHeader == ICMPv6;
}
- private IPv6NetworkLink previousLink;
-
- public IPv6NetworkLink getPreviousLink() {
- return previousLink;
- }
-
- public void setPreviousLink(IPv6NetworkLink previousLink) {
- this.previousLink = previousLink;
- }
+
// TTL是否已减少的标志
private boolean TTLdecreased = false;
@@ -318,7 +299,10 @@ public class IPv6Packet extends NetworkPacket {
* @return 流量类别
*/
public int getTrafficClass() {
- return (IPv6header.get(0) << 4) & (IPv6header.get(1) >>> 4) & BIT_MASK_LOW_8_BITS;
+ // 读取字节 0 和字节 1 组成一个 short(16 位)
+ short firstTwoBytes = IPv6header.getShort(0);
+ // 提取 Traffic Class:高 4 位(Version)去掉,剩下就是 8 位 Traffic Class
+ return (firstTwoBytes & 0x0FF0) >>> 4;
}
/**
@@ -326,8 +310,14 @@ public class IPv6Packet extends NetworkPacket {
* @param trafficClass 流量类别
*/
public void setTrafficClass(int trafficClass) {
- IPv6header.put(0, (byte) (IPv6header.get(0) & BIT_MASK_HIGH_4_BITS | (trafficClass >>> 4)));
- IPv6header.put(1, (byte) (IPv6header.get(1) & BIT_MASK_LOW_4_BITS | ((trafficClass & BIT_MASK_LOW_4_BITS) << 4)));
+ // 读取当前的两个字节
+ short firstTwoBytes = IPv6header.getShort(0);
+ // 清除原来的 Traffic Class 位(将中间 8 位清零)
+ short cleared = (short) (firstTwoBytes & 0xF00F); // 保留高 4 位和低 4 位
+ // 组合新的 Traffic Class
+ short newValue = (short) (cleared | ((trafficClass & 0xFF) << 4));
+ // 一次性写回
+ IPv6header.putShort(0, newValue);
}
/**
@@ -349,7 +339,11 @@ public class IPv6Packet extends NetworkPacket {
* 标记CE(拥塞经历)
*/
public void markCE() {
- IPv6header.put(1, (byte) (IPv6header.get(1) | 0b00110000));
+ byte g=IPv6header.get(1);
+ if((g& 0b00110000) != 0) {
+ // 启用ECN
+ IPv6header.put(1, (byte) ( g| 0b00110000));
+ }
// new Exception().printStackTrace();
}
@@ -366,7 +360,10 @@ public class IPv6Packet extends NetworkPacket {
* @return 流标签
*/
public int getFlowLabel() {
- return ((IPv6header.get(1) & BIT_MASK_LOW_4_BITS) << 16) | (IPv6header.getShort(2) & BIT_MASK_LOW_16_BITS);
+ // 读取前 4 个字节(32 位)
+ int firstWord = IPv6header.getInt(0);
+ // 提取 Flow Label:高 12 位(Version + Traffic Class)去掉,剩下低 20 位
+ return firstWord & 0x000FFFFF;
}
/**
@@ -374,8 +371,14 @@ public class IPv6Packet extends NetworkPacket {
* @param flowLabel 流标签
*/
public void setFlowLabel(int flowLabel) {
- IPv6header.put(1, (byte) (IPv6header.get(1) & BIT_MASK_HIGH_4_BITS | (flowLabel >>> 16)));
- IPv6header.putShort(2, (short) flowLabel);
+ // 读取当前前 4 个字节
+ int firstWord = IPv6header.getInt(0);
+ // 清除原来的 Flow Label(将低 20 位清零)
+ int cleared = firstWord & 0xFFF00000; // 保留高 12 位
+ // 组合新的 Flow Label(只取低 20 位)
+ int newWord = cleared | (flowLabel & 0x000FFFFF);
+ // 一次性写回
+ IPv6header.putInt(0, newWord);
}
/**
@@ -461,7 +464,6 @@ public class IPv6Packet extends NetworkPacket {
/**
* 获取原始源地址字节数组
- * @param sourceAddress 用于存储源地址的字节数组
* @return
*/
public IPv6Address getSourceAddress() {
@@ -479,7 +481,6 @@ public class IPv6Packet extends NetworkPacket {
/**
* 获取原始目标地址字节数组
- * @param destinationAddress 用于存储目标地址的字节数组
*/
public IPv6Address getDestinationAddress() {
return IPv6Address.valueOf(DESTINATION_ADDRESS_OFFSET,IPv6header);
@@ -707,13 +708,12 @@ public class IPv6Packet extends NetworkPacket {
KLALBPacket kp = KLALBPacket.readKLALBPacketFromChannel(din);
this.payload = kp;
break loop;
- case EXPERIMENTAL_1: // 空负载
- IPv6Payload epld = new IPv6EmptyPayload();
- epld.readFromChannel(din, payloadlength);
+ case KLTPPacket.KLTP_PROTOCOL_NUMBER: //KLTP协议
+ IPv6Payload epld = KLTPPacket.readKLTPPacketFromChannel(din);
this.payload = epld;
break loop;
default: // 其他协议类型
- IPv6Payload pld = new IPv6Payload(nextheader);
+ IPv6Payload pld = new IPv6DefaultPayload(nextheader);
pld.readFromChannel(din, payloadlength);
this.payload = pld;
break loop;
@@ -754,56 +754,28 @@ public class IPv6Packet extends NetworkPacket {
/**
* IPv6负载数据类
*/
- public static class IPv6Payload extends NetworkPacket {
- private ByteBuffer data;
+ public static abstract class IPv6Payload extends NetworkPacket {
- private boolean onDefault = true;
private IPv6Packet parent;
- public ByteBuffer getData() {
- return data;
- }
-
private int protocolNumber;
+
+
public IPv6Payload(int protocolNumber) {
- this(protocolNumber, true);
+ this.protocolNumber=protocolNumber;
}
- protected IPv6Payload(int protocolNumber, boolean isonDefault) {
- this.protocolNumber = protocolNumber;
- this.onDefault = isonDefault;
- if (onDefault)
- this.data = NetworkPacket.bufferAllocator.allocate(65535);
- }
+
public int getProtocolNumber() {
return protocolNumber;
}
- public long getTotalLength() {
- return data.limit();
- }
- @Override
- public void writeToChannel(WritableByteChannel dto) throws IOException {
- if (onDefault)
- dto.write(data.slice(0, data.limit()));
- }
-
- @Override
- public void readFromChannel(ReadableByteChannel din, long length) throws IOException {
- if (onDefault) {
- data.limit((int) length);
- while (data.hasRemaining()) {
- if (din.read(data) == -1) {
- throw new EOFException();
- }
- }
- }
- }
+
@Override
protected boolean needEndPosition() {
@@ -817,31 +789,37 @@ public class IPv6Packet extends NetworkPacket {
return parent;
}
}
+
+ public static class IPv6DefaultPayload extends IPv6Payload{
- /**
- * 空IPv6负载数据类
- */
- public static class IPv6EmptyPayload extends IPv6Payload {
-
- public IPv6EmptyPayload() {
- super(EXPERIMENTAL_1, false);
+ private ByteBuffer data;
+ public ByteBuffer getData() {
+ return data;
}
-
- @Override
+ public IPv6DefaultPayload(int protocolNumber) {
+ super(protocolNumber);
+ this.data = NetworkPacket.bufferAllocator.allocate(65535);
+ }
public long getTotalLength() {
- return 0;
+ return data.limit();
}
-
@Override
public void writeToChannel(WritableByteChannel dto) throws IOException {
-
+ dto.write(data.slice(0, data.limit()));
}
@Override
public void readFromChannel(ReadableByteChannel din, long length) throws IOException {
-
+ data.limit((int) length);
+ while (data.hasRemaining()) {
+ if (din.read(data) == -1) {
+ throw new EOFException();
+ }
+ }
}
}
+
+
/**
* IPv6扩展头部基类
@@ -1131,12 +1109,16 @@ public class IPv6Packet extends NetworkPacket {
public IPv6SegmentRoutingHeader(List segs) {
this();
this.addresses.addAll(segs);
- int ln = addresses.size() - 1;
- setLastEntry(ln);
- setSegmentsLeft(ln);
+ resetSegmentPos();
}
- public int getLastEntry() {
+ public void resetSegmentPos() {
+ int ln = addresses.size() - 1;
+ setLastEntry(ln);
+ setSegmentsLeft(ln);
+ }
+
+ public int getLastEntry() {
return getData().get(4) & BIT_MASK_LOW_8_BITS;
}
diff --git a/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java b/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java
index fbd3cd6..33a8ea2 100644
--- a/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java
+++ b/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java
@@ -8,7 +8,6 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
@@ -22,12 +21,7 @@ import org.kne.cloud.network.klalb.CONST;
import org.kne.cloud.network.monitor.SpeedAndTrafficMonitorDataImpl;
import org.kne.cloud.network.srv6.DetNetSRv6TLV;
import org.kne.cloud.network.srv6.IPv6SegmentRoutingTLV;
-import org.kne.cloud.network.srv6.IpV6RoutingSRHData;
-import org.kne.cloud.network.srv6.PacketConsumer;
-import org.kne.cloud.network.srv6.SRv6PacketReorder;
import org.kne.cloud.network.srv6.SRv6Router;
-import org.kne.cloud.network.srv6.SRv6StreamSequenceTLV;
-import org.kne.cloud.network.srv6.SRv6TLV;
import org.kne.cloud.network.tun.InetAddressRow;
import org.kne.cloud.network.tun.TUNChannel;
import org.kne.cloud.network.tun.TUNNetworkDevice;
@@ -94,7 +88,7 @@ public class IPv6TUNLoopbackNetworkLink extends AbstractIPv6NetworkLink
con.accept(IPv6TUNLoopbackNetworkLink.this, () -> {
UUID pid = ipp.getPacketID();
if (pid != null) {
- monitor.getUploadBandwidth().recordPacket(pid, (int) ipp.getTotalLength());
+ monitor.getUploadBandwidth().recordPacket(pid,1, (int) ipp.getTotalLength());
}
// ipp.setDisposeAfterSend(true);
// ipp.getPayload().setDisposeAfterSend(true);
@@ -203,23 +197,14 @@ public class IPv6TUNLoopbackNetworkLink extends AbstractIPv6NetworkLink
pack.writeToChannel(KNEChannels.newWritableChannel(tmp));
UUID pid = pack.getPacketID();
if (pid != null) {
- monitor.getUploadBandwidth().recordPacket(pid, (int) pack.getTotalLength());
+ monitor.getUploadBandwidth().recordPacket(pid, 1,(int) pack.getTotalLength());
}
tmp.flip();
sendQueue.add(tmp);
LockSupport.unpark(tr);
}
- private SRv6StreamSequenceTLV getStreamSequenceTLV(IpV6RoutingSRHData srh) {
- List stv = srh.getTlvs();
- for (Iterator iterator = stv.iterator(); iterator.hasNext();) {
- SRv6TLV sRv6TLV = (SRv6TLV) iterator.next();
- if (sRv6TLV.getType() == SRv6TLV.SEQS) {
- return (SRv6StreamSequenceTLV) sRv6TLV;
- }
- }
- return null;
- }
+
@Override
public boolean isLoopBack() {
@@ -282,11 +267,11 @@ public class IPv6TUNLoopbackNetworkLink extends AbstractIPv6NetworkLink
for (Iterator iteratorx = getNeighborsInfo().iterator(); iteratorx.hasNext();) {
Neighbor addresses = (Neighbor) iteratorx.next();
RouteItem ri = new RouteItem(new IPv6AddressGroup(addresses.getAddress().getAddress(), 128),
- addresses.getAddress().getAddress(), this, "Direct", 0, 128, addresses.getMonitor(), "D", false);
+ addresses.getAddress().getAddress(), this, "Direct", 0, 128, null, "D", false);
rlist.add(ri);
RouteItem ris = new RouteItem(addresses.getLocator(), addresses.getLocator().getAddress(), this,
- "KLALB SRv6", 13, 128, addresses.getMonitor(), "D", false);
+ "KLALB SRv6", 13, 128, null, "D", false);
rlist.add(ris);
}
diff --git a/src/org/kne/cloud/network/ipv6/LoopbackIPv6NetworkLink.java b/src/org/kne/cloud/network/ipv6/LoopbackIPv6NetworkLink.java
index 33e8ef8..c8695f7 100644
--- a/src/org/kne/cloud/network/ipv6/LoopbackIPv6NetworkLink.java
+++ b/src/org/kne/cloud/network/ipv6/LoopbackIPv6NetworkLink.java
@@ -1,19 +1,13 @@
package org.kne.cloud.network.ipv6;
import java.io.IOException;
-import java.net.Inet6Address;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.Lock;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
-import org.kne.cloud.network.srv6.PacketConsumer;
import org.kne.cloud.network.srv6.SRv6Router;
public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements IPv6NetworkLink {
@@ -28,9 +22,9 @@ public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements
this.fallbackLink = fallbackLink;
}
- private Map protocolNumberRegister = new ConcurrentHashMap<>(256 * 2);
+ private IPv6ProtocolRegister[] protocolNumberRegister = new IPv6ProtocolRegister[256];
- public Map getProtocolNumberRegister() {
+ public IPv6ProtocolRegister[] getProtocolNumberRegister() {
return protocolNumberRegister;
}
@@ -46,9 +40,9 @@ public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements
@Override
public void sendPacket(IPv6Packet pack, IPv6Address next) throws IOException {
- PacketConsumer pcm= protocolNumberRegister.get(pack.getPayload().getProtocolNumber());
+ IPv6ProtocolRegister pcm= protocolNumberRegister[pack.getPayload().getProtocolNumber()];
if (pcm != null) {
- if(!pcm.accept(pack)) {
+ if(!pcm.onaccept(pack)) {
if(fallbackLink!=null) {
fallbackLink.sendPacket(pack, next);
}
@@ -110,13 +104,13 @@ public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements
for (Iterator iteratorx = getNeighborsInfo().iterator(); iteratorx.hasNext();) {
Neighbor addresses = (Neighbor) iteratorx.next();
RouteItem ri = new RouteItem(new IPv6AddressGroup(addresses.getAddress().getAddress(), 128),
- addresses.getAddress().getAddress(), this, "Direct", 0, 128, addresses.getMonitor(), "D",
+ addresses.getAddress().getAddress(), this, "Direct", 0, 128, null, "D",
false);
rlist.add(ri);
RouteItem ris = new RouteItem(addresses.getLocator(),
addresses.getLocator().getAddress(), this, "KLALB SRv6", 13, 128,
- addresses.getMonitor(), "D", false);
+ null, "D", false);
rlist.add(ris);
}
diff --git a/src/org/kne/cloud/network/ipv6/RouteItem.java b/src/org/kne/cloud/network/ipv6/RouteItem.java
index 2c51cc1..4e3c67f 100644
--- a/src/org/kne/cloud/network/ipv6/RouteItem.java
+++ b/src/org/kne/cloud/network/ipv6/RouteItem.java
@@ -1,14 +1,7 @@
package org.kne.cloud.network.ipv6;
-import java.net.Inet6Address;
-import java.net.InetAddress;
import java.util.Objects;
-
-
-import org.kne.cloud.network.ipv6.IPv6NetworkLink;
-import org.kne.cloud.network.ipv6.IPv6AddressGroup;
-import org.kne.cloud.network.monitor.DelayMonitorData;
-import org.kne.cloud.network.monitor.MonitorData;
+import java.util.function.Supplier;
public class RouteItem implements Comparable,Cloneable{
private IPv6AddressGroup destination;
@@ -18,14 +11,11 @@ public class RouteItem implements Comparable,Cloneable{
private int pre;
private long cost;
private String flag;
- private MonitorData monitor;
+ private Supplier costSupplier;
private boolean isLoopback;
public String getFlag() {
return flag;
}
- public MonitorData getMonitor() {
- return monitor;
- }
@Override
public int hashCode() {
return Objects.hash(cost, destination, destlink, flag, nexthop, pre, proto);
@@ -56,7 +46,7 @@ public class RouteItem implements Comparable,Cloneable{
this.isLoopback=isLoopback;
}
public RouteItem(IPv6AddressGroup destination, IPv6Address nexthop, IPv6NetworkLink destlink, String proto, int pre,
- long cost,MonitorData monitor,String flag,boolean isLoopback) {
+ long cost,Supplier costSupplier,String flag,boolean isLoopback) {
super();
this.destination = destination;
this.nexthop = nexthop;
@@ -64,7 +54,7 @@ public class RouteItem implements Comparable,Cloneable{
this.proto = proto;
this.pre = pre;
this.cost = cost;
- this.monitor=monitor;
+ this.costSupplier=costSupplier;
this.flag=flag;
this.isLoopback=isLoopback;
}
@@ -99,6 +89,7 @@ public class RouteItem implements Comparable,Cloneable{
public boolean checkMatch(byte[] ia) {
return destination.checkMatch(ia);
}*/
+
@Override
public int compareTo(RouteItem o) {
int v1=destination.compareTo(o.destination);
@@ -110,22 +101,23 @@ public class RouteItem implements Comparable,Cloneable{
int v3=Long.compare(cost, o.cost);
return v3;
}
+ public Supplier getCostSupplier() {
+ return costSupplier;
+ }
@Override
public Object clone() {
try {
RouteItem ri=(RouteItem) super.clone();
- if(monitor!=null)
- ri.monitor=(MonitorData) monitor.clone();
return ri;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
-
- public void preSort() {
- if(monitor!=null) {
- cost=((DelayMonitorData)monitor).getOutDelay();
+ //在排序前调用,计算cost
+ public void updateCost() {
+ if(costSupplier!=null) {
+ cost=costSupplier.get();
}
}
public boolean ECMPequals(RouteItem prevr) {
diff --git a/src/org/kne/cloud/network/ipv6/TLV.java b/src/org/kne/cloud/network/ipv6/TLV.java
index da83dda..20be70c 100644
--- a/src/org/kne/cloud/network/ipv6/TLV.java
+++ b/src/org/kne/cloud/network/ipv6/TLV.java
@@ -43,7 +43,7 @@ public static final int PAD1=0;
private boolean isDefault;
- protected volatile ByteBuffer header;
+ protected ByteBuffer header;
private ByteBuffer data;
diff --git a/src/org/kne/cloud/network/klalb/BindableKLALBPacketConsumer.java b/src/org/kne/cloud/network/klalb/BindableConsumer.java
similarity index 69%
rename from src/org/kne/cloud/network/klalb/BindableKLALBPacketConsumer.java
rename to src/org/kne/cloud/network/klalb/BindableConsumer.java
index 913d48e..4a5c7d4 100644
--- a/src/org/kne/cloud/network/klalb/BindableKLALBPacketConsumer.java
+++ b/src/org/kne/cloud/network/klalb/BindableConsumer.java
@@ -1,9 +1,9 @@
package org.kne.cloud.network.klalb;
import java.net.InetAddress;
-import java.net.ServerSocket;
+import java.util.function.Consumer;
-public interface BindableKLALBPacketConsumer extends PacketConsumer {
+public interface BindableConsumer extends Consumer {
public InetAddress getRemoteInetAddress() ;
public InetAddress getLocalInetAddress() ;
public int getPort() ;
diff --git a/src/org/kne/cloud/network/klalb/CONST.java b/src/org/kne/cloud/network/klalb/CONST.java
index 822420a..fbddc50 100644
--- a/src/org/kne/cloud/network/klalb/CONST.java
+++ b/src/org/kne/cloud/network/klalb/CONST.java
@@ -18,4 +18,6 @@ public class CONST {
public static final int linepanelheight = 41;
public static final int settingheight = 30;
public static final int dialwidth = 150;
+ public static final int windowwidth = 1200;
+ public static final int windowheight = 800;
}
diff --git a/src/org/kne/cloud/network/klalb/DATATPacket.java b/src/org/kne/cloud/network/klalb/DATATPacket.java
index f386468..ff76593 100644
--- a/src/org/kne/cloud/network/klalb/DATATPacket.java
+++ b/src/org/kne/cloud/network/klalb/DATATPacket.java
@@ -6,6 +6,7 @@ import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicInteger;
import org.kne.cloud.network.NetworkPacket;
@@ -101,7 +102,16 @@ public class DATATPacket extends KLALBPacket implements PortPacket{
public int getSize() {
return dataBuffer.limit();
}
+ private int sendCounter=0;
+ public int getSendCounter() {
+ return sendCounter;
+ }
+
+ public void incSendCounter() {
+ sendCounter++;
+ }
+
@Override
public void writeToChannel(WritableByteChannel dto) throws IOException {
klalbHeader.put(17, (byte) getSendCounter());
@@ -126,6 +136,6 @@ public class DATATPacket extends KLALBPacket implements PortPacket{
}
dataBuffer.flip();
}
-
+
}
diff --git a/src/org/kne/cloud/network/klalb/KLALBController.java b/src/org/kne/cloud/network/klalb/KLALBController.java
index 13e6750..4ad7189 100644
--- a/src/org/kne/cloud/network/klalb/KLALBController.java
+++ b/src/org/kne/cloud/network/klalb/KLALBController.java
@@ -7,42 +7,30 @@ import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
-import java.net.NoRouteToHostException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.nio.channels.ReadableByteChannel;
-import java.nio.channels.WritableByteChannel;
-import java.security.SecureRandom;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Scanner;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
-import java.util.function.BiConsumer;
import java.util.function.Consumer;
-import org.kne.cloud.clock.AdjustedNanoClock;
import org.kne.cloud.clock.HighAccuracyClock;
import org.kne.cloud.network.IPMulticastDiscovery;
import org.kne.cloud.network.MultipurposeSocketAddress;
@@ -50,41 +38,27 @@ import org.kne.cloud.network.PortPair;
import org.kne.cloud.network.SocketType;
import org.kne.cloud.network.ThreadTool;
import org.kne.cloud.network.ipv6.IPv6Address;
+import org.kne.cloud.network.ipv6.IPv6AddressGroup;
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
import org.kne.cloud.network.ipv6.IPv6Packet;
-import org.kne.cloud.network.ipv6.IPv6Packet.IPv6ExtHeader;
-import org.kne.cloud.network.ipv6.IPv6Packet.IPv6Payload;
import org.kne.cloud.network.ipv6.IPv6TUNLoopbackNetworkLink;
-import org.kne.cloud.network.ipv6.IPv6AddressGroup;
-import org.kne.cloud.network.ipv6.LoopbackIPv6NetworkLink;
import org.kne.cloud.network.ipv6.Neighbor;
-import org.kne.cloud.network.ipv6.PacketID;
+import org.kne.cloud.network.kltp.KLTPPacket;
+import org.kne.cloud.network.kltp.KLTPProtocolRegister;
import org.kne.cloud.network.monitor.HashMapTimestampMonitor;
-import org.kne.cloud.network.monitor.MonitorData;
import org.kne.cloud.network.monitor.SpeedAndTrafficMonitorDataImpl;
-import org.kne.cloud.network.monitor.TimestampMonitor;
import org.kne.cloud.network.ntp.NTPContext;
import org.kne.cloud.network.ntp.NTPv4Packet;
import org.kne.cloud.network.ntp.NTPv4Protocol;
import org.kne.cloud.network.ntp.NTPv4Protocol.NTPPeer;
-import org.kne.cloud.network.srv6.JsonDataPacket;
import org.kne.cloud.network.srv6.KLALBRoutingProtocol;
import org.kne.cloud.network.srv6.KLALBRoutingProtocolAPIClient;
import org.kne.cloud.network.srv6.KLALBRoutingProtocolAPIServer;
-import org.kne.cloud.network.srv6.KLALBRoutingProtocolJsonData;
-import org.kne.cloud.network.srv6.PacketConsumer;
import org.kne.cloud.network.srv6.SRv6Router;
import org.kne.cloud.network.srv6.SRv6RouterListener;
import org.kne.cloud.network.tcp.UDPPacket;
+import org.kne.cloud.network.tcp.UDPProtocolRegister;
import org.kne.cloud.network.te.BandwidthDistributer;
-import org.kne.cloud.network.te.DWRRLoadingBalanceAlgorithm;
-import org.kne.concurrent.DisruptorExecutor;
-import org.kne.concurrent.HighPerformanceExecutor;
-import org.kne.io.KNEChannels;
-import org.pcap4j.packet.IpV6Packet.IpV6Header;
-
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
public class KLALBController {
private UUID nodeuuid=UUID.randomUUID();
@@ -93,14 +67,14 @@ public class KLALBController {
public HighAccuracyClock getClock() {
return clock;
}
-
+ private final long TIME_WINDOW=5000000000L;
private SpeedAndTrafficMonitorDataImpl linkMonitor = new SpeedAndTrafficMonitorDataImpl(
- new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "up", 100, 500000000L),
- new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "down", 100, 500000000L));
+ new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "up", 100,TIME_WINDOW ),
+ new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "down", 100, TIME_WINDOW));
private SpeedAndTrafficMonitorDataImpl datatMonitor = new SpeedAndTrafficMonitorDataImpl(
- new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "up", 100, 500000000L),
- new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "down", 100, 500000000L));
+ new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "up", 100, TIME_WINDOW),
+ new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "down", 100, TIME_WINDOW));
private List selflineTable = new ArrayList<>();
@@ -123,6 +97,17 @@ public class KLALBController {
public List getDnsAddresses() {
return dnsAddresses;
}
+ private ScheduledExecutorService scheduleTimer=Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors(),new ThreadFactory() {
+
+ @Override
+ public Thread newThread(Runnable r) {
+ return ThreadTool.makeVDaemonThreadIfSupport("计时器线程", r);
+ }
+ });
+
+ public ScheduledExecutorService getScheduleTimer() {
+ return scheduleTimer;
+ }
private Timer twk = new Timer("网卡检测扫描计时器", true);
@@ -193,8 +178,8 @@ public class KLALBController {
Set st = new HashSet<>();
for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
IPv6NetworkLink link = iterator.next();
- if (link instanceof KLALBRemoteLine) {
- KLALBRemoteLine multipurposeSocketAddress = (KLALBRemoteLine) link;
+ if (link instanceof KLALBRemoteLink) {
+ KLALBRemoteLink multipurposeSocketAddress = (KLALBRemoteLink) link;
if (multipurposeSocketAddress.getSocketAddress() != null)
st.add(multipurposeSocketAddress.getSocketAddress());
}
@@ -206,8 +191,8 @@ public class KLALBController {
}
for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
IPv6NetworkLink link = iterator.next();
- if (link instanceof KLALBRemoteLine) {
- KLALBRemoteLine reml = (KLALBRemoteLine) link;
+ if (link instanceof KLALBRemoteLink) {
+ KLALBRemoteLink reml = (KLALBRemoteLink) link;
if (reml.getSocketAddress() != null) {
if (reml.getBindAddress() != null || reml.getRemoteVaddr() != null)
try {
@@ -237,6 +222,8 @@ public class KLALBController {
updateBroadcastNetworkInterface();
} catch (SocketException e) {
+ }catch (Exception e) {
+ e.printStackTrace();
}
}
@@ -448,21 +435,11 @@ public class KLALBController {
return datagramSocketType;
}
- // private Supplier selflineTableSupplier=()->{return null;};
-
- /*
- * public Supplier getSelflineTableSupplier() { return
- * selflineTableSupplier; }
- *
- * public void setSelflineTableSupplier(Supplier selflineTableSupplier)
- * { this.selflineTableSupplier = selflineTableSupplier; }
- */
public List getSelflineTable() {
return selflineTable;
}
- // private Inet6AddressGroup self;
public IPv6AddressGroup getSelf() {
return srv6Router.getLocator();
@@ -474,30 +451,14 @@ public class KLALBController {
return srv6Router.getLinkTabel();
}
- private PortBinder streamPortBinder = new PortBinder(this);
- private PortBinder datagramPortBinder = new PortBinder(this);
-
- private PortBinder rawPortBinder = new PortBinder(this);
-
- protected PortBinder getStreamPortBinder() {
- return streamPortBinder;
- }
-
- protected PortBinder getDatagramPortBinder() {
- return datagramPortBinder;
- }
-
- protected PortBinder getRawPortBinder() {
- return rawPortBinder;
- }
public void reconnectImmediately() {
for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
IPv6NetworkLink val = iterator.next();
- if (val instanceof KLALBRemoteLine) {
+ if (val instanceof KLALBRemoteLink) {
- KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) val;
+ KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) val;
klalbRemoteLine.reconnectImmediately();
}
}
@@ -510,34 +471,17 @@ public class KLALBController {
private KLALBRoutingProtocolAPIClient apiClient;
private KLALBControllerConfigItem configItem;
-
- /*
- * private PacketReceiver prc = new PacketReceiver(); private class
- * PacketReceiver implements Consumer {
- *
- * @Override public void accept(KLALBPacket rec) { switch (rec.getType()) { case
- * KLALBPacket.ADDLINES: ADDLINESPacket lpt = (ADDLINESPacket) rec; String s =
- * lpt.getLines(); ThreadTool.makeVDaemonThreadIfSupport("线路添加任务", () -> {
- * Scanner scn = new Scanner(s); while (scn.hasNext()) { String sn =
- * scn.nextLine(); MultipurposeSocketAddress msa = new
- * MultipurposeSocketAddress(sn); addRemoteLines(msa);
- *
- * } }).start(); break; default: break;
- *
- * } }
- *
- * }
- */
+
public void addRemoteLines(List select) {
for (MultipurposeSocketAddress target : select) {
addRemoteLines(target);
}
}
- public List addRemoteLines(MultipurposeSocketAddress target) {
+ public List addRemoteLines(MultipurposeSocketAddress target) {
lineslock.writeLock().lock();
try {
- List added = new ArrayList<>();
+ List added = new ArrayList<>();
try {
Enumeration eu = NetworkInterface.getNetworkInterfaces();
while (eu.hasMoreElements()) {
@@ -583,7 +527,7 @@ public class KLALBController {
count=1;
}
for(int i=0;i removeRemoteLines(MultipurposeSocketAddress mpsa) {
+ public List removeRemoteLines(MultipurposeSocketAddress mpsa) {
- List rmved = new ArrayList<>();
+ List rmved = new ArrayList<>();
for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
IPv6NetworkLink link = iterator.next();
- if (link instanceof KLALBRemoteLine) {
- KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link;
+ if (link instanceof KLALBRemoteLink) {
+ KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) link;
if (mpsa.equals(klalbRemoteLine.getSocketAddress())) {
klalbRemoteLine.close();
rmved.add(klalbRemoteLine);
@@ -626,11 +570,11 @@ public class KLALBController {
}
public Inet6Address getRemoteVaddrBySocketAddress(MultipurposeSocketAddress target) throws SocketTimeoutException {
- KLALBRemoteLine kr = null;
+ KLALBRemoteLink kr = null;
for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
IPv6NetworkLink link = iterator.next();
- if (link instanceof KLALBRemoteLine) {
- KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link;
+ if (link instanceof KLALBRemoteLink) {
+ KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) link;
if (target.equals(klalbRemoteLine.getSocketAddress()) && klalbRemoteLine.getBindAddress() == null) {
kr = klalbRemoteLine;
break;
@@ -639,7 +583,7 @@ public class KLALBController {
}
if (kr == null) {
- kr = new KLALBRemoteLine(this, target);
+ kr = new KLALBRemoteLink(this, target);
addRemoteLine(kr);
kr.waitForRemoteVaddrAvaliable(20000);
} else {
@@ -653,8 +597,8 @@ public class KLALBController {
boolean b = false;
for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
IPv6NetworkLink link = iterator.next();
- if (link instanceof KLALBRemoteLine) {
- KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link;
+ if (link instanceof KLALBRemoteLink) {
+ KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) link;
if (bind.equals2(klalbRemoteLine.getBindAddress())
&& target.equals2(klalbRemoteLine.getSocketAddress())) {
b = true;
@@ -669,8 +613,8 @@ public class KLALBController {
boolean b = false;
for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) {
IPv6NetworkLink link = iterator.next();
- if (link instanceof KLALBRemoteLine) {
- KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link;
+ if (link instanceof KLALBRemoteLink) {
+ KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) link;
if (target.equals(klalbRemoteLine.getSocketAddress())) {
b = true;
break;
@@ -680,12 +624,9 @@ public class KLALBController {
return b;
}
- public void addRemoteLine(KLALBRemoteLine krs) {
+ public void addRemoteLine(KLALBRemoteLink krs) {
lineslock.writeLock().lock();
try {
- krs.setLocalVaddrSupplier(() -> {
- return getSelf();
- });
krs.startIO();
String selflineTable = generateSelfLineTable();
if (selflineTable != null && !selflineTable.equals(""))
@@ -706,63 +647,26 @@ public class KLALBController {
return sbd.toString();
}
- private class UDPProtocolPacketConsumer implements PacketConsumer {
-
- @Override
- public boolean accept(IPv6Packet packx) throws IOException {
-
- IPv6Payload pl = packx.getPayload();
- packx.putTimePassport("unpacked");
- packx.printPassport();
- if (pl instanceof UDPPacket) {
- UDPPacket rec = (UDPPacket) pl;
- if (showpacket)
- System.out.println("UDP_RX:" + rec);
- IPv6Address srcA = packx.getSourceAddress();
- PortPacket pt = (PortPacket) rec;
- if (datagramPortBinder.distributePacketToConsumer(srcA, pt)) {
- return true;
- }
- }
- return false;
- // packx.dispose();
- // });
- }
+
+
+ private UDPProtocolRegister udpr;
+ public UDPProtocolRegister getUDPregister() {
+ return udpr;
+ }
+
+ private KLTPProtocolRegister kltpr;
+ public KLTPProtocolRegister getKLTPregister() {
+ return kltpr;
}
- private class KLALBProtocolPacketConsumer implements PacketConsumer {
- @Override
- public boolean accept(IPv6Packet packx) throws IOException {
- IPv6Payload pl = packx.getPayload();
- packx.putTimePassport("unpacked");
- packx.printPassport();
- if (pl instanceof KLALBPacket) {
- KLALBPacket rec = (KLALBPacket) pl;
- if (showpacket)
- System.out.println("KLALB_RX:" + rec);
- if (rec instanceof PortPacket) {
- rec.setCE(packx.isCE());
- IPv6Address srcA = packx.getSourceAddress();
- PortPacket pt = (PortPacket) rec;
- if (streamPortBinder.distributePacketToConsumer(srcA, pt)) {
- } else {
- if (!(pt instanceof RSTPacket)) {
- srv6Router.enqueuePacketSendTask(() -> {
- return createPacketToAddress(srcA, 0, new RSTPacket(pt.getDstPort(), pt.getSrcPort()),
- 2);
- });
- }
- }
- }
- }
- return true;
- // packx.dispose();
- }
+ private PortBinder rawPortBinder ;
+ protected PortBinder getRawPortBinder() {
+ return rawPortBinder;
}
-
+
private void loadSRv6ProtocolStack(IPv6AddressGroup selfx, boolean enableVirtualAdapter) {
srv6Router = new SRv6Router(selfx, clock);
srv6Router.runKLALBRouteProtocol();
@@ -770,11 +674,12 @@ public class KLALBController {
routingProtocol.addReceiver((addr, packet) -> {
});
-
+ rawPortBinder= new PortBinder(this.getSelf().getAddress());
System.out.println(" Loaded: SRv6 Stack");
String name=(configItem!=null)?configItem.getTUNName():CONST.KLALB_S_RV6;
if (enableVirtualAdapter&&(name!=null)) {
+ Thread t=new Thread(()->{
try {
IPv6TUNLoopbackNetworkLink tunlink = new IPv6TUNLoopbackNetworkLink(name,
new IPv6AddressGroup(srv6Router.getLocator().getAddress(), 32), SRv6Router.MTU, dnsAddresses);
@@ -787,18 +692,23 @@ public class KLALBController {
System.err.println("挂载虚拟网卡失败,可能是无管理员权限?请尝试使用管理员权限运行软件");
e.printStackTrace();
}
+ });
+ t.start();
}else {
System.out.println(" Tun Adapter Disbaled");
}
- srv6Router.getinLoopback().getProtocolNumberRegister().put(UDPPacket.UDP_PROTOCOL_NUMBER,
- new UDPProtocolPacketConsumer());
+ udpr=new UDPProtocolRegister(this);
+ srv6Router.getinLoopback().getProtocolNumberRegister()[UDPPacket.UDP_PROTOCOL_NUMBER]=
+ udpr;
System.out.println(" Loaded: UDP Protocol");
- srv6Router.getinLoopback().getProtocolNumberRegister().put(KLALBPacket.KLALB_PROTOCOL_NUMBER,
- new KLALBProtocolPacketConsumer());
- System.out.println(" Loaded: KLALB Protocol");
+ kltpr=new KLTPProtocolRegister(this);
+ srv6Router.getinLoopback().getProtocolNumberRegister()[KLTPPacket.KLTP_PROTOCOL_NUMBER]=
+ kltpr;
+ System.out.println(" Loaded: KLTP Protocol");
String iproxyname = "KLALB_" + UUID.randomUUID();
registerToProxyTypeAs(iproxyname);
+ System.out.println(" Loaded: KLALB Protocol");
NTPContext context = new NTPContext(clock);
context.syncToSystem();
@@ -812,7 +722,6 @@ public class KLALBController {
public void onLinkChanged(SRv6Router router, IPv6NetworkLink link) {
List nb = router.getNeighbors();
- // System.out.println("srv6 ip"+nb);
Set sp = nvc.getPeers();
for (Neighbor neighbor : nb) {
if (neighbor.getLocator() != null)
@@ -873,6 +782,17 @@ public class KLALBController {
}
protected void initKLALB(boolean enableVirtualAdapter, IPv6AddressGroup selfg) {
+ ThreadTool.makeVDaemonThread("线路性能采样线程", ()->{
+ while(true) {
+ linkMonitor.update();
+ datatMonitor.update();
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }).start();
loadSRv6ProtocolStack(selfg, enableVirtualAdapter);
loadController();
}
@@ -973,7 +893,7 @@ public class KLALBController {
public void run() {
if (srv6Router != null) {
srv6Router.getLinkTabel().removeIf((v) -> {
- return (v instanceof KLALBRemoteLine) && ((KLALBRemoteLine) v).isClosed();
+ return (v instanceof KLALBRemoteLink) && ((KLALBRemoteLink) v).isClosed();
});
srv6Router.updateRouteTabel();
}
@@ -992,13 +912,12 @@ public class KLALBController {
}, 10, 10);
}
- protected IPv6Packet createPacketToAddress(IPv6Address addr, int flowlabel, IPv6Packet.IPv6Payload packet) {
+ public IPv6Packet createPacketToAddress(IPv6Address addr, int flowlabel, IPv6Packet.IPv6Payload packet) {
return createPacketToAddress(addr, flowlabel, packet, 1);
}
- protected IPv6Packet createPacketToAddress(IPv6Address addr, int flowlabel, IPv6Packet.IPv6Payload packet,
+ public IPv6Packet createPacketToAddress(IPv6Address addr, int flowlabel, IPv6Packet.IPv6Payload packet,
int count) {
- // HighPerformanceExecutor.defaultExecutor.execute(() -> {
IPv6Packet ipv = new IPv6Packet();
@@ -1006,23 +925,17 @@ public class KLALBController {
System.out.println("KLALB_TX:" + packet);
ipv.setVersion(6);
- ipv.setTrafficClass(0);
+ ipv.setTrafficClass(0b10);
ipv.setFlowLabel(flowlabel);
ipv.setHopLimit(255);
ipv.setSourceAddress(getSelf().getAddress());
ipv.setDestinationAddress(addr);
- ipv.enableECN();
-
ipv.setPayload(packet);
packet.setParent(ipv);
- if (packet instanceof KLALBPacket)
- ((KLALBPacket) packet).incSendCounter();
+
- packet.putTimePassport("packedInIPv6");
- packet.printPassport();
- ipv.putTimePassport("packed");
return ipv;
}
@@ -1088,19 +1001,11 @@ public class KLALBController {
}
- private Timer t = new Timer("数据包重传计时器", true);
+
- protected Timer getResendTimer() {
- return t;
- }
-
- private Timer t2 = new Timer("数据包粘包计时器", true);
private List listens = new CopyOnWriteArrayList<>();
- public Timer getNagleTimer() {
- return t2;
- }
public void registerToProxyTypeAs(String proxyname) {
MultipurposeSocketAddress.getSocketTypeRegister().put(proxyname + "_Stream", streamSocketType);
@@ -1117,34 +1022,15 @@ public class KLALBController {
private KLALBRoutingProtocol routingProtocol;
public List getNTPTable() {
- return ntptable;// nvc2.getPeers().add(new NTPPeer("{UDP}106.55.184.199:123",
- // NTPv4Packet.NTP_CLIENT));
+ return ntptable;
}
public KLALBControllerConfigItem getConfigItem() {
return configItem;
}
- /*
- * @Override public void listen(MultipurposeSocketAddress msa) { // TODO
- * 自动生成的方法存根
- *
- * }
- *
- * @Override public void unlisten(MultipurposeSocketAddress msc) { // TODO
- * 自动生成的方法存根
- *
- * }
- *
- * @Override public void connect(MultipurposeSocketAddress msa) { // TODO
- * 自动生成的方法存根
- *
- * }
- *
- * @Override public void unconnect(MultipurposeSocketAddress msc) { // TODO
- * 自动生成的方法存根
- *
- * }
- */
+
+
+
}
diff --git a/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java b/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java
index 1043faf..0178a84 100644
--- a/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java
+++ b/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java
@@ -1,16 +1,11 @@
package org.kne.cloud.network.klalb;
import java.net.InetAddress;
-import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
-import java.util.Objects;
import org.kne.cloud.network.MultipurposeSocketAddress;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
public class KLALBControllerConfigItem extends KLALBConfigItem {
private String language;
private boolean nogui;
@@ -26,6 +21,7 @@ public class KLALBControllerConfigItem extends KLALBConfigItem {
private boolean denyLineTableQuery=false;
private boolean denyLineTableBroadcast=false;
private String congestionAlgorithm="BBR";
+ private double burstLimit=1.20;
private double delayUpperBound=1.20;
private double delayLowerBound=1.15;
private long nagleDelayTime=1000000L;
@@ -205,6 +201,18 @@ public class KLALBControllerConfigItem extends KLALBConfigItem {
}
+
+
+
+
+ public double getBurstLimit() {
+ return burstLimit;
+ }
+
+
+ public void setBurstLimit(double burstLimit) {
+ this.burstLimit = burstLimit;
+ }
public double getDelayUpperBound() {
diff --git a/src/org/kne/cloud/network/klalb/KLALBInputStream.java b/src/org/kne/cloud/network/klalb/KLALBInputStream.java
index f431a5f..d1f36d2 100644
--- a/src/org/kne/cloud/network/klalb/KLALBInputStream.java
+++ b/src/org/kne/cloud/network/klalb/KLALBInputStream.java
@@ -1,13 +1,9 @@
package org.kne.cloud.network.klalb;
-import static org.kne.cloud.network.klalb.KLALBPacket.*;
-import java.io.DataInput;
import java.io.DataInputStream;
-import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.StreamCorruptedException;
-import java.net.Inet6Address;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
@@ -24,7 +20,7 @@ public class KLALBInputStream extends DataInputStream {
readFully(b);
String s=new String(b,"ascii");
if(!s.equals("KLALB")) {
- throw new StreamCorruptedException("no KLALB format");
+ throw new StreamCorruptedException("remote protocol is no KLALB format");
}
int bv=readInt();
int mv=readInt();
diff --git a/src/org/kne/cloud/network/klalb/KLALBMain.java b/src/org/kne/cloud/network/klalb/KLALBMain.java
index 6df36ef..ba10b7e 100644
--- a/src/org/kne/cloud/network/klalb/KLALBMain.java
+++ b/src/org/kne/cloud/network/klalb/KLALBMain.java
@@ -4,7 +4,6 @@ import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.ServerSocketChannel;
-import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
@@ -12,20 +11,17 @@ import java.util.List;
import java.util.NoSuchElementException;
import java.util.Scanner;
-import javax.swing.JFrame;
-
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.SocketChannelListener;
-import org.kne.cloud.network.SocketListener;
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
import org.kne.cloud.network.ipv6.RouteItem;
import org.kne.cloud.network.klalb.ui.KLALBStateGUI3;
import org.kne.cloud.network.klalb.ui.UIEnv;
import org.kne.cloud.network.perf.Kperf;
import org.kne.cloud.network.perf.NodeBenchmark;
-import org.kne.debug.Debuger;
import org.kne.debug.TimeDebugger;
import org.kne.membandboost.MembandBenchmark;
+import org.kne.membandboost.ObjectPoolBandwidthTest;
public class KLALBMain {
public static KLALBStateGUI3 ksg;
@@ -90,8 +86,9 @@ public class KLALBMain {
System.out.println(" links-add : add link");
System.out.println(" links-remove : remove link");
System.out.println(" links-reconnect: reconnect all link");
+ System.out.println(" kltp-state: query kltp states");
System.out.println(" route: display internal route table");
- System.out.println(" kperf : Porformance benchmark");
+ System.out.println(" kperf : performance benchmark");
System.out.println(" exit: Exit");
break;
@@ -104,12 +101,13 @@ public class KLALBMain {
break;
case "links-state":
System.out.println("links state:");
- System.out.println("状态\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动");
+ //System.out.println("状态\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动");
+ System.out.println("state\tspd↑\tspd↓\tPPS↑\tPPS↓\tdelay↑\tdelay↓\tjitter↑\tjitter↓");
synchronized (kpcje.getKlalbController().getLines()) {
for (Iterator iterator = kpcje.getKlalbController().getLines().iterator(); iterator.hasNext();) {
IPv6NetworkLink link=iterator.next();
- if(link instanceof KLALBRemoteLine) {
- KLALBRemoteLine hostPort = (KLALBRemoteLine) link;
+ if(link instanceof KLALBRemoteLink) {
+ KLALBRemoteLink hostPort = (KLALBRemoteLink) link;
System.out.println(hostPort .toString());
}
}
@@ -118,31 +116,34 @@ public class KLALBMain {
case "links-add":
if(sc.length>=2) {
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]);
- Listaddl=kpcje.getKlalbController().addRemoteLines(mpsa);
+ Listaddl=kpcje.getKlalbController().addRemoteLines(mpsa);
if(addl.isEmpty()) {
- System.out.println("添加失败,线路已存在!");
+ //System.out.println("添加失败,线路已存在!");
+ System.out.println("link already exist!");
}else {
- for (Iterator iterator = addl.iterator(); iterator.hasNext();) {
- KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next();
+ for (Iterator iterator = addl.iterator(); iterator.hasNext();) {
+ KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) iterator.next();
- System.out.println("添加成功:"+klalbRemoteLine.getMonitor().getName());
+ //System.out.println("添加成功:"+klalbRemoteLine.getMonitor().getName());
+ System.out.println("Successfully added: "+klalbRemoteLine.getName());
}
}
}else {
- System.out.println("请输入要添加地址:端口!");
+ // System.out.println("请输入要添加地址:端口!");
+ System.out.println("Input Address:port");
}
break;
case "links-remove":
if(sc.length>=2) {
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]);
- Listrmvl=kpcje.getKlalbController().removeRemoteLines(mpsa);
+ Listrmvl=kpcje.getKlalbController().removeRemoteLines(mpsa);
if(rmvl.isEmpty()) {
System.out.println("No matched link has been found.");
}else {
for (Iterator iterator = rmvl.iterator(); iterator.hasNext();) {
- KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next();
+ KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) iterator.next();
- System.out.println("Successfully removed: "+klalbRemoteLine.getMonitor().getName());
+ System.out.println("Successfully removed: "+klalbRemoteLine.getName());
}
}
}else {
@@ -157,6 +158,9 @@ public class KLALBMain {
System.out.println("Trying to reconnect all links.");
kpcje.getKlalbController().reconnectImmediately();
break;
+ case "kltp-state":
+ System.out.println(kpcje.getKlalbController().getKLTPregister().toString());
+ break;
case "route":
List lri=new ArrayList<>( kpcje.getKlalbController().getIpv6Router().getCurrentRouteTabel());
Collections.sort(lri);
@@ -178,9 +182,13 @@ public class KLALBMain {
}
break;
- case "memcpy":
+ case "membandbenchmark":
MembandBenchmark.main(args);
break;
+ case "memqueuebenchmark":
+
+ ObjectPoolBandwidthTest.main(args);
+ break;
//case "$$SYSTEM:":
//System.out.println();
//break;
diff --git a/src/org/kne/cloud/network/klalb/KLALBPacket.java b/src/org/kne/cloud/network/klalb/KLALBPacket.java
index 04815b4..03c8124 100644
--- a/src/org/kne/cloud/network/klalb/KLALBPacket.java
+++ b/src/org/kne/cloud/network/klalb/KLALBPacket.java
@@ -9,10 +9,6 @@ import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
import org.kne.cloud.network.NetworkPacket;
import org.kne.cloud.network.ipv6.IPv6Packet;
@@ -52,13 +48,13 @@ public abstract class KLALBPacket extends IPv6Packet.IPv6Payload {
protected ByteBuffer klalbHeader;
protected KLALBPacket(ByteBuffer klalbHeader,int headerLength) {
- super(KLALB_PROTOCOL_NUMBER,false);
+ super(KLALB_PROTOCOL_NUMBER);
this.klalbHeader = klalbHeader;
this.headerLength=headerLength;
}
public KLALBPacket(int type,int headerLength) {
- super(KLALB_PROTOCOL_NUMBER,false);
+ super(KLALB_PROTOCOL_NUMBER);
klalbHeader=NetworkPacket.bufferAllocator.allocate(headerLength);
klalbHeader.put((byte) type);
this.headerLength=headerLength;
@@ -113,24 +109,6 @@ public abstract class KLALBPacket extends IPv6Packet.IPv6Payload {
return headerLength;
}
-
-
- //private List sendRecord=new ArrayList<>(2);
-
- private AtomicInteger sendCounter=new AtomicInteger(0);
-
- public int getSendCounter() {
- return sendCounter.get();
- }
-
- public void incSendCounter() {
- sendCounter.incrementAndGet();
- }
- /*public List getSendRecord() {
- return sendRecord;
- }*/
-
-
protected ByteBuffer getKLALBHeader() {
return klalbHeader;
}
diff --git a/src/org/kne/cloud/network/klalb/KLALBProtocolDetectSocketListener.java b/src/org/kne/cloud/network/klalb/KLALBProtocolDetectSocketListener.java
index 9a40ec8..55a92e2 100644
--- a/src/org/kne/cloud/network/klalb/KLALBProtocolDetectSocketListener.java
+++ b/src/org/kne/cloud/network/klalb/KLALBProtocolDetectSocketListener.java
@@ -44,9 +44,9 @@ public class KLALBProtocolDetectSocketListener extends SocketListener {
super.setCon((soc)->{
ProtocolDetectorSocket pds=(ProtocolDetectorSocket) soc;
if(!pds.getProtocolStack().isEmpty()&&pds.getProtocolStack().pop().getName().equals("KLALB")) {
- KLALBRemoteLine krs=null;
+ KLALBRemoteLink krs=null;
try {
- krs = new KLALBRemoteLine(klalbController,new StreamKLALBPacketLink(pds));
+ krs = new KLALBRemoteLink(klalbController,new StreamKLALBPacketLink(pds));
klalbController.addRemoteLine(krs);
} catch (Exception e) {
e.printStackTrace();
diff --git a/src/org/kne/cloud/network/klalb/KLALBProxySystem.java b/src/org/kne/cloud/network/klalb/KLALBProxySystem.java
index 73ed0f4..dadba00 100644
--- a/src/org/kne/cloud/network/klalb/KLALBProxySystem.java
+++ b/src/org/kne/cloud/network/klalb/KLALBProxySystem.java
@@ -5,39 +5,20 @@ import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
-import java.net.Inet6Address;
-import java.net.InetAddress;
import java.net.InetSocketAddress;
-import java.net.NetworkInterface;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.SocketTimeoutException;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
import org.kne.cloud.network.*;
import org.kne.cloud.network.klalb.ui.KLALBStateGUI3;
import org.kne.cloud.network.klalb.ui.Language;
import org.kne.cloud.network.klalb.ui.UIEnv;
-import org.kne.cloud.network.minecraft.MinecraftSocketBridge;
import java.util.Set;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
-import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
-import com.google.gson.JsonPrimitive;
public class KLALBProxySystem {
private Set proxys=new HashSet<>();
@@ -158,9 +139,9 @@ public class KLALBProxySystem {
tcpl.setCon((soc)->{
- KLALBRemoteLine krs=null;
+ KLALBRemoteLink krs=null;
try {
- krs = new KLALBRemoteLine(klalbController,new StreamChannelKLALBPacketLink(soc));
+ krs = new KLALBRemoteLink(klalbController,new StreamChannelKLALBPacketLink(soc));
klalbController.addRemoteLine(krs);
} catch (IOException e) {
e.printStackTrace();
@@ -181,9 +162,9 @@ public class KLALBProxySystem {
udpl.setCon((soc)->{
- KLALBRemoteLine krs=null;
+ KLALBRemoteLink krs=null;
try {
- krs = new KLALBRemoteLine(klalbController,new SplitedDatagramKLALBPacketLink(soc));
+ krs = new KLALBRemoteLink(klalbController,new SplitedDatagramKLALBPacketLink(soc));
klalbController.addRemoteLine(krs);
} catch (IOException e) {
e.printStackTrace();
diff --git a/src/org/kne/cloud/network/klalb/KLALBRemoteLine.java b/src/org/kne/cloud/network/klalb/KLALBRemoteLink.java
similarity index 75%
rename from src/org/kne/cloud/network/klalb/KLALBRemoteLine.java
rename to src/org/kne/cloud/network/klalb/KLALBRemoteLink.java
index e062b37..335a004 100644
--- a/src/org/kne/cloud/network/klalb/KLALBRemoteLine.java
+++ b/src/org/kne/cloud/network/klalb/KLALBRemoteLink.java
@@ -1,80 +1,55 @@
package org.kne.cloud.network.klalb;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.PrintStream;
import java.io.StreamCorruptedException;
-import java.lang.ModuleLayer.Controller;
-import java.math.BigInteger;
-import java.net.Inet6Address;
-import java.net.InetAddress;
import java.net.SocketTimeoutException;
-import java.net.UnknownHostException;
import java.nio.channels.UnresolvedAddressException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Queue;
import java.util.UUID;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.LongAdder;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.function.BiConsumer;
import java.util.function.Consumer;
-import java.util.function.Supplier;
+import org.jctools.queues.MpscArrayQueue;
import org.kne.cloud.clock.HighAccuracyClock;
import org.kne.cloud.clock.NTPTimestamps;
import org.kne.cloud.clock.ReliabilityBackoffTimeClock;
import org.kne.cloud.clock.WatchDogTimer;
import org.kne.cloud.network.MultipurposeSocketAddress;
-import org.kne.cloud.network.SpeedLimiter;
import org.kne.cloud.network.ThreadTool;
import org.kne.cloud.network.congestion.BBRCongestionAlgorithm;
import org.kne.cloud.network.congestion.CongestionAlgorithm;
+import org.kne.cloud.network.congestion.CongestionAlgorithms;
import org.kne.cloud.network.congestion.DetnetCongestionAlgorithm;
import org.kne.cloud.network.congestion.SendPacketSlidingWindow;
-import org.kne.cloud.network.congestion.Vegas2CongestionAlgorithm;
import org.kne.cloud.network.ipv6.ControlledIPv6NetworkLink;
-import org.kne.cloud.network.ipv6.ICMPv6PostcardPacket;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.ipv6.IPv6HopByHopTLV;
-import org.kne.cloud.network.ipv6.IPv6NetworkLink;
import org.kne.cloud.network.ipv6.IPv6Packet;
-import org.kne.cloud.network.ipv6.IPv6Packet.IPv6EmptyPayload;
import org.kne.cloud.network.ipv6.IPv6Packet.IPv6HopByHopHeader;
-import org.kne.cloud.network.ipv6.IPv6Packet.IPv6SegmentRoutingHeader;
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
import org.kne.cloud.network.ipv6.KLALBOAMHopByHopTLV;
import org.kne.cloud.network.ipv6.KLALBPassportHopByHopTLV;
import org.kne.cloud.network.ipv6.Neighbor;
-import org.kne.cloud.network.ipv6.PacketID;
-import org.kne.cloud.network.ipv6.PacketIDGenerator;
import org.kne.cloud.network.ipv6.PostcardEntry;
import org.kne.cloud.network.ipv6.RouteItem;
-import org.kne.cloud.network.monitor.MonitorData;
+import org.kne.cloud.network.monitor.CostSupplierFactory;
+import org.kne.cloud.network.monitor.DelayMonitorData;
+import org.kne.cloud.network.monitor.LinkStatus;
import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl;
import org.kne.cloud.network.perf.TESTNPacket;
-import org.kne.cloud.network.srv6.ACKSEQSSegmentRoutingTLV;
-import org.kne.cloud.network.srv6.IPv6SegmentRoutingTLV;
-import org.kne.cloud.network.srv6.SRv6Router;
import org.kne.cloud.network.te.BandwidthDistributer;
-import org.kne.concurrent.HighPerformanceExecutor;
import org.kne.concurrent.SpinLock;
import org.kne.concurrent.ThreadParker;
import org.kne.math.Long128;
-import com.github.f4b6a3.uuid.UuidCreator;
-
-public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implements ControlledIPv6NetworkLink {
+public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implements ControlledIPv6NetworkLink {
private static final int HEADER_CALIBRATE = 40;
@@ -84,8 +59,6 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
private volatile boolean closed = false;
- private volatile Supplier localVaddrSupplier;
-
private volatile KLALBController klalbController;
public KLALBController getKlalbController() {
@@ -93,14 +66,6 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
}
- public Supplier getLocalVaddrSupplier() {
- return localVaddrSupplier;
- }
-
- public void setLocalVaddrSupplier(Supplier localVaddrSupplier) {
- this.localVaddrSupplier = localVaddrSupplier;
- }
-
private volatile IPv6AddressGroup remoteVaddr;
public IPv6AddressGroup getRemoteVaddr() {
@@ -128,9 +93,11 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
}
public String toString() {
- return remoteVaddr + "\t" + monitor.toString();
+ return remoteVaddr + "\t" +name+"\n" +status+"\t"+monitor.toString();
}
+ private String name;
+ private LinkStatus status=new LinkStatus();
private SpeedAndTrafficAndDelayMonitorDataImpl monitor;
private volatile KLALBPacketLink kplink;
private MultipurposeSocketAddress bindAddress;
@@ -167,20 +134,20 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
return peerAddress;
}
- public KLALBRemoteLine(KLALBController controller, MultipurposeSocketAddress mpa, IPv6AddressGroup address) {
+ public KLALBRemoteLink(KLALBController controller, MultipurposeSocketAddress mpa, IPv6AddressGroup address) {
this(controller,mpa, null,address);
}
- public KLALBRemoteLine(KLALBController controller,KLALBPacketLink kpl, IPv6AddressGroup address) {
+ public KLALBRemoteLink(KLALBController controller,KLALBPacketLink kpl, IPv6AddressGroup address) {
this.klalbController=controller;
sysclk = klalbController.getClock();
this.kplink = kpl;
this.addressGroup = address;
monitor=new SpeedAndTrafficAndDelayMonitorDataImpl(sysclk);
- monitor.setName(kpl.toString());
+ name=kpl.toString();
}
- private KLALBRemoteLine(KLALBController controller,MultipurposeSocketAddress mpa, MultipurposeSocketAddress bindaddr, IPv6AddressGroup address) {
+ private KLALBRemoteLink(KLALBController controller,MultipurposeSocketAddress mpa, MultipurposeSocketAddress bindaddr, IPv6AddressGroup address) {
this.klalbController=controller;
sysclk = klalbController.getClock();
this.socketAddress = mpa;
@@ -188,22 +155,22 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
this.addressGroup = address;
monitor=new SpeedAndTrafficAndDelayMonitorDataImpl(sysclk);
if (bindaddr == null) {
- monitor.setName("→" + mpa.toString());
+ name="→" + mpa.toString();
} else {
- monitor.setName(bindaddr.toString() + "→" + mpa.toString());
+ name=bindaddr.toString() + "→" + mpa.toString();
}
}
- public KLALBRemoteLine(KLALBController controller,MultipurposeSocketAddress mpa, MultipurposeSocketAddress bind) {
+ public KLALBRemoteLink(KLALBController controller,MultipurposeSocketAddress mpa, MultipurposeSocketAddress bind) {
this(controller,mpa, bind, null);
}
- public KLALBRemoteLine(KLALBController controller,MultipurposeSocketAddress mpa) {
+ public KLALBRemoteLink(KLALBController controller,MultipurposeSocketAddress mpa) {
this(controller,mpa, (IPv6AddressGroup) null);
}
- public KLALBRemoteLine(KLALBController controller,KLALBPacketLink link) {
+ public KLALBRemoteLink(KLALBController controller,KLALBPacketLink link) {
this(controller,link, (IPv6AddressGroup) null);
}
@@ -216,10 +183,8 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
private class RemoteSender implements Runnable {
-
- private SpeedLimiter speedLimit = new SpeedLimiter(256 * 1024L, 10 * 1000000L);// 50*1000000L
- private ConcurrentLinkedQueue sendQueue = new ConcurrentLinkedQueue();
+ private MpscArrayQueue sendQueue = new MpscArrayQueue(8192);
private WatchDogTimer watchdog = new WatchDogTimer(400000000L);
private ThreadParker tlock = new ThreadParker();
@@ -227,6 +192,8 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
private volatile long time = System.nanoTime();
private volatile long pingInterval = 100000000L;
+ private Lock sendLock=new SpinLock();
+
private boolean checkPingTime() {
long cu = System.nanoTime();
if (cu - time > pingInterval) {
@@ -239,7 +206,7 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
}
- public ConcurrentLinkedQueue getSendQueue() {
+ public Queue getSendQueue() {
return sendQueue;
}
@@ -275,8 +242,8 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
}
writeKLALBPacketToKPL(new VADDRREQPacket());
writeKLALBPacketToKPL(new VADDRREQPacket());
- writeKLALBPacketToKPL(new VADDRPacket(localVaddrSupplier.get()));
- writeKLALBPacketToKPL(new VADDRPacket(localVaddrSupplier.get()));
+ writeKLALBPacketToKPL(new VADDRPacket(klalbController.getSelf()));
+ writeKLALBPacketToKPL(new VADDRPacket(klalbController.getSelf()));
kplink.flush();
while ((!kplink.isClosed()) && (!closed)) {
if (checkPingTime()) {
@@ -286,22 +253,38 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
if (peerAddress == null)
sendPacket(new ADDRREQPacket());
- }
- KLALBPacket tkpp = sendQueue.poll();
-
- if (tkpp != null) {
- kplink.writeKLALBPacket(tkpp);
- watchdog.feed();
+ }/*sendLock.lock();
+ int n;
+ try {
+ n = sendQueue.drain((tkpp)->{
+ try {
+ kplink.writeKLALBPacket(tkpp);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ },100);
+ }finally {
+ sendLock.unlock();
+ }
+ if (n>0) {
+ watchdog.feed();
} else {
tlock.parkNanos(1000000L);
- }
+ }*/
long curr=System.nanoTime();
if(curr-flushTime>=flushInterval) {
flushTime=curr;
+ sendLock.lock();
+ try {
kplink.flush();
+ watchdog.feed();
+ }finally {
+ sendLock.unlock();
+ }
}
- Thread.yield();
+ tlock.parkNanos(1000000L);
+
}
} catch (StreamCorruptedException sce) {
sce.printStackTrace();
@@ -323,10 +306,39 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
boolean b=sendQueue.add(blk);
if(b) {
tlock.unpark();
- speedLimit.forceTransmit(blk.getTotalLength());
}
return b;
}
+
+
+ public void sendDirect(KLALBPacket blk) {
+ sendLock.lock();
+ try {
+ writeKLALBPacketToKPL(blk);
+ } catch (IOException | UnresolvedAddressException e) {
+ if (debug)
+ e.printStackTrace();
+ try {
+ kplink.close();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ tpk.unpark();
+ }finally {
+ sendLock.unlock();
+ }
+ watchdog.feed();
+ tlock.unpark();
+ }
+
+
+ public long getQueueUsed() {
+ long used=0;
+ for(KLALBPacket pack:sendQueue) {
+ used+=pack.getTotalLength();
+ }
+ return used;
+ }
}
@@ -334,6 +346,7 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
private WatchDogTimer watchdog = new WatchDogTimer(400000000L);
private long rtt=Long.MAX_VALUE/1024;
+ private long rttMin=Long.MAX_VALUE/1024;
AtomicBoolean fst = new AtomicBoolean(true);
//ReentrantLock readLock = new ReentrantLock();
@@ -348,7 +361,7 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
}
watchdog.feed();
KLALBPacket kpp = kppb;
- SRv6Router.getDefaultExecutor().execute(() -> {
+ //SRv6Router.getDefaultExecutor().execute(() -> {
debugShowPacket("RX", kpp);
UUID val = null;
long delay = Long.MAX_VALUE / 1024;
@@ -402,19 +415,25 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
long DsndDelay = prcv.subtract(psnd).longValue();
long DrcvDelay = local.subtract(posnd).longValue();
- // System.out.println(DsndDelayFactor+" "+DrcvDelayFactor);
+ // System.out.println(DsndDelay+" "+DrcvDelay);
rtt = DsndDelay + DrcvDelay;
+ if(rtt= 0 && DrcvDelay >= 0) {
delay = DrcvDelay;
- monitor.getUploadBandwidth().recordPacket(KLALBUtils.createGlobalUUID(), psnd, 0, DsndDelay);
- // System.out.println(local);
+ monitor.recordUploadDelay(DsndDelay);
+ //sysclk.adjustClock(Long128.valueOf( DsndDelay-DrcvDelay), 0.001);
} else {
long Dfallback = rtt / 2;
if (Dfallback >= 0) {
delay = Dfallback;
- monitor.getUploadBandwidth().recordPacket(KLALBUtils.createGlobalUUID(), psnd, 0, Dfallback);
+ monitor.recordUploadDelay(Dfallback);
}
+ sysclk.adjustClock(Long128.valueOf( DsndDelay-DrcvDelay), 0.1);
}
algorithm.setCurrentBandwidth(png.getDownSpeed());
@@ -437,11 +456,11 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
if (ardg2 != null)
addressGroup = ardg2;
}
- KLALBRemoteLine.this.onAddressUpdate();
+ KLALBRemoteLink.this.onAddressUpdate();
break;
case KLALBPacket.VADDRREQ:
- sendPacket(new VADDRPacket(localVaddrSupplier.get()));
+ sendPacket(new VADDRPacket(klalbController.getSelf()));
break;
case KLALBPacket.VADDR:
IPv6AddressGroup vdr = ((VADDRPacket) kpp).getVaddr();
@@ -450,10 +469,10 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
sendPacket(new VADDRACKPacket());
if (fst.compareAndSet(true, false)) {
// coll.resetCoolingTime();
- monitor.setState(MonitorData.UP);
- KLALBRemoteLine.this.onOnlineStateUpdate();
+ status.setState(LinkStatus.UP);
+ KLALBRemoteLink.this.onOnlineStateUpdate();
}
- KLALBRemoteLine.this.onLocatorUpdate();
+ KLALBRemoteLink.this.onLocatorUpdate();
break;
case KLALBPacket.VADDRACK:
@@ -464,19 +483,16 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
IPv6OverKLALBPacket ivk = (IPv6OverKLALBPacket) kpp;
IPv6Packet iv6 = ivk.getIPv6Packet();
- ivk.putTimePassport("unpacked");
- ivk.printPassport();
- iv6.putTimePassport("unpackFromLink");
if (getSrv6Router() != null) {
- getSrv6Router().onReceive(KLALBRemoteLine.this, iv6);
+ getSrv6Router().onReceive(KLALBRemoteLink.this, iv6);
}
KLALBOAMHopByHopTLV ktlv = null;
- List ptlv = new ArrayList<>();
long btimes = 0;
IPv6HopByHopHeader hop = iv6.getHopByHopHeader();
if (hop != null) {
+ List ptlv = new ArrayList<>();
List tlvs = hop.getTlvs();
for (IPv6HopByHopTLV tlv : tlvs) {
if (tlv instanceof KLALBOAMHopByHopTLV) {
@@ -488,14 +504,13 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
ptlv.add(btimes + ((KLALBPassportHopByHopTLV) tlv).getTimestampOffsetLong());
}
}
- }
if (ptlv.size() >= 2) {
long delta = ptlv.get(ptlv.size() - 1) - ptlv.get(ptlv.size() - 2);
long deltaxnanos = (long) (delta * 1000000000.0 / (1L << 32));
if (deltaxnanos > 0)
- //System.out.println(deltaxnanos);
delay = deltaxnanos;
}
+ }
break;
@@ -503,12 +518,17 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
long length = kpp.getTotalLength();
UUID pid = val == null ? KLALBUtils.createGlobalUUID() : val;
- monitor.getDownloadBandwidth().recordPacket(pid, (int) length, delay);
- if (klalbController != null) {
- klalbController.getLinkMonitor().getDownloadBandwidth().recordPacket(pid, (int) length,
- delay);
+ //monitor.getDownloadBandwidth().recordPacket(pid,0,1, delay);
+ if(delay!=Long.MAX_VALUE / 1024) {
+ monitor.recordDownloadDelay(delay);
+ //System.out.println(name+" "+delay);
}
- });
+ monitor.recordDownloadPacket((int)length);
+ if (klalbController != null) {
+ //klalbController.getLinkMonitor().getDownloadBandwidth().recordPacket(pid, (int) length,delay);
+ klalbController.getLinkMonitor().recordDownloadPacket((int)length);
+ }
+ //});
}
} catch (StreamCorruptedException sce) {
sce.printStackTrace();
@@ -533,16 +553,37 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
public long getRTT() {
return rtt;
}
+ public long getRTTMin() {
+ return rttMin;
+ }
}
private ThreadParker tpk=new ThreadParker();
private StateManager stateManager;
+ private MonitorUpdater monitorUpdater;
+ private class MonitorUpdater implements Runnable{
+ @Override
+ public void run() {
+ while (!closed) {
+ status.updateReliability();
+ monitor.update();
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ }
+
+ }
+ private RemoteSender sender;
+ private RemoteReceiver receiver;
private class StateManager implements Runnable {
private Thread currThread;
- private RemoteSender sender;
- private RemoteReceiver receiver;
@Override
public void run() {
currThread = Thread.currentThread();
@@ -580,10 +621,7 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
sender = new RemoteSender();
receiver = new RemoteReceiver();
- algorithm.setSpeedControlConsumer((speed, bursttime) -> {
- sender.speedLimit.setLimitspeed(speed);
- sender.speedLimit.setBrustTime(bursttime);
- });
+
sendWindow = new SendPacketSlidingWindow(algorithm, 65535, HEADER_CALIBRATE);
sendWindow.setResendConsumer(rerouteConsumer);
@@ -604,6 +642,10 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
if(klalbController!=null&& klalbController.getConfigItem()!=null) {
KLALBControllerConfigItem config=klalbController.getConfigItem();
if(algorithm instanceof DetnetCongestionAlgorithm) {
+ double v0=config.getBurstLimit();
+ if(v0!=0) {
+ ((DetnetCongestionAlgorithm)algorithm).setBurstLimit(v0);
+ }
double v1=config.getDelayUpperBound();
if(v1!=0) {
((DetnetCongestionAlgorithm)algorithm).setUpperDelayBound(v1);
@@ -619,8 +661,13 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
}
boolean b = sender.getWatchdog().isBarking()
|| receiver.getWatchdog().isBarking();
- boolean isup= (!b)&&(receiver.getRTT()<1000000000L);
- monitor.setState(isup?MonitorData.UP:MonitorData.UNSTABLE);
+ boolean isup= (!b)&&(receiver.getRTT()<1000000000L);//&&(receiver.getRTT() bandwidthDistributer = new BandwidthDistributer();
-
+ BandwidthDistributer bandwidthDistributer=new BandwidthDistributer<>();
@Override
public List getNeighborsInfo() {
List hs = new ArrayList<>(1);
if (peerAddress != null) {
hs.add(new Neighbor(peerAddress, remoteVaddr, monitor, bandwidthDistributer));
- // System.out.println(peerAddress+" "+addressGroup);
}
return hs;
}
- private volatile int inputchachesize = 8192 * 4000;
- private volatile int outputchachesize = 8192 * 240;// 500
private Consumer rerouteConsumer;
@Override
public void sendPacket(IPv6Packet pack, IPv6Address inet6Address) throws IOException {
// 只有已连接的链路才能传输数据
- if (monitor.getState() == MonitorData.UP) {
+ if (status.getState() == LinkStatus.UP) {
- // if(inet6Address.equals(remoteVaddr.getAddress())||inet6Address.equals(peerAddress.getAddress()))
- // {
- // 获得数据包的IPv6逐跳扩展头部
IPv6HopByHopHeader hop = pack.getHopByHopHeader();
UUID val = null;
@@ -835,20 +870,15 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
}
if (val != null) {
- if (!(pack.getPayload() instanceof ICMPv6PostcardPacket)) {
+ //if (!(pack.getPayload() instanceof ICMPv6PostcardPacket)) {
// 放入滑动窗口中并记录缓冲区大小占用
sendWindow.put(val, pack);
- }
+ //}
}
}
- // 捎带发送反方向的ACK给对方发送过来的数据包,减小设备性能开销
- /*
- * if(srh!=null) { addACKSEQToSRH(srh,10); }
- */
- // 发送数据包
-
+
sendIPv6PacketToLink(pack, val);
- // }
+
} else {
if (rerouteConsumer != null) {
@@ -864,8 +894,6 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
private void sendIPv6PacketToLink(IPv6Packet pack, UUID val) {
IPv6OverKLALBPacket kipv6 = new IPv6OverKLALBPacket(pack);
- pack.putTimePassport("packdInLink");
- pack.printPassport();
sendPacketToLink(kipv6, val);
}
@@ -874,34 +902,25 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
}
@Override
- public boolean isCongress(IPv6Packet iPv6Packet, double scale) {
+ public boolean isCongestion(IPv6Packet iPv6Packet, double scale) {
SendPacketSlidingWindow sw = sendWindow;
if (sw != null) {
- boolean cong = (scale <= 1.0) && (monitor.getOutDelay() / (monitor.getOutDelayMin() + 1000000L) > 2);
-
- return cong || sw.isCongress(iPv6Packet, scale);
+ return sw.isCongestion( scale);
} else {
return true;
}
}
- @Override
- public boolean isReachSpeedLimit(IPv6Packet iPv6Packet) {
- //boolean xcongress = !speedLimit.checkTransmit(iPv6Packet.getTotalLength());
- //return xcongress;
- return false;
- }
-
@Override
public String getName() {
- return monitor.getName();
+ return name;
}
@Override
public boolean isUp() {
- return (!isClosed()) && (getMonitor().getState() == MonitorData.UP) ;
+ return (!isClosed()) && (status.getState() == LinkStatus.UP) ;
}
@Override
@@ -916,12 +935,12 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
for (Iterator iteratorx = getNeighborsInfo().iterator(); iteratorx.hasNext();) {
Neighbor addresses = (Neighbor) iteratorx.next();
RouteItem ri = new RouteItem(new IPv6AddressGroup(addresses.getAddress().getAddress(), 128),
- addresses.getAddress().getAddress(), this, "Direct", 0, 128, addresses.getMonitor(), "D", false);
+ addresses.getAddress().getAddress(), this, "Direct", 0, 128,CostSupplierFactory.expectedDelaySupplier((DelayMonitorData) addresses.getMonitor(),status,algorithm::getRTO), "D", false);
rlist.add(ri);
if (addresses.getLocator() != null) {
RouteItem ris = new RouteItem(addresses.getLocator(), addresses.getLocator().getAddress(), this,
- "KLALB SRv6", 13, 128, addresses.getMonitor(), "D", false);
+ "KLALB SRv6", 13, 128,CostSupplierFactory.expectedDelaySupplier((DelayMonitorData) addresses.getMonitor(),status,algorithm::getRTO), "D", false);
rlist.add(ris);
}
}
@@ -939,9 +958,30 @@ public class KLALBRemoteLine extends AbstractControlledIPv6NetworkLink implement
if (deltaxnanos > 0) {
Long128 psnd = NTPTimestamps.ntp128BitToNanosTimestamp(
NTPTimestamps.inferNtp64To128(postcard.getTimestampBase(), sysclk.getCurrentTimeNTP128()));
- monitor.getUploadBandwidth().recordPacket(KLALBUtils.createGlobalUUID(), psnd, 0, deltaxnanos);
+ monitor.recordUploadDelay(deltaxnanos);
}
- sendWindow.ack(postcard.getPacketUUID());
+ sendWindow.ack(postcard.getPacketUUID(),false,deltaxnanos);
+
}
+
+ public int getState() {
+ return status.getState();
+ }
+
+
+ public SendPacketSlidingWindow getWindow() {
+ return sendWindow;
+ }
+
+
+ public long getQueueUsed() {
+ if(sender==null) {
+ return 0;
+ }
+ return sender.getQueueUsed();
+ }
+
+
+
}
diff --git a/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java b/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java
index 49592b1..34fcf96 100644
--- a/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java
+++ b/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java
@@ -1,21 +1,17 @@
package org.kne.cloud.network.klalb;
import java.io.IOException;
-import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;
-import java.util.Set;
import org.kne.cloud.network.MultipurposeSocketAddress;
-import org.kne.cloud.network.Proxy;
import org.kne.cloud.network.SocketListener;
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
-import org.kne.cloud.network.monitor.MonitorData;
+import org.kne.cloud.network.monitor.LinkStatus;
import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
@@ -69,15 +65,15 @@ public class KLALBRemoteManagement {
synchronized (lineslist) {
for (Iterator iterator = lineslist.iterator(); iterator.hasNext();) {
IPv6NetworkLink link=iterator.next();
- if(!(link instanceof KLALBRemoteLine)) {
+ if(!(link instanceof KLALBRemoteLink)) {
continue;
}
- KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link;
+ KLALBRemoteLink klalbRemoteLine = (KLALBRemoteLink) link;
if(klalbRemoteLine.getSocketAddress()==null)
continue;
JsonObject jklbrl=new JsonObject();
jklbrl.addProperty("ipport", klalbRemoteLine.getSocketAddress().toString());
- jklbrl.addProperty("state",MonitorData.parseStateToString( klalbRemoteLine.getMonitor().getState()));
+ jklbrl.addProperty("state",LinkStatus.stateToString( klalbRemoteLine.getState()));
jklbrl.addProperty("Vaddr", klalbRemoteLine.getRemoteVaddr().getAddress().toString());
diff --git a/src/org/kne/cloud/network/klalb/KLALBUtils.java b/src/org/kne/cloud/network/klalb/KLALBUtils.java
index aa5e407..fdacab2 100644
--- a/src/org/kne/cloud/network/klalb/KLALBUtils.java
+++ b/src/org/kne/cloud/network/klalb/KLALBUtils.java
@@ -10,10 +10,11 @@ import java.net.UnknownHostException;
import java.security.SecureRandom;
import java.util.List;
import java.util.UUID;
-import java.util.concurrent.LinkedBlockingQueue;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.jctools.counters.CountersFactory;
+import org.jctools.counters.FixedSizeStripedLongCounter;
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.ipv6.IPv6Address;
@@ -385,20 +386,17 @@ public static String parseAbbrIPv6(String IPv6Str) {
private final long id;
private long counter=0;
- private UUID randUUID=UUID.randomUUID();
- private long time=System.nanoTime();
- private static final long INTERVAL=1000000L;
+ private long randUUIDh;
+ private long randUUIDl;
+ private static SecureRandom sr=new SecureRandom();
public UUIDGenarator(long threadId) {
this.id=threadId;
+ randUUIDh=sr.nextLong();
+ randUUIDl=sr.nextLong();
}
public UUID genarateUUID() {
- long curr=System.nanoTime();
- if(curr-time>INTERVAL) {
- time=curr;
- randUUID=UUID.randomUUID();
- }
- long h=randUUID.getMostSignificantBits()^id;
- long l=randUUID.getLeastSignificantBits()^counter;
+ long h=randUUIDh^id;
+ long l=randUUIDl^counter;
UUID ret=new UUID(h, l);
counter++;
@@ -413,4 +411,9 @@ public static String parseAbbrIPv6(String IPv6Str) {
//return UUID.randomUUID();
return gens.get().genarateUUID();
}
+
+
+ public static FixedSizeStripedLongCounter createCounter() {
+ return CountersFactory.createFixedSizeStripedCounter(Runtime.getRuntime().availableProcessors());
+ }
}
diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocketImpl.java b/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocketImpl.java
index dd422cf..d9d13e0 100644
--- a/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocketImpl.java
+++ b/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocketImpl.java
@@ -3,7 +3,6 @@ package org.kne.cloud.network.klalb;
import java.io.IOException;
import java.net.BindException;
import java.net.DatagramPacket;
-import java.net.DatagramSocketImpl;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
@@ -18,15 +17,12 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport;
-import org.kne.cloud.network.NetworkPacket;
import org.kne.cloud.network.VirtualDatagramSocketImpl;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.ipv6.IPv6Packet;
import org.kne.cloud.network.tcp.UDPPacket;
-import org.kne.concurrent.HighPerformanceExecutor;
-import org.kne.io.KNEChannels;
-public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl implements BindableKLALBPacketConsumer{
+public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl implements BindableConsumer{
private KLALBController controller;
@@ -89,8 +85,8 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
localaddr = (Inet6Address) host;
localPort=port;
if(!ignoreBindCheck)
- controller.getDatagramPortBinder().bind(this);
- controller.getDatagramPortBinder().listen(this);
+ controller.getUDPregister().bind(this);
+ controller.getUDPregister().listen(this);
}
@Override
@@ -137,12 +133,10 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
p.setLength(buffer.limit());
}
- @Override
protected void setTTL(byte ttl) throws IOException {
this.ttl=ttl;
}
- @Override
protected byte getTTL() throws IOException {
return (byte) ttl;
}
@@ -183,9 +177,9 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
@Override
protected void close() {
- controller.getDatagramPortBinder().unlisten(this);
+ controller.getUDPregister().unlisten(this);
if(!ignoreBindCheck)
- controller.getDatagramPortBinder().unbind(this);
+ controller.getUDPregister().unbind(this);
closed=true;
}
@@ -218,14 +212,16 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
private Queue recvQueue = new ConcurrentLinkedQueue();
private AtomicInteger recvQueueUsed=new AtomicInteger(0);
@Override
- public void accept(IPv6Address t,NetworkPacket np) {
- UDPPacket u=(UDPPacket) np;
+ public void accept(IPv6Packet t) {
+ if(t.getPayload() instanceof UDPPacket) {
+ UDPPacket u=(UDPPacket) t.getPayload();
if(recvQueueUsed.get()<=inputchachesize) {
if(recvQueue.offer(u)) {
recvQueueUsed.addAndGet((int) u.getDataLength());
LockSupport.unpark(parkThread);
}
}
+ }
}
@Override
diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocketImpl.java b/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocketImpl.java
index d29ef9f..933b103 100644
--- a/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocketImpl.java
+++ b/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocketImpl.java
@@ -16,26 +16,19 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport;
import java.util.function.BiConsumer;
-import java.util.function.Consumer;
import java.util.function.Supplier;
-import org.kne.cloud.network.ByteBufferAllocator;
-import org.kne.cloud.network.NetworkPacket;
-import org.kne.cloud.network.RawSocketImpl;
-import org.kne.cloud.network.ThreadTool;
import org.kne.cloud.network.VirtualRawSocketImpl;
import org.kne.cloud.network.ipv6.IPv6Packet;
-import org.kne.cloud.network.ipv6.IPv6Packet.IPv6Payload;
+import org.kne.cloud.network.ipv6.IPv6Packet.IPv6DefaultPayload;
+import org.kne.cloud.network.ipv6.IPv6ProtocolRegister;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
import org.kne.cloud.network.ipv6.LoopbackIPv6NetworkLink;
-import org.kne.cloud.network.srv6.PacketConsumer;
-import org.kne.cloud.network.srv6.SRv6Router;
-import org.kne.concurrent.HighPerformanceExecutor;
import org.kne.io.KNEChannels;
-public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements PacketConsumer{
+public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements IPv6ProtocolRegister{
private boolean ipHeaderInclude=false;
@@ -123,7 +116,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
@Override
protected void close() {
- link.getProtocolNumberRegister().remove(bindProtocolNumber);
+ link.getProtocolNumberRegister()[bindProtocolNumber]=null;
}
@Override
@@ -156,8 +149,10 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
localaddr=(Inet6Address) address;
this.bindProtocolNumber=protocolNumber;
- if(link.getProtocolNumberRegister().putIfAbsent(protocolNumber, this)!=null) {
+ if(link.getProtocolNumberRegister()[protocolNumber]!=null) {
throw new BindException("protocol number already bind");
+ }else {
+ link.getProtocolNumberRegister()[protocolNumber]=this;
}
}
@@ -191,7 +186,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
if(ipHeaderInclude) {
}else {
- IPv6Payload pl=new IPv6Payload(bindProtocolNumber);
+ IPv6DefaultPayload pl=new IPv6DefaultPayload(bindProtocolNumber);
pl.getData().put(buf);
pl.getData().flip();
BiConsumer>cons=link.getReceiveConsumer();
@@ -281,7 +276,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
private AtomicInteger recvQueueUsed=new AtomicInteger(0);
@Override
- public boolean accept(IPv6Packet packx) throws IOException {
+ public boolean onaccept(IPv6Packet packx) throws IOException {
if(recvQueueUsed.get()<=inputchachesize) {
if(recvQueue.offer(packx)) {
recvQueueUsed.addAndGet((int) packx.getPayload().getTotalLength());
diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualSocketChannel.java b/src/org/kne/cloud/network/klalb/KLALBVirtualSocketChannel.java
index 62321de..8e9a3fb 100644
--- a/src/org/kne/cloud/network/klalb/KLALBVirtualSocketChannel.java
+++ b/src/org/kne/cloud/network/klalb/KLALBVirtualSocketChannel.java
@@ -7,11 +7,9 @@ import java.net.SocketException;
import java.net.SocketOption;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
-import java.nio.channels.spi.SelectorProvider;
import java.util.Set;
-
-import org.kne.cloud.network.klalb.KLALBVirtualSocketImpl.KVSIInputStream;
-import org.kne.cloud.network.klalb.KLALBVirtualSocketImpl.KVSIOutputStream;
+import org.kne.cloud.network.kltp.KLTPInputStream;
+import org.kne.cloud.network.kltp.KLTPOutputStream;
public class KLALBVirtualSocketChannel extends SocketChannel{
@@ -110,22 +108,22 @@ public class KLALBVirtualSocketChannel extends SocketChannel{
@Override
public int read(ByteBuffer dst) throws IOException {
- return ((KVSIInputStream)socket.getInputStream()).read(dst);
+ return ((KLTPInputStream)socket.getInputStream()).read(dst);
}
@Override
public long read(ByteBuffer[] dsts, int offset, int length) throws IOException {
- return ((KVSIInputStream)socket.getInputStream()).read(dsts,offset,length);
+ return ((KLTPInputStream)socket.getInputStream()).read(dsts,offset,length);
}
@Override
public int write(ByteBuffer src) throws IOException {
- return ((KVSIOutputStream)socket.getOutputStream()).write(src);
+ return ((KLTPOutputStream)socket.getOutputStream()).write(src);
}
@Override
public long write(ByteBuffer[] srcs, int offset, int length) throws IOException {
- return ((KVSIOutputStream)socket.getOutputStream()).write(srcs,offset,length);
+ return ((KLTPOutputStream)socket.getOutputStream()).write(srcs,offset,length);
}
@Override
@@ -146,13 +144,13 @@ public class KLALBVirtualSocketChannel extends SocketChannel{
}
public boolean isAutoFlush() throws IOException {
- return ((KVSIOutputStream)socket.getOutputStream()).isAutoFlush();
+ return ((KLTPOutputStream)socket.getOutputStream()).isAutoFlush();
}
public void setAutoFlush(boolean b) throws IOException {
- ((KVSIOutputStream)socket.getOutputStream()).setAutoFlush(b);
+ ((KLTPOutputStream)socket.getOutputStream()).setAutoFlush(b);
}
public void flush() throws IOException {
- ((KVSIOutputStream)socket.getOutputStream()).flush();
+ ((KLTPOutputStream)socket.getOutputStream()).flush();
}
}
diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java b/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java
index 66cc9ad..c1ec57b 100644
--- a/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java
+++ b/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java
@@ -15,205 +15,43 @@ import java.net.SocketException;
import java.net.SocketImpl;
import java.net.SocketOptions;
import java.net.SocketTimeoutException;
-import java.nio.ByteBuffer;
-import java.nio.channels.ReadableByteChannel;
-import java.nio.channels.WritableByteChannel;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TimerTask;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.zip.Deflater;
-import java.util.zip.DeflaterOutputStream;
-import java.util.zip.Inflater;
-import java.util.zip.InflaterInputStream;
-import org.kne.cloud.clock.HighAccuracyClock;
-import org.kne.cloud.network.NetworkPacket;
-import org.kne.cloud.network.PortPair;
-import org.kne.cloud.network.SpeedLimiter;
import org.kne.cloud.network.VirtualSocketImpl;
-import org.kne.cloud.network.congestion.CongestionAlgorithm;
-import org.kne.cloud.network.congestion.DCTCP2CongestionAlgorithm;
-import org.kne.cloud.network.congestion.SendPacketSlidingWindow;
import org.kne.cloud.network.ipv6.IPv6Address;
-import org.kne.cloud.network.ipv6.PacketID;
-import org.kne.cloud.network.ipv6.PacketIDGenerator;
-import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl;
-import org.kne.concurrent.SpinLock;
-import org.kne.concurrent.ThreadParker;
-
-import com.github.f4b6a3.uuid.UuidCreator;
-
-public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements BindableKLALBPacketConsumer{
-
- private static final int HEADER_CALIBRATE = 100;
- /*
- private PrintStream dbg;
- {
- try {
- dbg= new PrintStream("debug.csv");
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
-
- }
- */
+import org.kne.cloud.network.kltp.KLTPInputStream;
+import org.kne.cloud.network.kltp.KLTPOutputStream;
+import org.kne.cloud.network.kltp.KLTPSessionPacket;
+public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements BindableConsumer{
private static final boolean debug = false;
- //private SpeedAndTrafficAndDelayMonitorDataImpl socketMonitor=new SpeedAndTrafficAndDelayMonitorDataImpl(HighAccuracyClock.SYSTEM_CLOCK);
-
- //private SpeedAndTrafficAndDelayMonitorDataImpl socketRawMonitor=new SpeedAndTrafficAndDelayMonitorDataImpl(HighAccuracyClock.SYSTEM_CLOCK);
+ private static final int DEFAULT_TIMEOUT=10000;
private KLALBController controller;
-
- //60000 30 30
- private final int MTU=8192;
- private final long MIN_RTTVAR=200000000L;
- private final long MIN_LIMIT_SPEED=128*1024L;
- private final long REACK_INTERVAL = 100000000L;
-
-
- private SpeedLimiter spdlmt=new SpeedLimiter(MIN_LIMIT_SPEED,1000000L);
-
protected IPv6Address remoteaddr;
protected IPv6Address localaddr=IPv6Address.UNSPECIFIED;
- private BlockingQueue