mKCP Protocol
mKCP is a stream transfer protocol, modified from the KCP protocol, which can transmit any data stream in order.
Version
mKCP has no version number and does not guarantee compatibility between versions.
Dependencies
Underlying Protocol
mKCP is a protocol based on UDP, and all communication uses UDP transmission.
Functions
- fnv: FNV-1a hash function
- Takes a string of arbitrary length as input parameter;
- Outputs a 32-bit unsigned integer.
Communication Process
- mKCP splits data streams into several data packets for transmission. Each data stream has a unique identifier to distinguish it from other data streams. Each data packet in the data stream carries the same identifier.
- mKCP does not have a handshake process. When receiving a data packet, it determines whether it is a new call or an ongoing call based on the identifier of the data stream it carries.
- Each data packet contains several segments (Segment), which are divided into three types: data (Data), acknowledgment (ACK), and heartbeat (Ping). Each segment needs to be processed separately.
Data Format
Data Packet
4 Bytes | 2 Bytes | L Bytes |
---|---|---|
Auth A | Data Len L | Fragment |
as which:
- Authentication information A = fnv(fragment), big endian;
- The fragment may contain multiple sections.
Data snippet
2 bytes | 1 byte | 1 byte | 4 bytes | 4 bytes | 4 bytes | 2 bytes | Len bytes |
---|---|---|---|---|---|---|---|
Conv flag | Cmd flag | Opt flag | Timestamp | Sequence | Unacknowledged | Len flag | Data |
as which:
- Identifier Conv: Identifier for mKCP data stream
- Command Cmd: Constant 0x01
- Option Opt: Optional values include:
- 0x00: Empty option
- 0x01: Opposite party has sent all data
- Timestamp Ts: Time when the current segment was sent from the remote end, big endian
- Sequence Number Sn: The position of the data segment in the data stream, the sequence number of the starting segment is 0, and each new segment is sequentially added by 1
- Unacknowledged Sequence Number Una: The minimum Sn that the remote host is sending and has not yet received confirmation.
Confirmation snippet
2 bytes | 1 byte | 1 byte | 4 bytes | 4 bytes | 4 bytes | 2 bytes | Len * 4 bytes |
---|---|---|---|---|---|---|---|
Conv ID | Cmd | Opt | Wnd | Next Seq Number | Timestamp | Length | Received Seq Number |
as which:
- Identifier Conv: Identifier of the mKCP data stream
- Command Cmd: Constant 0x00
- Option Opt: Same as above
- Window Wnd: The maximum sequence number that the remote host can receive
- Next receive sequence number Sn: The smallest sequence number of the data segment that the remote host has not received
- Timestamp Ts: The timestamp of the latest received data segment by the remote host, which can be used to calculate the delay
- Received sequence numbers: Each 4 bytes, indicating that the data of this sequence number has been confirmed received.
as which:
- The remote host expects to receive data within the serial number [Sn, Wnd) range.
Heartbeat Fragments
2 Bytes | 1 Byte | 1 Byte | 4 Bytes | 4 Bytes | 4 Bytes |
---|---|---|---|---|---|
Conv ID | Cmd | Opt | Unacknowledged Seq No | Next Receive Seq No | Rto |
as which:
- Identifier Conv: Identifier for the mKCP data stream
- Command Cmd: Optional values include:
- 0x02: Remote host forcibly terminates the session
- 0x03: Normal heartbeat
- Option Opt: Same as above
- Unacknowledged sequence number Una: Same as the Una of the data fragment
- Next receive sequence number Sn: Same as the Sn of the acknowledgement fragment
- Delay Rto: Delay calculated by the remote host itself