mirror of
https://github.com/markqvist/Reticulum.git
synced 2024-11-22 21:50:18 +00:00
Updated docs
This commit is contained in:
parent
3856747e31
commit
00816b55bb
@ -630,9 +630,14 @@ Wire Format
|
|||||||
[HEADER 2 bytes] [ADDRESSES 10/20 bytes] [CONTEXT 1 byte] [DATA 0-477 bytes]
|
[HEADER 2 bytes] [ADDRESSES 10/20 bytes] [CONTEXT 1 byte] [DATA 0-477 bytes]
|
||||||
|
|
||||||
* The HEADER field is 2 bytes long.
|
* The HEADER field is 2 bytes long.
|
||||||
* Byte 1: [Header Type], [Propagation Type], [Destination Type] and [Packet Type]
|
* Byte 1: [IFAC Flag], [Header Type], [Propagation Type], [Destination Type] and [Packet Type]
|
||||||
* Byte 2: Number of hops
|
* Byte 2: Number of hops
|
||||||
|
|
||||||
|
* Interface Access Code field if the IFAC flag was set.
|
||||||
|
* The length of the Interface Access Code can vary from
|
||||||
|
1 to 64 bytes according to physical interface
|
||||||
|
capabilities and configuration.
|
||||||
|
|
||||||
* The ADDRESSES field contains either 1 or 2 addresses.
|
* The ADDRESSES field contains either 1 or 2 addresses.
|
||||||
* Each address is 10 bytes long.
|
* Each address is 10 bytes long.
|
||||||
* The Header Type flag in the HEADER field determines
|
* The Header Type flag in the HEADER field determines
|
||||||
@ -645,12 +650,16 @@ Wire Format
|
|||||||
* The DATA field is between 0 and 477 bytes.
|
* The DATA field is between 0 and 477 bytes.
|
||||||
* It contains the packets data payload.
|
* It contains the packets data payload.
|
||||||
|
|
||||||
|
IFAC Flag
|
||||||
|
-----------------
|
||||||
|
open 0 Packet for publically accessible interface
|
||||||
|
authenticated 1 Interface authentication is included in packet
|
||||||
|
|
||||||
|
|
||||||
Header Types
|
Header Types
|
||||||
-----------------
|
-----------------
|
||||||
type 1 00 Two byte header, one 10 byte address field
|
type 1 0 Two byte header, one 10 byte address field
|
||||||
type 2 01 Two byte header, two 10 byte address fields
|
type 2 1 Two byte header, two 10 byte address fields
|
||||||
type 3 10 Reserved
|
|
||||||
type 4 11 Reserved
|
|
||||||
|
|
||||||
|
|
||||||
Propagation Types
|
Propagation Types
|
||||||
@ -682,39 +691,57 @@ Wire Format
|
|||||||
HEADER FIELD DESTINATION FIELDS CONTEXT FIELD DATA FIELD
|
HEADER FIELD DESTINATION FIELDS CONTEXT FIELD DATA FIELD
|
||||||
_______|_______ ________________|________________ ________|______ __|_
|
_______|_______ ________________|________________ ________|______ __|_
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
01010000 00000100 [ADDR1, 10 bytes] [ADDR2, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
01010000 00000100 [HASH1, 10 bytes] [HASH2, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
||||||
| | | | |
|
|| | | | |
|
||||||
| | | | +-- Hops = 4
|
|| | | | +-- Hops = 4
|
||||||
| | | +------- Packet Type = DATA
|
|| | | +------- Packet Type = DATA
|
||||||
| | +--------- Destination Type = SINGLE
|
|| | +--------- Destination Type = SINGLE
|
||||||
| +----------- Propagation Type = TRANSPORT
|
|| +----------- Propagation Type = TRANSPORT
|
||||||
+------------- Header Type = HEADER_2 (two byte header, two address fields)
|
|+------------- Header Type = HEADER_2 (two byte header, two address fields)
|
||||||
|
+-------------- Access Codes = DISABLED
|
||||||
|
|
||||||
|
|
||||||
+- Packet Example -+
|
+- Packet Example -+
|
||||||
|
|
||||||
HEADER FIELD DESTINATION FIELD CONTEXT FIELD DATA FIELD
|
HEADER FIELD DESTINATION FIELD CONTEXT FIELD DATA FIELD
|
||||||
_______|_______ _______|_______ ________|______ __|_
|
_______|_______ _______|_______ ________|______ __|_
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
00000000 00000111 [ADDR1, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
00000000 00000111 [HASH1, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
||||||
| | | | |
|
|| | | | |
|
||||||
| | | | +-- Hops = 7
|
|| | | | +-- Hops = 0
|
||||||
| | | +------- Packet Type = DATA
|
|| | | +------- Packet Type = DATA
|
||||||
| | +--------- Destination Type = SINGLE
|
|| | +--------- Destination Type = SINGLE
|
||||||
| +----------- Propagation Type = BROADCAST
|
|| +----------- Propagation Type = BROADCAST
|
||||||
+------------- Header Type = HEADER_1 (two byte header, one address field)
|
|+------------- Header Type = HEADER_1 (two byte header, one address field)
|
||||||
|
+-------------- Access Codes = DISABLED
|
||||||
|
|
||||||
|
|
||||||
Size examples of different packet types
|
+- Packet Example -+
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
The following table lists example sizes of various
|
HEADER FIELD IFAC FIELD DESTINATION FIELD CONTEXT FIELD DATA FIELD
|
||||||
packet types. The size listed are the complete on-
|
_______|_______ ______|______ _______|_______ ________|______ __|_
|
||||||
wire size counting all fields including headers.
|
| | | | | | | | | |
|
||||||
|
10000000 00000111 [IFAC, N bytes] [HASH1, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
||||||
|
|| | | | |
|
||||||
|
|| | | | +-- Hops = 0
|
||||||
|
|| | | +------- Packet Type = DATA
|
||||||
|
|| | +--------- Destination Type = SINGLE
|
||||||
|
|| +----------- Propagation Type = BROADCAST
|
||||||
|
|+------------- Header Type = HEADER_1 (two byte header, one address field)
|
||||||
|
+-------------- Access Codes = ENABLED
|
||||||
|
|
||||||
- Path Request : 33 bytes
|
|
||||||
- Announce : 151 bytes
|
Size examples of different packet types
|
||||||
- Link Request : 77 bytes
|
---------------------------------------
|
||||||
- Link Proof : 77 bytes
|
|
||||||
- Link RTT packet : 83 bytes
|
The following table lists example sizes of various
|
||||||
- Link keepalive : 14 bytes
|
packet types. The size listed are the complete on-
|
||||||
|
wire size counting all fields including headers,
|
||||||
|
but excluding any interface access codes.
|
||||||
|
|
||||||
|
- Path Request : 33 bytes
|
||||||
|
- Announce : 151 bytes
|
||||||
|
- Link Request : 77 bytes
|
||||||
|
- Link Proof : 77 bytes
|
||||||
|
- Link RTT packet : 83 bytes
|
||||||
|
- Link keepalive : 14 bytes
|
||||||
|
@ -76,7 +76,7 @@ other programs to use on demand.</p>
|
|||||||
<dt class="sig sig-object py" id="RNS.Reticulum.MTU">
|
<dt class="sig sig-object py" id="RNS.Reticulum.MTU">
|
||||||
<span class="sig-name descname"><span class="pre">MTU</span></span><em class="property"> <span class="pre">=</span> <span class="pre">500</span></em><a class="headerlink" href="#RNS.Reticulum.MTU" title="Permalink to this definition">¶</a></dt>
|
<span class="sig-name descname"><span class="pre">MTU</span></span><em class="property"> <span class="pre">=</span> <span class="pre">500</span></em><a class="headerlink" href="#RNS.Reticulum.MTU" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>The MTU that Reticulum adheres to, and will expect other peers to
|
<dd><p>The MTU that Reticulum adheres to, and will expect other peers to
|
||||||
adhere to. By default, the MTU is 500 bytes. In custom RNS network
|
adhere to. By default, the MTU is 507 bytes. In custom RNS network
|
||||||
implementations, it is possible to change this value, but doing so will
|
implementations, it is possible to change this value, but doing so will
|
||||||
completely break compatibility with all other RNS networks. An identical
|
completely break compatibility with all other RNS networks. An identical
|
||||||
MTU is a prerequisite for peers to communicate in the same network.</p>
|
MTU is a prerequisite for peers to communicate in the same network.</p>
|
||||||
@ -688,7 +688,7 @@ destinations, reticulum will use ephemeral keys, and offers <strong>Forward Secr
|
|||||||
|
|
||||||
<dl class="py attribute">
|
<dl class="py attribute">
|
||||||
<dt class="sig sig-object py" id="RNS.Packet.PLAIN_MDU">
|
<dt class="sig sig-object py" id="RNS.Packet.PLAIN_MDU">
|
||||||
<span class="sig-name descname"><span class="pre">PLAIN_MDU</span></span><em class="property"> <span class="pre">=</span> <span class="pre">477</span></em><a class="headerlink" href="#RNS.Packet.PLAIN_MDU" title="Permalink to this definition">¶</a></dt>
|
<span class="sig-name descname"><span class="pre">PLAIN_MDU</span></span><em class="property"> <span class="pre">=</span> <span class="pre">476</span></em><a class="headerlink" href="#RNS.Packet.PLAIN_MDU" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>The maximum size of the payload data in a single unencrypted packet</p>
|
<dd><p>The maximum size of the payload data in a single unencrypted packet</p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
@ -689,9 +689,14 @@ A Reticulum packet is composed of the following fields:
|
|||||||
[HEADER 2 bytes] [ADDRESSES 10/20 bytes] [CONTEXT 1 byte] [DATA 0-477 bytes]
|
[HEADER 2 bytes] [ADDRESSES 10/20 bytes] [CONTEXT 1 byte] [DATA 0-477 bytes]
|
||||||
|
|
||||||
* The HEADER field is 2 bytes long.
|
* The HEADER field is 2 bytes long.
|
||||||
* Byte 1: [Header Type], [Propagation Type], [Destination Type] and [Packet Type]
|
* Byte 1: [IFAC Flag], [Header Type], [Propagation Type], [Destination Type] and [Packet Type]
|
||||||
* Byte 2: Number of hops
|
* Byte 2: Number of hops
|
||||||
|
|
||||||
|
* Interface Access Code field if the IFAC flag was set.
|
||||||
|
* The length of the Interface Access Code can vary from
|
||||||
|
1 to 64 bytes according to physical interface
|
||||||
|
capabilities and configuration.
|
||||||
|
|
||||||
* The ADDRESSES field contains either 1 or 2 addresses.
|
* The ADDRESSES field contains either 1 or 2 addresses.
|
||||||
* Each address is 10 bytes long.
|
* Each address is 10 bytes long.
|
||||||
* The Header Type flag in the HEADER field determines
|
* The Header Type flag in the HEADER field determines
|
||||||
@ -704,12 +709,16 @@ A Reticulum packet is composed of the following fields:
|
|||||||
* The DATA field is between 0 and 477 bytes.
|
* The DATA field is between 0 and 477 bytes.
|
||||||
* It contains the packets data payload.
|
* It contains the packets data payload.
|
||||||
|
|
||||||
|
IFAC Flag
|
||||||
|
-----------------
|
||||||
|
open 0 Packet for publically accessible interface
|
||||||
|
authenticated 1 Interface authentication is included in packet
|
||||||
|
|
||||||
|
|
||||||
Header Types
|
Header Types
|
||||||
-----------------
|
-----------------
|
||||||
type 1 00 Two byte header, one 10 byte address field
|
type 1 0 Two byte header, one 10 byte address field
|
||||||
type 2 01 Two byte header, two 10 byte address fields
|
type 2 1 Two byte header, two 10 byte address fields
|
||||||
type 3 10 Reserved
|
|
||||||
type 4 11 Reserved
|
|
||||||
|
|
||||||
|
|
||||||
Propagation Types
|
Propagation Types
|
||||||
@ -741,42 +750,60 @@ proof 11
|
|||||||
HEADER FIELD DESTINATION FIELDS CONTEXT FIELD DATA FIELD
|
HEADER FIELD DESTINATION FIELDS CONTEXT FIELD DATA FIELD
|
||||||
_______|_______ ________________|________________ ________|______ __|_
|
_______|_______ ________________|________________ ________|______ __|_
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
01010000 00000100 [ADDR1, 10 bytes] [ADDR2, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
01010000 00000100 [HASH1, 10 bytes] [HASH2, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
||||||
| | | | |
|
|| | | | |
|
||||||
| | | | +-- Hops = 4
|
|| | | | +-- Hops = 4
|
||||||
| | | +------- Packet Type = DATA
|
|| | | +------- Packet Type = DATA
|
||||||
| | +--------- Destination Type = SINGLE
|
|| | +--------- Destination Type = SINGLE
|
||||||
| +----------- Propagation Type = TRANSPORT
|
|| +----------- Propagation Type = TRANSPORT
|
||||||
+------------- Header Type = HEADER_2 (two byte header, two address fields)
|
|+------------- Header Type = HEADER_2 (two byte header, two address fields)
|
||||||
|
+-------------- Access Codes = DISABLED
|
||||||
|
|
||||||
|
|
||||||
+- Packet Example -+
|
+- Packet Example -+
|
||||||
|
|
||||||
HEADER FIELD DESTINATION FIELD CONTEXT FIELD DATA FIELD
|
HEADER FIELD DESTINATION FIELD CONTEXT FIELD DATA FIELD
|
||||||
_______|_______ _______|_______ ________|______ __|_
|
_______|_______ _______|_______ ________|______ __|_
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
00000000 00000111 [ADDR1, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
00000000 00000111 [HASH1, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
||||||
| | | | |
|
|| | | | |
|
||||||
| | | | +-- Hops = 7
|
|| | | | +-- Hops = 0
|
||||||
| | | +------- Packet Type = DATA
|
|| | | +------- Packet Type = DATA
|
||||||
| | +--------- Destination Type = SINGLE
|
|| | +--------- Destination Type = SINGLE
|
||||||
| +----------- Propagation Type = BROADCAST
|
|| +----------- Propagation Type = BROADCAST
|
||||||
+------------- Header Type = HEADER_1 (two byte header, one address field)
|
|+------------- Header Type = HEADER_1 (two byte header, one address field)
|
||||||
|
+-------------- Access Codes = DISABLED
|
||||||
|
|
||||||
|
|
||||||
Size examples of different packet types
|
+- Packet Example -+
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
The following table lists example sizes of various
|
HEADER FIELD IFAC FIELD DESTINATION FIELD CONTEXT FIELD DATA FIELD
|
||||||
packet types. The size listed are the complete on-
|
_______|_______ ______|______ _______|_______ ________|______ __|_
|
||||||
wire size counting all fields including headers.
|
| | | | | | | | | |
|
||||||
|
10000000 00000111 [IFAC, N bytes] [HASH1, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
||||||
|
|| | | | |
|
||||||
|
|| | | | +-- Hops = 0
|
||||||
|
|| | | +------- Packet Type = DATA
|
||||||
|
|| | +--------- Destination Type = SINGLE
|
||||||
|
|| +----------- Propagation Type = BROADCAST
|
||||||
|
|+------------- Header Type = HEADER_1 (two byte header, one address field)
|
||||||
|
+-------------- Access Codes = ENABLED
|
||||||
|
|
||||||
- Path Request : 33 bytes
|
|
||||||
- Announce : 151 bytes
|
Size examples of different packet types
|
||||||
- Link Request : 77 bytes
|
---------------------------------------
|
||||||
- Link Proof : 77 bytes
|
|
||||||
- Link RTT packet : 83 bytes
|
The following table lists example sizes of various
|
||||||
- Link keepalive : 14 bytes
|
packet types. The size listed are the complete on-
|
||||||
|
wire size counting all fields including headers,
|
||||||
|
but excluding any interface access codes.
|
||||||
|
|
||||||
|
- Path Request : 33 bytes
|
||||||
|
- Announce : 151 bytes
|
||||||
|
- Link Request : 77 bytes
|
||||||
|
- Link Proof : 77 bytes
|
||||||
|
- Link RTT packet : 83 bytes
|
||||||
|
- Link keepalive : 14 bytes
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -630,9 +630,14 @@ Wire Format
|
|||||||
[HEADER 2 bytes] [ADDRESSES 10/20 bytes] [CONTEXT 1 byte] [DATA 0-477 bytes]
|
[HEADER 2 bytes] [ADDRESSES 10/20 bytes] [CONTEXT 1 byte] [DATA 0-477 bytes]
|
||||||
|
|
||||||
* The HEADER field is 2 bytes long.
|
* The HEADER field is 2 bytes long.
|
||||||
* Byte 1: [Header Type], [Propagation Type], [Destination Type] and [Packet Type]
|
* Byte 1: [IFAC Flag], [Header Type], [Propagation Type], [Destination Type] and [Packet Type]
|
||||||
* Byte 2: Number of hops
|
* Byte 2: Number of hops
|
||||||
|
|
||||||
|
* Interface Access Code field if the IFAC flag was set.
|
||||||
|
* The length of the Interface Access Code can vary from
|
||||||
|
1 to 64 bytes according to physical interface
|
||||||
|
capabilities and configuration.
|
||||||
|
|
||||||
* The ADDRESSES field contains either 1 or 2 addresses.
|
* The ADDRESSES field contains either 1 or 2 addresses.
|
||||||
* Each address is 10 bytes long.
|
* Each address is 10 bytes long.
|
||||||
* The Header Type flag in the HEADER field determines
|
* The Header Type flag in the HEADER field determines
|
||||||
@ -645,12 +650,16 @@ Wire Format
|
|||||||
* The DATA field is between 0 and 477 bytes.
|
* The DATA field is between 0 and 477 bytes.
|
||||||
* It contains the packets data payload.
|
* It contains the packets data payload.
|
||||||
|
|
||||||
|
IFAC Flag
|
||||||
|
-----------------
|
||||||
|
open 0 Packet for publically accessible interface
|
||||||
|
authenticated 1 Interface authentication is included in packet
|
||||||
|
|
||||||
|
|
||||||
Header Types
|
Header Types
|
||||||
-----------------
|
-----------------
|
||||||
type 1 00 Two byte header, one 10 byte address field
|
type 1 0 Two byte header, one 10 byte address field
|
||||||
type 2 01 Two byte header, two 10 byte address fields
|
type 2 1 Two byte header, two 10 byte address fields
|
||||||
type 3 10 Reserved
|
|
||||||
type 4 11 Reserved
|
|
||||||
|
|
||||||
|
|
||||||
Propagation Types
|
Propagation Types
|
||||||
@ -682,39 +691,57 @@ Wire Format
|
|||||||
HEADER FIELD DESTINATION FIELDS CONTEXT FIELD DATA FIELD
|
HEADER FIELD DESTINATION FIELDS CONTEXT FIELD DATA FIELD
|
||||||
_______|_______ ________________|________________ ________|______ __|_
|
_______|_______ ________________|________________ ________|______ __|_
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
01010000 00000100 [ADDR1, 10 bytes] [ADDR2, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
01010000 00000100 [HASH1, 10 bytes] [HASH2, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
||||||
| | | | |
|
|| | | | |
|
||||||
| | | | +-- Hops = 4
|
|| | | | +-- Hops = 4
|
||||||
| | | +------- Packet Type = DATA
|
|| | | +------- Packet Type = DATA
|
||||||
| | +--------- Destination Type = SINGLE
|
|| | +--------- Destination Type = SINGLE
|
||||||
| +----------- Propagation Type = TRANSPORT
|
|| +----------- Propagation Type = TRANSPORT
|
||||||
+------------- Header Type = HEADER_2 (two byte header, two address fields)
|
|+------------- Header Type = HEADER_2 (two byte header, two address fields)
|
||||||
|
+-------------- Access Codes = DISABLED
|
||||||
|
|
||||||
|
|
||||||
+- Packet Example -+
|
+- Packet Example -+
|
||||||
|
|
||||||
HEADER FIELD DESTINATION FIELD CONTEXT FIELD DATA FIELD
|
HEADER FIELD DESTINATION FIELD CONTEXT FIELD DATA FIELD
|
||||||
_______|_______ _______|_______ ________|______ __|_
|
_______|_______ _______|_______ ________|______ __|_
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
00000000 00000111 [ADDR1, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
00000000 00000111 [HASH1, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
||||||
| | | | |
|
|| | | | |
|
||||||
| | | | +-- Hops = 7
|
|| | | | +-- Hops = 0
|
||||||
| | | +------- Packet Type = DATA
|
|| | | +------- Packet Type = DATA
|
||||||
| | +--------- Destination Type = SINGLE
|
|| | +--------- Destination Type = SINGLE
|
||||||
| +----------- Propagation Type = BROADCAST
|
|| +----------- Propagation Type = BROADCAST
|
||||||
+------------- Header Type = HEADER_1 (two byte header, one address field)
|
|+------------- Header Type = HEADER_1 (two byte header, one address field)
|
||||||
|
+-------------- Access Codes = DISABLED
|
||||||
|
|
||||||
|
|
||||||
Size examples of different packet types
|
+- Packet Example -+
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
The following table lists example sizes of various
|
HEADER FIELD IFAC FIELD DESTINATION FIELD CONTEXT FIELD DATA FIELD
|
||||||
packet types. The size listed are the complete on-
|
_______|_______ ______|______ _______|_______ ________|______ __|_
|
||||||
wire size counting all fields including headers.
|
| | | | | | | | | |
|
||||||
|
10000000 00000111 [IFAC, N bytes] [HASH1, 10 bytes] [CONTEXT, 1 byte] [DATA]
|
||||||
|
|| | | | |
|
||||||
|
|| | | | +-- Hops = 0
|
||||||
|
|| | | +------- Packet Type = DATA
|
||||||
|
|| | +--------- Destination Type = SINGLE
|
||||||
|
|| +----------- Propagation Type = BROADCAST
|
||||||
|
|+------------- Header Type = HEADER_1 (two byte header, one address field)
|
||||||
|
+-------------- Access Codes = ENABLED
|
||||||
|
|
||||||
- Path Request : 33 bytes
|
|
||||||
- Announce : 151 bytes
|
Size examples of different packet types
|
||||||
- Link Request : 77 bytes
|
---------------------------------------
|
||||||
- Link Proof : 77 bytes
|
|
||||||
- Link RTT packet : 83 bytes
|
The following table lists example sizes of various
|
||||||
- Link keepalive : 14 bytes
|
packet types. The size listed are the complete on-
|
||||||
|
wire size counting all fields including headers,
|
||||||
|
but excluding any interface access codes.
|
||||||
|
|
||||||
|
- Path Request : 33 bytes
|
||||||
|
- Announce : 151 bytes
|
||||||
|
- Link Request : 77 bytes
|
||||||
|
- Link Proof : 77 bytes
|
||||||
|
- Link RTT packet : 83 bytes
|
||||||
|
- Link keepalive : 14 bytes
|
||||||
|
Loading…
Reference in New Issue
Block a user