# Postcard protocol, version 1
The POSTCARD PROTOCOL is a federated asynchronous communication protocol that
aims to simulate the experience of sending postcards through the physical mail
online. A NETWORK consists of a series of servers, known as POST OFFICES, which
provide a limited number of user accounts (P.O. BOXES) that can send and receive
short messages, called POSTCARDS. The protocol is implemented on top of UDP and
tries to be relatively secure and mitigative against abuse.
The postcard protocol is in ALPHA status and may change while we're working
toward a version 1.0. Below, each part of the protocol is described.
## POSTCARD.
A POSTCARD is a datagram that fits within a single UDP packet. While the
*actual* limit to UDP packet size is 2^16 bits[1], the number I've seen around
the internet for a *safe* UDP packet size is more like 512 bytes. So that's
what we're going with --- especially because a physical postcard is much closer
in data size to 512 bytes than 2^16 or even 1500 (another limit mentioned in
Julia Evans's blog referenced above).
A POSTCARD's size is further restricted (though not by much) by a short header
with the following fields:
* 2b MAGIC NUMBER: the ASCII codepoints of the letters "PC" (for postcard)
* 1b VERSION: The version of the postcard protocol being used
* 1b ENCODING: The text encoding of the postcard's message (see Appendix A)
* 1b TOBOX: The P.O. BOX of the message recipient
* 1b FROMBOX: The P.O. BOX of the message sender
This header is 6 bytes long, leaving 506 bytes for message text:
```
,___________________________________________________________________.
|________________ POSTCARD PROTOCOL DATAGRAM SKETCH ________________|
> "PC" (2 bytes) |version,encoding|to(1b) from(1b)|message(506b) |
|0101000001000011|0000000100000000|ttttttttffffffff| . . . . . . . .|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```
## P.O. BOX.
## POST OFFICE.
## NETWORK.
### APPENDIX A. Encoding table.
While UTF-8 is the answer for almost every question of encoding in the modern
day, on a byte-restricted format like the postcard protocol I think it's unfair
for non-English speakers to be forced to use double or even triple the bytes to
send the same message. Therefore, the ENCODING field of a postcard's metadata
corresponds to the message encoding, which allows senders to choose a more
storage-friendly encoding for their messages.
ENCODING is stored as a 1-byte number, allowing for 256 possible encodings. As
of Postcard protocol v. 1, these are recognized:
``` | table
0 UTF-8
1 ASCII
2 EBCDIC
3 ISO 8859-1 Western Europe
4 ISO 8859-2 Western and Central Europe
5 ISO 8859-3 Western Europe and South European
6 ISO 8859-4 Western Europe and Baltic countries
7 ISO 8859-5 Cyrillic alphabet
8 ISO 8859-6 Arabic
9 ISO 8859-7 Greek
10 ISO 8859-8 Hebrew
11 ISO 8859-9 Western Europe with amended Turkish character set
12 ISO 8859-10 Western Europe with rationalized Nordic character set
13 ISO 8859-11 Thai
14 ISO 8859-13 Baltic languages plus Polish
15 ISO 8859-14 Celtic languages
16 ISO 8859-15 ISO 8859-1 with rationalizations
17 ISO 8859-16 Central, Eastern and Southern European languages
18 CP437
19 CP720
20 CP737
21 CP850
22 CP852
23 CP855
24 CP857
25 CP858
26 CP860
27 CP861
28 CP862
29 CP863
30 CP865
31 CP866
32 CP869
33 CP872
34 Windows-1250 for Central European languages that use Latin script
35 Windows-1251 for Cyrillic alphabets
36 Windows-1252 for Western languages
37 Windows-1253 for Greek
38 Windows-1254 for Turkish
39 Windows-1255 for Hebrew
40 Windows-1256 for Arabic
41 Windows-1257 for Baltic languages
42 Windows-1258 for Vietnamese
43 Mac OS Roman
44 KOI8-R
45 KOI8-U
46 KOI7
47 MIK
48 ISCII
49 TSCII
50 VISCII
51 Shift JIS
52 EUC-JP
53 ISO-2022-JP
54 JIS X 0213
55 Shift_JIS-2004
56 EUC-JIS-2004
57 ISO-2022-JP-2004
58 GB 2312
59 GBK (Microsoft Code page 936)
60 GB 18030
61 Taiwan Big5 (a more famous variant is Microsoft Code page 950)
62 Hong Kong HKSCS
63 Korean
64 EUC-KR
65 ISO-2022-KR
```
This list is pulled from Wikipedia's entry on common character encodings[2], so
it may need to be revised.
## END NOTES.
=> https://jvns.ca/blog/2017/02/07/mtu/ [1]: J. Evans. "How big can a packet get?"
=> https://en.wikipedia.org/wiki/Character_encoding#Common_character_encodings [2]: Wikipedia. "Character encoding"