You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Xray-docs-next/docs/en/development/protocols/mkcp.md

4.0 KiB

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

  1. 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.
  2. 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.
  3. 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