mirror of
https://github.com/XTLS/Xray-docs-next.git
synced 2025-01-20 09:41:41 +03:00
46bccd3fdb
* Translate into English * Translate to English * Translate dev into English * Translate dev, second edition * Translating dev, doc, second edition
93 lines
4.0 KiB
Markdown
93 lines
4.0 KiB
Markdown
# mKCP Protocol
|
|
|
|
mKCP is a stream transfer protocol, modified from the [KCP protocol](https://github.com/skywind3000/kcp), 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](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) 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
|