The NKN message protocol isn’t reliable wiki - networking reliability which is fine in some cases (offers better performance, lower latency), but some use cases might need a reliable protocol implemented by client SDKs.
Current message protobuf encoding (simplified) is as follows:
Message { Recipient; EncryptedPayload { UseEncryption YES/NO; enc( Payload(Type; Data ) } }
where Type
can denote difference between BIN/TEXT/ACK packet.
I suggest a change that Payload
would contain not just Data
itself but split to Header(s)
and Body
where Header(s) can contain service information about the protocol state and if TCP like transport layer is used or not. (As well as other useful information)
User should be able to choose if they want the SDK to handle (initiate) connection that handles resending dropped packets, managing packet order, or both. Possibly with user-selectable hyperparameters, if they want to optimize for higher transfer speed or latency/session initiation. On incoming connection, the SDK would just continue using whatever type was used.
We will have to find a way to name things correctly to avoid confusion with the session mode (when released), that will create a direct tunnel and keep this session with one node only, not with one client using messages.
Possible Header
types:
-
MessageType
(as currently implemented) -
ControlFlow
{ Control = NOTHING | DROPS | ORDER_AND_DROPS; some control bits required for this transfer (TCP protocol for inspiration) }
When noControlFlow
header is prvided, one withControl = NOTHING
is assumed.Control = NOTHING
will not require any additional parameters
What are your thought/requirements for this protocol?