mirror of https://github.com/v2ray/v2ray-core
KCP: comments
parent
29e9473026
commit
0f368f8139
|
@ -17,6 +17,13 @@ func (this *Config) Apply() error {
|
||||||
enableKcp = this.enableKcp
|
enableKcp = this.enableKcp
|
||||||
if enableKcp {
|
if enableKcp {
|
||||||
KcpConfig = this.kcpConfig
|
KcpConfig = this.kcpConfig
|
||||||
|
/*
|
||||||
|
KCP do not support connectionReuse,
|
||||||
|
it is mandatory to set connectionReuse to false
|
||||||
|
Since KCP have no handshake and
|
||||||
|
does not SlowStart, there isn't benefit to
|
||||||
|
use that anyway.
|
||||||
|
*/
|
||||||
connectionReuse = false
|
connectionReuse = false
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -48,6 +48,11 @@ func (kvl *KCPVlistener) Accept() (net.Conn, error) {
|
||||||
} else {
|
} else {
|
||||||
kvl.previousSocketid_mapid++
|
kvl.previousSocketid_mapid++
|
||||||
kvl.previousSocketid[kvl.previousSocketid_mapid] = conn.GetConv()
|
kvl.previousSocketid[kvl.previousSocketid_mapid] = conn.GetConv()
|
||||||
|
/*
|
||||||
|
Here we assume that count(connection) < 512
|
||||||
|
This won't always true.
|
||||||
|
More work might be necessary to deal with this in a better way.
|
||||||
|
*/
|
||||||
if kvl.previousSocketid_mapid >= 512 {
|
if kvl.previousSocketid_mapid >= 512 {
|
||||||
delete(kvl.previousSocketid, kvl.previousSocketid_mapid-512)
|
delete(kvl.previousSocketid, kvl.previousSocketid_mapid-512)
|
||||||
}
|
}
|
||||||
|
@ -93,6 +98,11 @@ func (kcpvc *KCPVconn) Write(b []byte) (int, error) {
|
||||||
kcpvc.hc.SetDeadline(kcpvc.conntokeep)
|
kcpvc.hc.SetDeadline(kcpvc.conntokeep)
|
||||||
return kcpvc.hc.Write(b)
|
return kcpvc.hc.Write(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*ApplyConf will apply kcpvc.conf to current Socket
|
||||||
|
|
||||||
|
It is recommmanded to call this func once and only once
|
||||||
|
*/
|
||||||
func (kcpvc *KCPVconn) ApplyConf() error {
|
func (kcpvc *KCPVconn) ApplyConf() error {
|
||||||
nodelay, interval, resend, nc := 0, 40, 0, 0
|
nodelay, interval, resend, nc := 0, 40, 0, 0
|
||||||
if kcpvc.conf.Mode != "manual" {
|
if kcpvc.conf.Mode != "manual" {
|
||||||
|
@ -121,6 +131,10 @@ func (kcpvc *KCPVconn) ApplyConf() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*Close Close the current conn
|
||||||
|
We have to delay the close of Socket for a few second
|
||||||
|
or the VMess EOF can be too late to send.
|
||||||
|
*/
|
||||||
func (kcpvc *KCPVconn) Close() error {
|
func (kcpvc *KCPVconn) Close() error {
|
||||||
go func() {
|
go func() {
|
||||||
time.Sleep(2000 * time.Millisecond)
|
time.Sleep(2000 * time.Millisecond)
|
||||||
|
|
|
@ -1,5 +1,34 @@
|
||||||
package kcpv
|
package kcpv
|
||||||
|
|
||||||
|
/*AdvancedConfig define behavior of KCP in detail
|
||||||
|
|
||||||
|
MaximumTransmissionUnit:
|
||||||
|
Largest protocol data unit that the layer can pass onwards
|
||||||
|
can be discovered by running tracepath
|
||||||
|
|
||||||
|
SendingWindowSize , ReceivingWindowSize:
|
||||||
|
the size of Tx/Rx window, by packet
|
||||||
|
|
||||||
|
ForwardErrorCorrectionGroupSize:
|
||||||
|
The the size of packet to generate a Forward Error Correction
|
||||||
|
packet, this is used to counteract packet loss.
|
||||||
|
|
||||||
|
AcknowledgeNoDelay:
|
||||||
|
Do not wait a certain of time before sending the ACK packet,
|
||||||
|
increase bandwich cost and might increase performance
|
||||||
|
|
||||||
|
Dscp:
|
||||||
|
Differentiated services code point,
|
||||||
|
be used to reconized to discriminate packet.
|
||||||
|
It is recommanded to keep it 0 to avoid being detected.
|
||||||
|
|
||||||
|
ReadTimeout,WriteTimeout:
|
||||||
|
Close the Socket if it have been silent for too long,
|
||||||
|
Small value can recycle zombie socket faster but
|
||||||
|
can cause v2ray to kill the proxy connection it is relaying,
|
||||||
|
Higher value can prevent server from closing zombie socket and
|
||||||
|
waste resources.
|
||||||
|
*/
|
||||||
type AdvancedConfig struct {
|
type AdvancedConfig struct {
|
||||||
Mtu int `json:"MaximumTransmissionUnit"`
|
Mtu int `json:"MaximumTransmissionUnit"`
|
||||||
Sndwnd int `json:"SendingWindowSize"`
|
Sndwnd int `json:"SendingWindowSize"`
|
||||||
|
@ -11,6 +40,20 @@ type AdvancedConfig struct {
|
||||||
WriteTimeout int `json:"WriteTimeout"`
|
WriteTimeout int `json:"WriteTimeout"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*Config define basic behavior of KCP
|
||||||
|
Mode:
|
||||||
|
can be one of these values:
|
||||||
|
fast3,fast2,fast,normal
|
||||||
|
<<<<<<- less delay
|
||||||
|
->>>>>> less bandwich wasted
|
||||||
|
|
||||||
|
EncryptionKey:
|
||||||
|
a string that will be the EncryptionKey of
|
||||||
|
All KCP connection we Listen-Accpet or
|
||||||
|
Dial, We are not very sure about how this
|
||||||
|
encryption hehave and DO use a unique randomly
|
||||||
|
generated key.
|
||||||
|
*/
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Mode string `json:"Mode"`
|
Mode string `json:"Mode"`
|
||||||
Key string `json:"EncryptionKey"`
|
Key string `json:"EncryptionKey"`
|
||||||
|
@ -18,5 +61,5 @@ type Config struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
var DefaultAdvancedConfigs = &AdvancedConfig{
|
var DefaultAdvancedConfigs = &AdvancedConfig{
|
||||||
Mtu: 1350, Sndwnd: 1024, Rcvwnd: 1024, Fec: 4, Dscp: 0, ReadTimeout: 18600, WriteTimeout: 18500, Acknodelay: false,
|
Mtu: 1350, Sndwnd: 1024, Rcvwnd: 1024, Fec: 4, Dscp: 0, ReadTimeout: 600, WriteTimeout: 500, Acknodelay: false,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue