mirror of
https://github.com/skywind3000/kcp.git
synced 2025-03-22 07:22:59 +08:00
update protocol specification
This commit is contained in:
parent
d104728e3a
commit
5c5108a612
65
protocol.txt
Normal file
65
protocol.txt
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
KCP PROTOCOL SPECIFICATION
|
||||||
|
|
||||||
|
|
||||||
|
1. Packet (aka. segment) Structure
|
||||||
|
|
||||||
|
KCP has only one kind of segment: both the data and control messages are
|
||||||
|
encoded into the same structure and share the same header.
|
||||||
|
|
||||||
|
The KCP packet (aka. segment) structure is as following:
|
||||||
|
|
||||||
|
0 4 5 6 8 (BYTE)
|
||||||
|
+---------------+---+---+-------+
|
||||||
|
| conv |cmd|frg| wnd |
|
||||||
|
+---------------+---+---+-------+ 8
|
||||||
|
| ts | sn |
|
||||||
|
+---------------+---------------+ 16
|
||||||
|
| una | len |
|
||||||
|
+---------------+---------------+ 24
|
||||||
|
| |
|
||||||
|
| DATA (optional) |
|
||||||
|
| |
|
||||||
|
+-------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
- conv: conversation id (32 bits integer)
|
||||||
|
|
||||||
|
The conversation id is used to identify each connection, which will not change
|
||||||
|
during the connection life-time.
|
||||||
|
|
||||||
|
It is represented by a 32 bits integer which is given at the moment the KCP
|
||||||
|
control block (aka. struct ikcpcb, or kcp object) has been created. Each
|
||||||
|
packet sent out will carry the conversation id in the first 4 bytes and a
|
||||||
|
packet from remote endpoint will not be accepted if it has a different
|
||||||
|
conversation id.
|
||||||
|
|
||||||
|
The value can be any random number, but in practice, both side between a
|
||||||
|
connection will have many KCP objects (or control block) storing in the
|
||||||
|
containers like a map or an array. A index is used as the key to look up one
|
||||||
|
KCP object from the container.
|
||||||
|
|
||||||
|
So, the higher 16 bits of conversation id can be used as caller's index while
|
||||||
|
the lower 16 bits can be used as callee's index. KCP will not handle
|
||||||
|
handshake, and the index in both side can be decided and exchanged after
|
||||||
|
connection establish.
|
||||||
|
|
||||||
|
When you receive and accept a remote packet, the local index can be extracted
|
||||||
|
from the conversation id and the kcp object which is in charge of this
|
||||||
|
connection can be find out from your map or array.
|
||||||
|
|
||||||
|
|
||||||
|
- cmd: command
|
||||||
|
|
||||||
|
- frg: fragment count
|
||||||
|
|
||||||
|
- wnd: window size
|
||||||
|
|
||||||
|
- ts: timestamp
|
||||||
|
|
||||||
|
- sn: serial number
|
||||||
|
|
||||||
|
- una: un-acknowledged serial number
|
||||||
|
|
||||||
|
|
||||||
|
# vim: set ts=4 sw=4 tw=0 noet cc=78 wrap textwidth=78 :
|
||||||
|
|
Loading…
Reference in New Issue
Block a user