Documentation ¶
Overview ¶
Package kcp - A Fast and Reliable ARQ Protocol
Acknowledgement:
skywind3000@github for inventing the KCP protocol xtaci@github for translating to Golang
Index ¶
- Constants
- Variables
- func AllocateBuffer() *alloc.Buffer
- func DialKCP(src v2net.Address, dest v2net.Destination) (internet.Connection, error)
- func ListenKCP(address v2net.Address, port v2net.Port) (internet.Listener, error)
- func NewSimpleAuthenticator() internet.Authenticator
- type AckList
- type AckSegment
- type AuthenticationWriter
- type Buffer
- type BufferedSegmentWriter
- type CmdOnlySegment
- type Command
- type Config
- func (this *Config) Apply()
- func (this *Config) GetAuthenticator() (internet.Authenticator, error)
- func (this *Config) GetReceivingQueueSize() uint32
- func (this *Config) GetReceivingWindowSize() uint32
- func (this *Config) GetSendingInFlightSize() uint32
- func (this *Config) GetSendingQueueSize() uint32
- func (this *Config) GetSendingWindowSize() uint32
- type Connection
- func (this *Connection) Close() error
- func (this *Connection) Elapsed() uint32
- func (this *Connection) FetchInputFrom(conn io.Reader)
- func (this *Connection) HandleOption(opt SegmentOption)
- func (this *Connection) Input(data []byte) int
- func (this *Connection) LocalAddr() net.Addr
- func (this *Connection) OnPeerClosed()
- func (this *Connection) Read(b []byte) (int, error)
- func (this *Connection) RemoteAddr() net.Addr
- func (this *Connection) Reusable() bool
- func (this *Connection) SetDeadline(t time.Time) error
- func (this *Connection) SetReadDeadline(t time.Time) error
- func (this *Connection) SetReusable(b bool)
- func (this *Connection) SetState(state State)
- func (this *Connection) SetWriteDeadline(t time.Time) error
- func (this *Connection) State() State
- func (this *Connection) Terminate()
- func (this *Connection) Write(b []byte) (int, error)
- type DataSegment
- type Listener
- func (this *Listener) Accept() (internet.Connection, error)
- func (this *Listener) ActiveConnections() int
- func (this *Listener) Addr() net.Addr
- func (this *Listener) Close() error
- func (this *Listener) OnReceive(payload *alloc.Buffer, session *proxy.SessionInfo)
- func (this *Listener) Remove(dest string)
- type ReceivingQueue
- type ReceivingWindow
- func (this *ReceivingWindow) Advance()
- func (this *ReceivingWindow) Position(idx uint32) uint32
- func (this *ReceivingWindow) Remove(idx uint32) *DataSegment
- func (this *ReceivingWindow) RemoveFirst() *DataSegment
- func (this *ReceivingWindow) Set(idx uint32, value *DataSegment) bool
- func (this *ReceivingWindow) Size() uint32
- type ReceivingWorker
- func (this *ReceivingWorker) CloseRead()
- func (this *ReceivingWorker) Flush(current uint32)
- func (this *ReceivingWorker) MarkPingNecessary(b bool)
- func (this *ReceivingWorker) PingNecessary() bool
- func (this *ReceivingWorker) ProcessSegment(seg *DataSegment)
- func (this *ReceivingWorker) ProcessSendingNext(number uint32)
- func (this *ReceivingWorker) Read(b []byte) int
- func (this *ReceivingWorker) Write(seg Segment)
- type RoundTripInfo
- type Segment
- type SegmentOption
- type SegmentWriter
- type SendingQueue
- type SendingWindow
- func (this *SendingWindow) Clear(una uint32)
- func (this *SendingWindow) First() *DataSegment
- func (this *SendingWindow) Flush(current uint32, resend uint32, rto uint32, maxInFlightSize uint32)
- func (this *SendingWindow) HandleFastAck(number uint32)
- func (this *SendingWindow) IsEmpty() bool
- func (this *SendingWindow) IsFull() bool
- func (this *SendingWindow) Len() int
- func (this *SendingWindow) Push(seg *DataSegment)
- func (this *SendingWindow) Remove(idx uint32)
- func (this *SendingWindow) Size() uint32
- type SendingWorker
- func (this *SendingWorker) CloseWrite()
- func (this *SendingWorker) FillWindow(current uint32)
- func (this *SendingWorker) FindFirstUnacknowledged()
- func (this *SendingWorker) Flush(current uint32)
- func (this *SendingWorker) IsEmpty() bool
- func (this *SendingWorker) MarkPingNecessary(b bool)
- func (this *SendingWorker) OnPacketLoss(lossRate uint32)
- func (this *SendingWorker) PingNecessary() bool
- func (this *SendingWorker) ProcessAck(number uint32)
- func (this *SendingWorker) ProcessReceivingNext(nextNumber uint32)
- func (this *SendingWorker) ProcessReceivingNextWithoutLock(nextNumber uint32)
- func (this *SendingWorker) ProcessSegment(current uint32, seg *AckSegment)
- func (this *SendingWorker) Push(b []byte) int
- func (this *SendingWorker) Write(seg Segment)
- type SimpleAuthenticator
- type State
- type Writer
Constants ¶
const ( NumDistro = 5 DistroSize = 1600 )
const (
DataSegmentOverhead = 18
)
Variables ¶
Functions ¶
func AllocateBuffer ¶
func DialKCP ¶
func DialKCP(src v2net.Address, dest v2net.Destination) (internet.Connection, error)
func NewSimpleAuthenticator ¶
func NewSimpleAuthenticator() internet.Authenticator
Types ¶
type AckList ¶
type AckList struct {
// contains filtered or unexported fields
}
func NewAckList ¶
func NewAckList(writer SegmentWriter) *AckList
type AckSegment ¶
type AckSegment struct { Conv uint16 Option SegmentOption ReceivingWindow uint32 ReceivingNext uint32 Timestamp uint32 Count byte NumberList []uint32 }
func NewAckSegment ¶
func NewAckSegment() *AckSegment
func (*AckSegment) ByteSize ¶
func (this *AckSegment) ByteSize() int
func (*AckSegment) Bytes ¶
func (this *AckSegment) Bytes(b []byte) []byte
func (*AckSegment) IsFull ¶
func (this *AckSegment) IsFull() bool
func (*AckSegment) PutNumber ¶
func (this *AckSegment) PutNumber(number uint32)
func (*AckSegment) PutTimestamp ¶
func (this *AckSegment) PutTimestamp(timestamp uint32)
func (*AckSegment) Release ¶
func (this *AckSegment) Release()
type AuthenticationWriter ¶
type AuthenticationWriter struct { Authenticator internet.Authenticator Writer io.Writer }
func (*AuthenticationWriter) Mtu ¶
func (this *AuthenticationWriter) Mtu() uint32
func (*AuthenticationWriter) Release ¶
func (this *AuthenticationWriter) Release()
type Buffer ¶
func (*Buffer) ReleaseBuffer ¶
func (this *Buffer) ReleaseBuffer()
type BufferedSegmentWriter ¶
func NewSegmentWriter ¶
func NewSegmentWriter(writer *AuthenticationWriter) *BufferedSegmentWriter
func (*BufferedSegmentWriter) Flush ¶
func (this *BufferedSegmentWriter) Flush()
func (*BufferedSegmentWriter) FlushWithoutLock ¶
func (this *BufferedSegmentWriter) FlushWithoutLock()
func (*BufferedSegmentWriter) Write ¶
func (this *BufferedSegmentWriter) Write(seg Segment)
type CmdOnlySegment ¶
type CmdOnlySegment struct { Conv uint16 Command Command Option SegmentOption SendingNext uint32 ReceivinNext uint32 PeerRTO uint32 }
func NewCmdOnlySegment ¶
func NewCmdOnlySegment() *CmdOnlySegment
func (*CmdOnlySegment) ByteSize ¶
func (this *CmdOnlySegment) ByteSize() int
func (*CmdOnlySegment) Bytes ¶
func (this *CmdOnlySegment) Bytes(b []byte) []byte
func (*CmdOnlySegment) Release ¶
func (this *CmdOnlySegment) Release()
type Config ¶
type Config struct { Mtu uint32 // Maximum transmission unit Tti uint32 UplinkCapacity uint32 DownlinkCapacity uint32 Congestion bool WriteBuffer uint32 ReadBuffer uint32 HeaderType string HeaderConfig internet.AuthenticatorConfig }
func DefaultConfig ¶
func DefaultConfig() Config
func (*Config) GetAuthenticator ¶
func (this *Config) GetAuthenticator() (internet.Authenticator, error)
func (*Config) GetReceivingQueueSize ¶
func (*Config) GetReceivingWindowSize ¶
func (*Config) GetSendingInFlightSize ¶
func (*Config) GetSendingQueueSize ¶
func (*Config) GetSendingWindowSize ¶
type Connection ¶
type Connection struct {
// contains filtered or unexported fields
}
Connection is a KCP connection over UDP.
func NewConnection ¶
func NewConnection(conv uint16, writerCloser io.WriteCloser, local *net.UDPAddr, remote *net.UDPAddr, block internet.Authenticator) *Connection
NewConnection create a new KCP connection between local and remote.
func (*Connection) Elapsed ¶
func (this *Connection) Elapsed() uint32
func (*Connection) FetchInputFrom ¶
func (this *Connection) FetchInputFrom(conn io.Reader)
func (*Connection) HandleOption ¶
func (this *Connection) HandleOption(opt SegmentOption)
func (*Connection) Input ¶
func (this *Connection) Input(data []byte) int
Input when you received a low level packet (eg. UDP packet), call it
func (*Connection) LocalAddr ¶
func (this *Connection) LocalAddr() net.Addr
LocalAddr returns the local network address. The Addr returned is shared by all invocations of LocalAddr, so do not modify it.
func (*Connection) OnPeerClosed ¶
func (this *Connection) OnPeerClosed()
func (*Connection) Read ¶
func (this *Connection) Read(b []byte) (int, error)
Read implements the Conn Read method.
func (*Connection) RemoteAddr ¶
func (this *Connection) RemoteAddr() net.Addr
RemoteAddr returns the remote network address. The Addr returned is shared by all invocations of RemoteAddr, so do not modify it.
func (*Connection) Reusable ¶
func (this *Connection) Reusable() bool
func (*Connection) SetDeadline ¶
func (this *Connection) SetDeadline(t time.Time) error
SetDeadline sets the deadline associated with the listener. A zero time value disables the deadline.
func (*Connection) SetReadDeadline ¶
func (this *Connection) SetReadDeadline(t time.Time) error
SetReadDeadline implements the Conn SetReadDeadline method.
func (*Connection) SetReusable ¶
func (this *Connection) SetReusable(b bool)
func (*Connection) SetState ¶
func (this *Connection) SetState(state State)
func (*Connection) SetWriteDeadline ¶
func (this *Connection) SetWriteDeadline(t time.Time) error
SetWriteDeadline implements the Conn SetWriteDeadline method.
func (*Connection) State ¶
func (this *Connection) State() State
func (*Connection) Terminate ¶
func (this *Connection) Terminate()
type DataSegment ¶
type DataSegment struct { Conv uint16 Option SegmentOption Timestamp uint32 Number uint32 SendingNext uint32 Data *alloc.Buffer // contains filtered or unexported fields }
func NewDataSegment ¶
func NewDataSegment() *DataSegment
func (*DataSegment) ByteSize ¶
func (this *DataSegment) ByteSize() int
func (*DataSegment) Bytes ¶
func (this *DataSegment) Bytes(b []byte) []byte
func (*DataSegment) Release ¶
func (this *DataSegment) Release()
type Listener ¶
Listener defines a server listening for connections
func (*Listener) Accept ¶
func (this *Listener) Accept() (internet.Connection, error)
Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn.
func (*Listener) ActiveConnections ¶
func (*Listener) Addr ¶
Addr returns the listener's network address, The Addr returned is shared by all invocations of Addr, so do not modify it.
func (*Listener) Close ¶
Close stops listening on the UDP address. Already Accepted connections are not closed.
type ReceivingQueue ¶
type ReceivingQueue struct {
// contains filtered or unexported fields
}
func NewReceivingQueue ¶
func NewReceivingQueue(size uint32) *ReceivingQueue
func (*ReceivingQueue) Close ¶
func (this *ReceivingQueue) Close()
func (*ReceivingQueue) IsEmpty ¶
func (this *ReceivingQueue) IsEmpty() bool
func (*ReceivingQueue) IsFull ¶
func (this *ReceivingQueue) IsFull() bool
func (*ReceivingQueue) Put ¶
func (this *ReceivingQueue) Put(payload *alloc.Buffer)
func (*ReceivingQueue) Read ¶
func (this *ReceivingQueue) Read(buf []byte) int
type ReceivingWindow ¶
type ReceivingWindow struct {
// contains filtered or unexported fields
}
func NewReceivingWindow ¶
func NewReceivingWindow(size uint32) *ReceivingWindow
func (*ReceivingWindow) Advance ¶
func (this *ReceivingWindow) Advance()
func (*ReceivingWindow) Position ¶
func (this *ReceivingWindow) Position(idx uint32) uint32
func (*ReceivingWindow) Remove ¶
func (this *ReceivingWindow) Remove(idx uint32) *DataSegment
func (*ReceivingWindow) RemoveFirst ¶
func (this *ReceivingWindow) RemoveFirst() *DataSegment
func (*ReceivingWindow) Set ¶
func (this *ReceivingWindow) Set(idx uint32, value *DataSegment) bool
func (*ReceivingWindow) Size ¶
func (this *ReceivingWindow) Size() uint32
type ReceivingWorker ¶
func NewReceivingWorker ¶
func NewReceivingWorker(kcp *Connection) *ReceivingWorker
func (*ReceivingWorker) CloseRead ¶
func (this *ReceivingWorker) CloseRead()
func (*ReceivingWorker) Flush ¶
func (this *ReceivingWorker) Flush(current uint32)
func (*ReceivingWorker) MarkPingNecessary ¶
func (this *ReceivingWorker) MarkPingNecessary(b bool)
func (*ReceivingWorker) PingNecessary ¶
func (this *ReceivingWorker) PingNecessary() bool
func (*ReceivingWorker) ProcessSegment ¶
func (this *ReceivingWorker) ProcessSegment(seg *DataSegment)
func (*ReceivingWorker) ProcessSendingNext ¶
func (this *ReceivingWorker) ProcessSendingNext(number uint32)
func (*ReceivingWorker) Read ¶
func (this *ReceivingWorker) Read(b []byte) int
func (*ReceivingWorker) Write ¶
func (this *ReceivingWorker) Write(seg Segment)
type RoundTripInfo ¶
func (*RoundTripInfo) SmoothedTime ¶
func (this *RoundTripInfo) SmoothedTime() uint32
func (*RoundTripInfo) Timeout ¶
func (this *RoundTripInfo) Timeout() uint32
func (*RoundTripInfo) Update ¶
func (this *RoundTripInfo) Update(rtt uint32, current uint32)
func (*RoundTripInfo) UpdatePeerRTO ¶
func (this *RoundTripInfo) UpdatePeerRTO(rto uint32, current uint32)
type Segment ¶
type Segment interface { common.Releasable ByteSize() int Bytes([]byte) []byte }
func ReadSegment ¶
type SegmentWriter ¶
type SegmentWriter interface {
Write(seg Segment)
}
type SendingQueue ¶
type SendingQueue struct {
// contains filtered or unexported fields
}
func NewSendingQueue ¶
func NewSendingQueue(size uint32) *SendingQueue
func (*SendingQueue) Clear ¶
func (this *SendingQueue) Clear()
func (*SendingQueue) IsEmpty ¶
func (this *SendingQueue) IsEmpty() bool
func (*SendingQueue) IsFull ¶
func (this *SendingQueue) IsFull() bool
func (*SendingQueue) Last ¶
func (this *SendingQueue) Last() *alloc.Buffer
func (*SendingQueue) Len ¶
func (this *SendingQueue) Len() uint32
func (*SendingQueue) Pop ¶
func (this *SendingQueue) Pop() *alloc.Buffer
func (*SendingQueue) Push ¶
func (this *SendingQueue) Push(seg *alloc.Buffer)
type SendingWindow ¶
type SendingWindow struct {
// contains filtered or unexported fields
}
func NewSendingWindow ¶
func NewSendingWindow(size uint32, writer SegmentWriter, onPacketLoss func(uint32)) *SendingWindow
func (*SendingWindow) Clear ¶
func (this *SendingWindow) Clear(una uint32)
func (*SendingWindow) First ¶
func (this *SendingWindow) First() *DataSegment
func (*SendingWindow) Flush ¶
func (this *SendingWindow) Flush(current uint32, resend uint32, rto uint32, maxInFlightSize uint32)
func (*SendingWindow) HandleFastAck ¶
func (this *SendingWindow) HandleFastAck(number uint32)
func (*SendingWindow) IsEmpty ¶
func (this *SendingWindow) IsEmpty() bool
func (*SendingWindow) IsFull ¶
func (this *SendingWindow) IsFull() bool
func (*SendingWindow) Len ¶
func (this *SendingWindow) Len() int
func (*SendingWindow) Push ¶
func (this *SendingWindow) Push(seg *DataSegment)
func (*SendingWindow) Remove ¶
func (this *SendingWindow) Remove(idx uint32)
func (*SendingWindow) Size ¶
func (this *SendingWindow) Size() uint32
type SendingWorker ¶
func NewSendingWorker ¶
func NewSendingWorker(kcp *Connection) *SendingWorker
func (*SendingWorker) CloseWrite ¶
func (this *SendingWorker) CloseWrite()
func (*SendingWorker) FillWindow ¶
func (this *SendingWorker) FillWindow(current uint32)
func (*SendingWorker) FindFirstUnacknowledged ¶
func (this *SendingWorker) FindFirstUnacknowledged()
@Private
func (*SendingWorker) Flush ¶
func (this *SendingWorker) Flush(current uint32)
func (*SendingWorker) IsEmpty ¶
func (this *SendingWorker) IsEmpty() bool
func (*SendingWorker) MarkPingNecessary ¶
func (this *SendingWorker) MarkPingNecessary(b bool)
func (*SendingWorker) OnPacketLoss ¶
func (this *SendingWorker) OnPacketLoss(lossRate uint32)
func (*SendingWorker) PingNecessary ¶
func (this *SendingWorker) PingNecessary() bool
func (*SendingWorker) ProcessReceivingNext ¶
func (this *SendingWorker) ProcessReceivingNext(nextNumber uint32)
func (*SendingWorker) ProcessReceivingNextWithoutLock ¶
func (this *SendingWorker) ProcessReceivingNextWithoutLock(nextNumber uint32)
func (*SendingWorker) ProcessSegment ¶
func (this *SendingWorker) ProcessSegment(current uint32, seg *AckSegment)
func (*SendingWorker) Push ¶
func (this *SendingWorker) Push(b []byte) int
type SimpleAuthenticator ¶
type SimpleAuthenticator struct{}
func (*SimpleAuthenticator) Overhead ¶
func (this *SimpleAuthenticator) Overhead() int
func (*SimpleAuthenticator) Seal ¶
func (this *SimpleAuthenticator) Seal(buffer *alloc.Buffer)