DiningHackersProtocol » History » Version 7
Matthieu Herrb, 2018-08-01 12:23
1 | 1 | Matthieu Herrb | h1. THE DINING HACKERS PROTOCOL |
---|---|---|---|
2 | |||
3 | April 14th 2001 |
||
4 | Felipe Bergo @<bergo@seul.org>@ |
||
5 | |||
6 | _"You may have read April 1st RFCs, but no text ever came so close to a February-30th-RFC as this"_ |
||
7 | |||
8 | |||
9 | h2. ABSTRACT |
||
10 | |||
11 | This document describes a protocol meant to provide a centralized service for clients ('dining hackers') who are fighting (more literally than in previous similar protocols) for a finite set of resources. |
||
12 | |||
13 | h2. INTRODUCTION |
||
14 | |||
15 | 3 | Matthieu Herrb | The Dining Hacker protocol implements a situation similar to that shown in Dijkstra's Dining Philosophers paper. A finite set of clients with different personalities are competing for a set of resources (chopsticks). |
16 | 1 | Matthieu Herrb | |
17 | 3 | Matthieu Herrb | The situation is a round table with at N hackers, N <= 256. There are always N chopsticks and N chinese food boxes on the table. Hackers wish to eat, but one must first acquire the two chopsticks adjacent to his own position to start eating. How much time and how frequently a hacker will eat depends on the client. But conflict resolution is arbitrated by the server, using RPG-like character sheets. |
18 | 1 | Matthieu Herrb | |
19 | The protocol itself is divided into 2 sub-protocols, each running on a TCP connection. |
||
20 | |||
21 | h2. CLIENT SUB-PROTOCOL |
||
22 | |||
23 | The Client Sub-Protocol is used to connect a client (hacker) to the dinner table (server). The client connects to TCP 8081 of the server, which will send a greeting message and wait for requests. |
||
24 | |||
25 | The greeting message is terminated by a newline (0x0a) and the only requirement is that it contains the "DINNERD" string (in uppercase characters). Usually it will contain also a version number. |
||
26 | |||
27 | The following operations can be triggered by the client: |
||
28 | |||
29 | h3. GROUP 1 : SET PROPERTIES |
||
30 | |||
31 | 4 | Matthieu Herrb | Each client has an associated "character sheet", with 5 properties: name (up to 16 octets), ST (Strength, 1 octet), DX (Dexterity, 1 octet), Aggr (Aggressivity, 1 octet) and HT (Health, 1 octet). All properties are read/write, except HT which starts at 100 and is read only. |
32 | 1 | Matthieu Herrb | |
33 | 2 | Matthieu Herrb | *Operations* |
34 | 1 | Matthieu Herrb | |
35 | # SET NAME |
||
36 | Client sends 0x30 (up to 16 octets) 0x0a. |
||
37 | The command always succeeds. |
||
38 | # SET ST |
||
39 | Client sends 0x31 ST-octet |
||
40 | The command always succeeds. |
||
41 | # SET DX |
||
42 | Client sends 0x32 ST-octet |
||
43 | The command always succeeds. |
||
44 | # SET Aggr |
||
45 | Client sends 0x33 Aggr-octet |
||
46 | The command always succeeds. |
||
47 | 2 | Matthieu Herrb | |
48 | h3. GROUP 2: GET PROPERTIES |
||
49 | |||
50 | *Operations* |
||
51 | |||
52 | # GET NAME |
||
53 | Client sends 0x3f 0x30 ("?0") |
||
54 | Server replies with 16 octets. The name is |
||
55 | a zero-terminated string. |
||
56 | The command always succeeds. |
||
57 | # GET ST |
||
58 | Client sends 0x3f 0x31 ("?1") |
||
59 | Server replies with the ST octet. |
||
60 | The command always succeeds. |
||
61 | # GET DX |
||
62 | Client sends 0x3f 0x32 ("?2") |
||
63 | Server replies with the DX octet. |
||
64 | The command always succeeds. |
||
65 | # GET Aggr |
||
66 | Client sends 0x3f 0x33 ("?3") |
||
67 | Server replies with the Aggr octet. |
||
68 | The command always succeeds. |
||
69 | # GET HT |
||
70 | Client sends 0x3f 0x34 ("?4") |
||
71 | Server replies with the HT octet. |
||
72 | The command always succeeds. |
||
73 | |||
74 | |||
75 | h3. GROUP 3: RESOURCE USAGE |
||
76 | |||
77 | # REQUEST LEFT CHOPSTICK |
||
78 | Client sends 0x4c ("L") |
||
79 | Server replies 0x30 on failure, 0x31 on success. |
||
80 | # REQUEST RIGHT CHOPSTICK |
||
81 | Client sends 0x52 ("R") |
||
82 | Server replies 0x30 on failure, 0x31 on success. |
||
83 | # DROP LEFT CHOPSTICK |
||
84 | Client sends 0x6c ("l") |
||
85 | The command always succeds. |
||
86 | # DROP RIGHT CHOPSTICK |
||
87 | Client sends 0x72 ("r") |
||
88 | The command always succeds. |
||
89 | |||
90 | h3. GROUP 4: OTHER |
||
91 | |||
92 | |||
93 | # SUICIDE |
||
94 | Client sends 0x51 ("Q") |
||
95 | 5 | Matthieu Herrb | The command always suceeds. The hacker and his chopstick are removed from the table. |
96 | 2 | Matthieu Herrb | Disconnecting has the same effect. |
97 | |||
98 | h2. INITIALIZATION |
||
99 | |||
100 | 6 | Matthieu Herrb | The character sheet is generated from random bits upon connection. Until the client supplies data with SET requests, he'll have a random 3-character name, HT 100, ST in [5,15], DX in [5,15] and Aggr in [5,15]. |
101 | 2 | Matthieu Herrb | |
102 | h2. RESOURCE MANAGEMENT |
||
103 | |||
104 | 7 | Matthieu Herrb | The great difference from the Dining Philosophers situation is that hackers have an attitude. They won't starve while the neighbour is eating happily. They'll attack their neighbours phisically with punches. |
105 | 2 | Matthieu Herrb | |
106 | 7 | Matthieu Herrb | The ST, Aggr and DX stats shape the behavior. A situation when a hacker may hit a neighbour is called a hit roll, and is performed by the server. Clients only find out they've been hit by checking the HT with GET requests. |
107 | 2 | Matthieu Herrb | |
108 | 7 | Matthieu Herrb | A hit roll is performed when a hacker already has acquired a chopstick, tries to acquire the second and fails. The hacker is anger at the neighbour who caused the request to fail, and the server performs a hit roll. |
109 | 2 | Matthieu Herrb | |
110 | 7 | Matthieu Herrb | First the server rolls 3D6 (3 6-faced dice) against the hacker's Aggr parameter. If the roll is greater than Aggr, the hacker wasn't upset enough, and won't proceed with the hit. |
111 | 2 | Matthieu Herrb | |
112 | 7 | Matthieu Herrb | If the hacker proceeds with the hit, the server rolls a dexterity dispute between the attacker and the defender, with a +2 innitiative bonus for the attacker. The roll is : |
113 | 2 | Matthieu Herrb | |
114 | * Attacker: Attacker.DX + 1D6 + 2 |
||
115 | * Defender: Defender.DX + 1D6 |
||
116 | |||
117 | 7 | Matthieu Herrb | If the defender's result is greater or equal than the attacker's result, he successfully dodged the punch, and the hit roll is over. |
118 | 2 | Matthieu Herrb | |
119 | 7 | Matthieu Herrb | Else, the punch hit, and the server will roll the damage, which is |
120 | 2 | Matthieu Herrb | |
121 | (Attacker.ST x 1D6) / 3 |
||
122 | |||
123 | 7 | Matthieu Herrb | The damage is subtracted from the defender's HT. A character is knocked out if his HT reaches 0 or less. Knocked out characters are disconnected from the server, and both the character and his associated chopstick are removed from the table. |
124 | 2 | Matthieu Herrb | |
125 | h2. STARVATION |
||
126 | |||
127 | The starvation timeout is ST x 3 seconds. The server |
||
128 | knocks off starved hackers. |
||
129 | |||
130 | h2. OBSERVATION SUB-PROTOCOL |
||
131 | |||
132 | The server also provides a secondary protocol for |
||
133 | processes willing to observe the global table |
||
134 | situation. The watcher makes a TCP connection |
||
135 | to port 8082. There's no greeting message, the |
||
136 | server starts listening for requests immediatelly. |
||
137 | To request a global overview the client sends |
||
138 | any octet to the server. |
||
139 | |||
140 | The server replies with a table snapshot made of |
||
141 | |||
142 | 1 octet - H# : NUMBER OF ACTIVE HACKERS |
||
143 | |||
144 | and H# hacker state messages. Adjacent messages |
||
145 | represent adjacent hackers. Each message is 21 |
||
146 | octets long: |
||
147 | |||
148 | 16 octets - hacker name, zero-terminated |
||
149 | 1 octet - ST |
||
150 | 1 octet - HT |
||
151 | 1 octet - DX |
||
152 | 1 octet - Aggr |
||
153 | 1 octet - eating flag, non-zero if the hacker |
||
154 | currently has two chopsticks in his |
||
155 | possession, zero otherwise. |