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
- func DialKCP(src v2net.Address, dest v2net.Destination) (internet.Connection, error)
- func ListenKCP(address v2net.Address, port v2net.Port) (internet.Listener, error)
- type AckList
- type AckSegment
- type AuthenticationWriter
- type Authenticator
- type BufferedSegmentWriter
- type CmdOnlySegment
- type Config
- type Connection
- func (this *Connection) Close() error
- func (this *Connection) Elapsed() uint32
- func (this *Connection) FetchInputFrom(conn net.Conn)
- func (this *Connection) LocalAddr() net.Addr
- 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) SetWriteDeadline(t time.Time) error
- func (this *Connection) Terminate()
- func (this *Connection) Write(b []byte) (int, error)
- type DataSegment
- type ISegment
- type KCP
- type Listener
- 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()
- func (this *ReceivingWorker) PingNecessary() bool
- func (this *ReceivingWorker) ProcessSegment(seg *DataSegment)
- func (this *ReceivingWorker) ProcessSendingNext(number uint32)
- func (this *ReceivingWorker) Read(b []byte) (int, error)
- func (this *ReceivingWorker) SetReadDeadline(t time.Time)
- func (this *ReceivingWorker) Write(seg ISegment)
- type SegmentCommand
- 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)
- func (this *SendingWindow) HandleFastAck(number uint32)
- func (this *SendingWindow) Len() int
- func (this *SendingWindow) Push(seg *DataSegment)
- func (this *SendingWindow) Remove(idx uint32)
- type SendingWorker
- func (this *SendingWorker) CloseWrite()
- func (this *SendingWorker) FindFirstUnacknowledged()
- func (this *SendingWorker) Flush()
- func (this *SendingWorker) OnPacketLoss(lost bool)
- func (this *SendingWorker) PingNecessary() bool
- func (this *SendingWorker) ProcessAck(number uint32)
- func (this *SendingWorker) ProcessAckSegment(seg *AckSegment)
- func (this *SendingWorker) ProcessReceivingNext(nextNumber uint32)
- func (this *SendingWorker) Push(b []byte) int
- func (this *SendingWorker) Write(seg ISegment)
- type SimpleAuthenticator
- type State
- type Writer
Constants ¶
const (
DataSegmentOverhead = 18
)
Variables ¶
This section is empty.
Functions ¶
func DialKCP ¶
func DialKCP(src v2net.Address, dest v2net.Destination) (internet.Connection, error)
Types ¶
type AckList ¶
func NewAckList ¶
func NewAckList(writer SegmentWriter) *AckList
type AckSegment ¶
type AckSegment struct { Conv uint16 Opt SegmentOption ReceivingWindow uint32 ReceivingNext uint32 Count byte NumberList []uint32 TimestampList []uint32 }
func (*AckSegment) ByteSize ¶
func (this *AckSegment) ByteSize() int
func (*AckSegment) Bytes ¶
func (this *AckSegment) Bytes(b []byte) []byte
func (*AckSegment) Release ¶
func (this *AckSegment) Release()
type AuthenticationWriter ¶
type AuthenticationWriter struct { Authenticator Authenticator Writer io.Writer }
func (*AuthenticationWriter) Mtu ¶
func (this *AuthenticationWriter) Mtu() uint32
func (*AuthenticationWriter) Release ¶
func (this *AuthenticationWriter) Release()
type Authenticator ¶
type Authenticator interface { HeaderSize() int // Encrypt encrypts the whole block in src into dst. // Dst and src may point at the same memory. Seal(buffer *alloc.Buffer) // Decrypt decrypts the whole block in src into dst. // Dst and src may point at the same memory. Open(buffer *alloc.Buffer) bool }
func NewSimpleAuthenticator ¶
func NewSimpleAuthenticator() Authenticator
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 ISegment)
type CmdOnlySegment ¶
type CmdOnlySegment struct { Conv uint16 Cmd SegmentCommand Opt SegmentOption SendingNext uint32 ReceivinNext uint32 }
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 }
func DefaultConfig ¶
func DefaultConfig() Config
func (*Config) GetReceivingQueueSize ¶
func (*Config) GetReceivingWindowSize ¶
func (*Config) GetSendingQueueSize ¶
func (*Config) GetSendingWindowSize ¶
type Connection ¶
Connection is a KCP connection over UDP.
func NewConnection ¶
func NewConnection(conv uint16, writerCloser io.WriteCloser, local *net.UDPAddr, remote *net.UDPAddr, block 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 net.Conn)
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) 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) SetWriteDeadline ¶
func (this *Connection) SetWriteDeadline(t time.Time) error
SetWriteDeadline implements the Conn SetWriteDeadline method.
func (*Connection) Terminate ¶
func (this *Connection) Terminate()
type DataSegment ¶
type DataSegment struct { Conv uint16 Opt SegmentOption Timestamp uint32 Number uint32 SendingNext uint32 Data *alloc.Buffer // contains filtered or unexported fields }
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 ISegment ¶
type ISegment interface { common.Releasable ByteSize() int Bytes([]byte) []byte }
func ReadSegment ¶
type KCP ¶
type KCP struct {
// contains filtered or unexported fields
}
KCP defines a single KCP connection
func NewKCP ¶
func NewKCP(conv uint16, output *AuthenticationWriter) *KCP
NewKCP create a new kcp control object, 'conv' must equal in two endpoint from the same connection.
func (*KCP) HandleOption ¶
func (kcp *KCP) HandleOption(opt SegmentOption)
func (*KCP) OnPeerClosed ¶
func (kcp *KCP) OnPeerClosed()
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) 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 ¶
func NewReceivingQueue ¶
func NewReceivingQueue(size uint32) *ReceivingQueue
func (*ReceivingQueue) Close ¶
func (this *ReceivingQueue) Close()
func (*ReceivingQueue) SetReadDeadline ¶
func (this *ReceivingQueue) SetReadDeadline(t time.Time) error
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 ¶
type ReceivingWorker struct {
// contains filtered or unexported fields
}
func NewReceivingWorker ¶
func NewReceivingWorker(kcp *KCP) *ReceivingWorker
func (*ReceivingWorker) CloseRead ¶
func (this *ReceivingWorker) CloseRead()
func (*ReceivingWorker) Flush ¶
func (this *ReceivingWorker) Flush()
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) SetReadDeadline ¶
func (this *ReceivingWorker) SetReadDeadline(t time.Time)
func (*ReceivingWorker) Write ¶
func (this *ReceivingWorker) Write(seg ISegment)
type SegmentCommand ¶
type SegmentCommand byte
const ( SegmentCommandACK SegmentCommand = 0 SegmentCommandData SegmentCommand = 1 SegmentCommandTerminated SegmentCommand = 2 SegmentCommandPing SegmentCommand = 3 )
type SegmentWriter ¶
type SegmentWriter interface {
Write(seg ISegment)
}
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) Len ¶
func (this *SendingQueue) Len() uint32
func (*SendingQueue) Pop ¶
func (this *SendingQueue) Pop() *DataSegment
func (*SendingQueue) Push ¶
func (this *SendingQueue) Push(seg *DataSegment)
type SendingWindow ¶
type SendingWindow struct {
// contains filtered or unexported fields
}
func NewSendingWindow ¶
func NewSendingWindow(size uint32, writer SegmentWriter, onPacketLoss func(bool)) *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)
func (*SendingWindow) HandleFastAck ¶
func (this *SendingWindow) HandleFastAck(number uint32)
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)
type SendingWorker ¶
func NewSendingWorker ¶
func NewSendingWorker(kcp *KCP) *SendingWorker
func (*SendingWorker) CloseWrite ¶
func (this *SendingWorker) CloseWrite()
func (*SendingWorker) FindFirstUnacknowledged ¶
func (this *SendingWorker) FindFirstUnacknowledged()
@Private
func (*SendingWorker) Flush ¶
func (this *SendingWorker) Flush()
func (*SendingWorker) OnPacketLoss ¶
func (this *SendingWorker) OnPacketLoss(lost bool)
func (*SendingWorker) PingNecessary ¶
func (this *SendingWorker) PingNecessary() bool
func (*SendingWorker) ProcessAck ¶
func (this *SendingWorker) ProcessAck(number uint32)
func (*SendingWorker) ProcessAckSegment ¶
func (this *SendingWorker) ProcessAckSegment(seg *AckSegment)
func (*SendingWorker) ProcessReceivingNext ¶
func (this *SendingWorker) ProcessReceivingNext(nextNumber uint32)
func (*SendingWorker) Push ¶
func (this *SendingWorker) Push(b []byte) int
func (*SendingWorker) Write ¶
func (this *SendingWorker) Write(seg ISegment)
type SimpleAuthenticator ¶
type SimpleAuthenticator struct{}
func (*SimpleAuthenticator) HeaderSize ¶
func (this *SimpleAuthenticator) HeaderSize() int
func (*SimpleAuthenticator) Seal ¶
func (this *SimpleAuthenticator) Seal(buffer *alloc.Buffer)