RFC 864

Character Generator Protocol

๐Ÿ“… published May 1983, from ietf

Character Generator Protocol ๐Ÿ’–๐ŸŽ€

๐Ÿ“ฎ Network Working Group ยท RFC 864 ยท Author: J. Postel, ISI ยท Date: May 1983 ยท Status: this one specifies a standard for the ARPA Internet community ๐Ÿ‘‘

๐Ÿ—‚๏ธ Obsoletes/Updates: nothing listed! This RFC doesn't obsolete or update any other RFCs in its header. ๐Ÿ™ˆ

Okay bestie, so this RFC is a standard for the ARPA Internet community โœจ Hosts on the ARPA Internet that choose to implement a Character Generator Protocol are expected to adopt and implement this standard. Lowkey iconic ๐Ÿ’…

A character generator service is a super useful debugging and measurement tool ๐Ÿ”ฅ It just sends data out and doesn't care what you send it. Main character energy, no notes ๐Ÿงš


TCP Based Character Generator Service ๐ŸŒธ

So the first version runs as a connection-based app on TCP ๐Ÿ’œ A server listens for TCP connections on TCP port 19. Once a connection is established, a stream of data gets sent out the connection, and any data the server receives gets thrown away ๐Ÿ—‘๏ธ It keeps going until the calling user terminates the connection.

Real talk, users are gonna get bored and just abort the TCP connection instead of closing it politely ๐Ÿ’€ The service should be prepared for either the careful close or the rude abort. Rude but valid ๐Ÿ™„

The data flow is limited by the normal TCP flow control mechanisms, so there's no concern about the service sending data faster than the user can process it. The flow control is literally handling the drama for us ๐Ÿซถ

UDP Based Character Generator Service ๐Ÿฆ‹

The second version is a datagram-based app on UDP ๐ŸŒˆ A server listens for UDP datagrams on UDP port 19. When a datagram comes in, an answering datagram gets sent back containing a random number (between 0 and 512) of characters. The data in the received datagram is ignored, so it doesn't matter what you sent ๐Ÿคทโ€โ™€๏ธ

No history or state info is kept for the UDP version, so there's zero continuity from one answering datagram to the next. Each one is its own little moment โœจ

The service only sends one datagram in response to each received datagram, so again, no concern about sending data faster than the user can process it. We're literally so chill ๐Ÿ˜Œ

Data Syntax ๐Ÿ“

The data may be anything, honestly ๐Ÿ™Œ It is recommended that a recognizable pattern be used in the data, though, so people can tell what they're looking at.

One popular pattern is 72 character lines of the ASCII printing characters. There are 95 printing characters in the ASCII character set ๐Ÿ”ข Sort them into an ordered sequence and number them from 0 through 94. Then think of the sequence as a ring, so character number 0 follows character number 94 ๐Ÿ”

On the first line (line 0), put the characters numbered 0 through 71. On the next line (line 1), put the characters numbered 1 through 72. And so on. On line N, put characters (0+N mod 95) through (71+N mod 95) ๐Ÿงฎ End each line with a carriage return and line feed (CRLF) ๐Ÿ’Œ

๐Ÿšจ The numbers wrap around the ring, so line N starts at character (0+N mod 95) and ends at (71+N mod 95). Don't mess up the modulo, bestie ๐Ÿ˜ญ

Example ๐ŸŽ€

Here's what the pattern looks like in practice โœจ

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk
%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl
&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm
'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn
()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno
)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop
*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq
+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr
,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs
-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst
./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvw
123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwx
23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy
3456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{
56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|
6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
9:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !
:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"
;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#
<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$
=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%
>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&
?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'(
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()
BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*
CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+
DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,
EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-
FGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-.
GHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./
HIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./0
IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./01
JKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./012
KLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./0123
LMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./01234
MNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./012345
NOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456

Phew, that's the whole vibe ๐Ÿ’… Lowkey the simplest protocol in the book, and still so useful ๐Ÿซถ๐ŸŒˆ

๐Ÿ“ฆ where this page comes from