kcp

package
v1.13.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 1, 2023 License: GPL-3.0, MIT Imports: 13 Imported by: 0

Documentation

Overview

Package kcp is imported from https://github.com/xtaci/kcp-go

Index

Constants

View Source
const (

	// Overall outer header size needed by data encryption.
	OuterHeaderSize = cipher.DefaultOverhead + cipher.DefaultNonceSize

	// Maximum packet buffer size.
	MaxBufSize = 1500

	// Maximum MTU of UDP packet. UDP overhead is 8 bytes, IP overhead is maximum 40 bytes.
	MaxMTU = MaxBufSize - 48

	IKCP_CMD_VER     = 0                   // version of command set
	IKCP_CMD_MAX_VER = 7                   // maximum version of command set
	IKCP_CMD_MAX_NUM = 15                  // maximum command number
	IKCP_CMD_PUSH    = 1 + IKCP_CMD_VER<<5 // cmd: send data
	IKCP_CMD_ACK     = 2 + IKCP_CMD_VER<<5 // cmd: acknowledge of a received packet
	IKCP_CMD_WASK    = 3 + IKCP_CMD_VER<<5 // cmd: ask remote window size
	IKCP_CMD_WINS    = 4 + IKCP_CMD_VER<<5 // cmd: reply my window size

	IKCP_ASK_SEND = 1 // need to send IKCP_CMD_WASK
	IKCP_ASK_TELL = 2 // need to send IKCP_CMD_WINS

	IKCP_WND_SND_MIN = 32    // minimum send window size (number of packets)
	IKCP_WND_SND_MAX = 65535 // maximum send window size (number of packets)
	IKCP_WND_RCV     = 65535 // maximum receive window size (number of packets)

	IKCP_MTU_DEF = MaxMTU - OuterHeaderSize // KCP MTU

	IKCP_ACK_FAST       = 3    // do retransmission after receiving the number of out of order ACK
	IKCP_INTERVAL       = 10   // event loop interval in milliseconds
	IKCP_PROBE_INTERVAL = 1000 // window probe interval in milliseconds
	IKCP_DEADLINK       = 30   // number of retransmissions before link is dead

	IKCP_OVERHEAD         = 24 // size of KCP header
	IKCP_SN_OFFSET        = 12 // offset to get sequence number in KCP header
	IKCP_TOTAL_LEN_OFFSET = 22 // offset to get segment total length (data + padding)
)

Variables

View Source
var (
	// Number of KCP bytes sent for upper level.
	BytesSent = metrics.RegisterMetric("KCP", "BytesSent")

	// Number of KCP bytes received from lower level.
	BytesReceived = metrics.RegisterMetric("KCP", "BytesReceived")

	// Number of incoming segments.
	InSegs = metrics.RegisterMetric("KCP", "InSegs")

	// Number of outgoing segments.
	OutSegs = metrics.RegisterMetric("KCP", "OutSegs")

	// Number of repeated segments.
	RepeatSegs = metrics.RegisterMetric("KCP", "RepeatSegs")

	// Number of lost segments.
	LostSegs = metrics.RegisterMetric("KCP", "LostSegs")

	// Number of out of window segments.
	OutOfWindowSegs = metrics.RegisterMetric("KCP", "OutOfWindowSegs")

	// Number of fast retransmission segments.
	FastRetransSegs = metrics.RegisterMetric("KCP", "FastRetransSegs")

	// Number of total retransmission segments.
	RetransSegs = metrics.RegisterMetric("KCP", "RetransSegs")
)
View Source
var (
	// PktCachePool is a system-wide packet buffer shared among sending, receiving to mitigate
	// high-frequency memory allocation for packets.
	PktCachePool slicepool.SlicePool
)

Functions

func Command2Str

func Command2Str(cmd int) string

Command2Str returns the display name of the KCP command.

Types

type KCP

type KCP struct {
	// contains filtered or unexported fields
}

KCP defines a single KCP connection.

func NewKCP

func NewKCP(conv uint32, output outputCallback) *KCP

NewKCP create a new kcp state machine.

'conv' must be equal in the connection peers, or else data will be silently rejected.

'output' function will be called whenever these is data to be sent on wire.

func (*KCP) ConversationID

func (kcp *KCP) ConversationID() uint32

func (*KCP) Input

func (kcp *KCP) Input(data []byte, ackNoDelay bool) error

Input a packet into kcp state machine, by underlay protocol.

'ackNoDelay' will trigger immediate ACK, but surely it will not be efficient in bandwidth.

func (*KCP) LastInputTime

func (kcp *KCP) LastInputTime() time.Time

func (*KCP) LastOutputTime

func (kcp *KCP) LastOutputTime() time.Time

func (*KCP) MSS

func (kcp *KCP) MSS() uint32

func (*KCP) Output

func (kcp *KCP) Output(ackOnly bool) uint32

Output sends our accumulated data to the remote. Returns the time duration (in milliseconds) that next `Output` should be called.

func (*KCP) PeekSize

func (kcp *KCP) PeekSize() (length int)

PeekSize checks the size of next message in the recv queue. It includes all the fragments of the message. Return 0 if the message has length 0 but recv queue is not empty. Return -1 if recv queue is empty.

func (*KCP) Recv

func (kcp *KCP) Recv(buffer []byte) (n int, err error)

Upper layer receives data from kcp state machine. The received data is copied into the buffer provided by caller. The buffer must be big enough to hold input KCP message (which may have multiple fragments).

Return number of bytes read, or -1 on error.

func (*KCP) RecvWindow

func (kcp *KCP) RecvWindow() uint32

func (*KCP) ReleaseTX

func (kcp *KCP) ReleaseTX()

ReleaseTX releases all cached outgoing segments.

func (*KCP) RemoteWindow

func (kcp *KCP) RemoteWindow() uint32

func (*KCP) ReserveBytes

func (kcp *KCP) ReserveBytes(n int) bool

ReserveBytes keeps n bytes untouched from the beginning of the buffer, the outputCallback function should be aware of this.

Return false if n >= mss

func (*KCP) Send

func (kcp *KCP) Send(buffer []byte) error

Upper layer sends data to kcp state machine.

func (*KCP) SendHeartbeat

func (kcp *KCP) SendHeartbeat()

Send a heartbeat packet to remote to update remote's lastInputTime. This is implemented by asking KCP to probe the remote window size.

func (*KCP) SendWindow

func (kcp *KCP) SendWindow() uint32

func (*KCP) SetMtu

func (kcp *KCP) SetMtu(mtu int) error

SetMtu changes MTU size.

func (*KCP) SetPollIntervalMs added in v1.12.0

func (kcp *KCP) SetPollIntervalMs(interval uint32)

SetPollIntervalMs set KCP polling interval in milliseconds.

func (*KCP) SetStreamMode

func (kcp *KCP) SetStreamMode(mode bool)

func (*KCP) StreamMode

func (kcp *KCP) StreamMode() bool

func (*KCP) WaitSendSize

func (kcp *KCP) WaitSendSize() int

WaitSendSize gets how many packet is waiting to be sent.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL