v2ray 9 лет назад
Родитель
Сommit
94fb16fdfa

+ 8 - 0
transport/internet/kcp/config.go

@@ -22,6 +22,10 @@ func (this *Config) GetSendingWindowSize() uint32 {
 	return size
 }
 
+func (this *Config) GetSendingQueueSize() uint32 {
+	return this.WriteBuffer / this.Mtu
+}
+
 func (this *Config) GetReceivingWindowSize() uint32 {
 	size := this.DownlinkCapacity * 1024 * 1024 / this.Mtu / (1000 / this.Tti) / 2
 	if size == 0 {
@@ -30,6 +34,10 @@ func (this *Config) GetReceivingWindowSize() uint32 {
 	return size
 }
 
+func (this *Config) GetReceivingQueueSize() uint32 {
+	return this.ReadBuffer / this.Mtu
+}
+
 func DefaultConfig() Config {
 	return Config{
 		Mtu:              1350,

+ 12 - 14
transport/internet/kcp/connection.go

@@ -40,18 +40,17 @@ func nowMillisec() int64 {
 // Connection is a KCP connection over UDP.
 type Connection struct {
 	sync.RWMutex
-	state           ConnState
-	kcp             *KCP // the core ARQ
-	kcpAccess       sync.Mutex
-	block           Authenticator
-	needUpdate      bool
-	local, remote   net.Addr
-	wd              time.Time // write deadline
-	chReadEvent     chan struct{}
-	writer          io.WriteCloser
-	since           int64
-	terminateOnce   signal.Once
-	writeBufferSize uint32
+	state         ConnState
+	kcp           *KCP // the core ARQ
+	kcpAccess     sync.Mutex
+	block         Authenticator
+	needUpdate    bool
+	local, remote net.Addr
+	wd            time.Time // write deadline
+	chReadEvent   chan struct{}
+	writer        io.WriteCloser
+	since         int64
+	terminateOnce signal.Once
 }
 
 // NewConnection create a new KCP connection between local and remote.
@@ -63,13 +62,12 @@ func NewConnection(conv uint16, writerCloser io.WriteCloser, local *net.UDPAddr,
 	conn.block = block
 	conn.writer = writerCloser
 	conn.since = nowMillisec()
-	conn.writeBufferSize = effectiveConfig.WriteBuffer / effectiveConfig.Mtu
 
 	authWriter := &AuthenticationWriter{
 		Authenticator: block,
 		Writer:        writerCloser,
 	}
-	conn.kcp = NewKCP(conv, effectiveConfig.GetSendingWindowSize(), effectiveConfig.GetReceivingWindowSize(), conn.writeBufferSize, authWriter)
+	conn.kcp = NewKCP(conv, authWriter)
 	conn.kcp.NoDelay(effectiveConfig.Tti, 2, effectiveConfig.Congestion)
 	conn.kcp.current = conn.Elapsed()
 

+ 6 - 6
transport/internet/kcp/kcp.go

@@ -65,22 +65,22 @@ type KCP struct {
 
 // NewKCP create a new kcp control object, 'conv' must equal in two endpoint
 // from the same connection.
-func NewKCP(conv uint16, sendingWindowSize uint32, receivingWindowSize uint32, sendingQueueSize uint32, output *AuthenticationWriter) *KCP {
+func NewKCP(conv uint16, output *AuthenticationWriter) *KCP {
 	log.Debug("KCP|Core: creating KCP ", conv)
 	kcp := new(KCP)
 	kcp.conv = conv
-	kcp.snd_wnd = sendingWindowSize
-	kcp.rcv_wnd = receivingWindowSize
+	kcp.snd_wnd = effectiveConfig.GetSendingWindowSize()
+	kcp.rcv_wnd = effectiveConfig.GetReceivingWindowSize()
 	kcp.rmt_wnd = IKCP_WND_RCV
 	kcp.mss = output.Mtu() - DataSegmentOverhead
 	kcp.rx_rto = IKCP_RTO_DEF
 	kcp.interval = IKCP_INTERVAL
 	kcp.output = NewSegmentWriter(output)
-	kcp.rcv_buf = NewReceivingWindow(receivingWindowSize)
-	kcp.snd_queue = NewSendingQueue(sendingQueueSize)
+	kcp.rcv_buf = NewReceivingWindow(effectiveConfig.GetReceivingWindowSize())
+	kcp.snd_queue = NewSendingQueue(effectiveConfig.GetSendingQueueSize())
 	kcp.rcv_queue = NewReceivingQueue()
 	kcp.acklist = NewACKList(kcp)
-	kcp.snd_buf = NewSendingWindow(kcp, sendingWindowSize)
+	kcp.snd_buf = NewSendingWindow(kcp, effectiveConfig.GetSendingWindowSize())
 	kcp.cwnd = kcp.snd_wnd
 	return kcp
 }

+ 1 - 1
transport/internet/kcp/receiving.go

@@ -67,7 +67,7 @@ type ReceivingQueue struct {
 
 func NewReceivingQueue() *ReceivingQueue {
 	return &ReceivingQueue{
-		queue: make(chan *alloc.Buffer, effectiveConfig.ReadBuffer/effectiveConfig.Mtu),
+		queue: make(chan *alloc.Buffer, effectiveConfig.GetReceivingQueueSize()),
 	}
 }