Optional: Implementieren Sie das Protokoll wie angegeben: Alle Nachrichten, die über den UDP-Channel verschickt werden, enthalten Nachrichten der Form " ", wobei die Parameter durch Leerzeichen getrennt werden. Die Parmeter sind wie URLs kodiert (Spaces werden durch "%20" ersetzt, % durch "%25") Planeten können mit beliebig vielen Planeten verbunden sein, Raumschiffe hingegen immer nur mit einem Planeten, wobei aber an einen Planeten mehrere Raumschiffe gleichzeitig andocken können. Basisdatentypen: ---------------- PlanetName := [a-zA-Z0-9\-_]+.prefix(8, hex(sha1(ip:port))) ShipName := [a-zA-Z0-9\-_]+!prefix(8, hex(sha1(ip:port))) NodeName := (|) GoodName := [a-zA-Z0-9\-_]+ Kontaktaufnahme --------------- Wenn Planeten entstehen, melden sie sich bei Ihren Nachbarn mittels HELLO Nachrichrichten. Analog dazu tun dies auch Raumschiffe, die andocken. Messages: HELLO [# ] Nachbar wird der Name der Absendernode mitgeteilt, der Nachbar teilt seinen Namen via OLLEH als Antwort mit. OLLEH [# ] Antwort auf Hello, Mitteilung des Namens , Umgebung erkunden ----------------- Raumschiffe können über verbundene Planeten Sub-Etha-Nachrichten zu weit entfernten Planeten schicken, in dem sie den Weg der Nachricht angeben (source routing), mittels dieser Technik kann auch eine Anfrage an einen entfernten Planeten geschickt werden, dass dieser über seine Nachbarschaft berichten soll. PEERS # hopM (0 <= M < dst) schickt die Nachricht unverändert an hopM+1 weiter (# markiert die Kante) Hop dst antwortet mit SREEP # SREEP # # Mitteilung über die Peers von SRC als Antwort auf PEERS Beispielskommunikation: ERDE -> MARS : HELLO ERDE.a4ea4cbc MARS -> ERDE : OLLEH MARS.0f4ddfae ALPHA-Z -> MARS : HELLO ALPHA-Z.6d95057d MARS -> ALPHA-Z : OLLEH MARS.0f4ddfae ERDE -> MARS : PEERS ERDE.a4ea4cbc # MARS.0f4ddfae MARS -> ERDE : SREEP MARS.0f4ddfae # ERDE.a4ea4cbc # ERDE.a4ea4cbc ALPHA-Z.6d95057d ERDE -> MARS : PEERS ERDE.a4ea4cbc # MARS.0f4ddfae ALPHA-Z.6d95057d MARS -> ALPHA-Z : PEERS ERDE.a4ea4cbc MARS.0f4ddfae # ALPHA-Z.6d95057d ALPHA-Z -> MARS : SREEP ALPHA-Z.6d95057d # MARS.0f4ddfae ERDE.a4ea4cbc # MARS.0f4ddfae MARS -> ERDE : SREEP ALPHA-Z.6d95057d MARS.0f4ddfae # ERDE.a4ea4cbc # MARS.0f4ddfae Handeln: -------- Um Handelsflüge zu planen stehen zwei Mechanismen zur Verfügung: - Mittels GOODS kann eine Liste der vermutlich in diesem Teil des Weltraums gehandelten Waren (ohne Preise) erfragt werden. Die Planeten fluten diese Information langsam durch den Weltraum. - Mit COST können wieder per source routing die aktuellen Kosten für eine Handelsware bei einem benachbarten oder entfernten Planeten abgefragt werden. Der Preis ist natürlich nicht verbindlich… Messages: GOODS # .. src Teilt teilt dst die Liste bekannter Güter mit, wobei TTL für jeden Eintrag um 1 dekrementiert wird dst Setzt Güter-Timer von src zurück. dst Setzt die Güter-Liste für src auf den Inhalt des Paketes dst prüft Güter-Timer aller Nachbarn: falls Güter-Timer > 30sec wird GOODS an den Nachbarn geschickt. sobald aktuelle Nachrichten (< 30sec vor Empfang von Goods) aller Nachbarn vorliegen, wird SDOOG als Antwort ausgesandt SDOOG # .. src Teilt teilt dst die Liste bekannter Güter mit, wobei TTL für jeden Eintrag um 1 dekrementiert wird Berechnung der Liste bekannter Güter: Vereinigung über die Liste der Güter, die von einer Node selbst angeboten werden mit den Güter-Listen, die von Nachbarn empfangen wurden, TTL ist das maximum der TTLs Verwendung der TTL: TTL wird von jedem handelen Planeten für jedes Gut frei gewählt. Gibt an wie weit das Produkt sichtbar sein soll. Keine weitere Weiterleitung bei TTL 0, sodass nicht mehr aktive Produkte irgendwann vom Markt verschwinden. Beispielskommunikation: # Angebote: # Erde: Holz TTL 10 # Gruene_Erbsen TTL 1 # Mars: Deuterium TTL 3 # Pangalactic_Gargleblast TTL 1 # Alpha-Z: Pangalactic_Gargleblast TTL 5 ERDE -> MARS : GOODS ERDE.a4ea4cbc # Holz.10 Gruene_Erbsen.1 MARS -> ALPHA-Z : GOODS MARS.0f4ddfae # Holz.9 Deuterium.3 Pangalactic_Gargleblast.1 ALPHA-Z -> MARS : SDOOG ALPHA-Z.6d95057d # Holz.8 Deuterium.2 Pangalactic_Gargleblast.5 MARS -> ERDE : SDOOG MARS.0f4ddfae # Holz.9 Deuterium.3 Pangalactic_Gargleblast.4 Messages: COST # # TSOC # # # # Analog zu PEERS wird hier die Anfrage eines Preises entlang der einzelnen Hops geschickt und die Antwort auf selbem Wege zurueck. Das erste gibt an, zu welchem Preis der Planet verkauft, das zweite, zu welchem Preis er ankauft. gibt an wieviel Tonnen verfügbar sind. Sollte ein Planet nicht an/verkaufen, steht statt der Zahlen ein _ Beispielskommunikation: PlanetExpress -> MARS : COST PlanetExpress.a4ea4cbc # MARS.0f4ddfae ALPHA-Z.6d95057d # Pangalactic_Gargleblast MARS -> ALPHA-Z : COST PlanetExpress.a4ea4cbc MARS.0f4ddfae # ALPHA-Z.6d95057d # Pangalactic_Gargleblast ALPHA-Z -> MARS : TSOC ALPHA-Z.6d95057d # MARS.0f4ddfae PlanetExpress.1f2938ad # Pangalactic_Gargleblast # 70 4 # _ MARS -> PlanetExpress : TSOC ALPHA-Z.6d95057d MARS.0f4ddfae # PlanetExpress.1f2938ad # Pangalactic_Gargleblast # 70 4 # _ Handel ------ Handeln können nur Raumschiffe mit Planeten, an die sie angedockt sind. Messages: BUY YUB SELL LLES Mit BUY unterbreitet das Raumschiff dem Planeten das Angebot, bis zu tonnen zu einem Preis bis zu price zu kaufen, Der Handel ist perfekt, falls die Raumstation mit YUB antwortet, wobei der Preis größer und die Menge kleiner als im Vorschlag sein dürfen. SELL verhält sich analog, allerdings muss hierbei der Preis größer als der im Angebot sein dürfen. Will man den optimalen Preis wissen, sollte man sich mit COSTS einen Eindruck verschaffen und dann Angebote unterbreiten - Händler können sich auch runterhandeln lassen oder bei großen Mengen Rabatte gewähren. Beispielskommunikation: Farydust -> Erde : COST Farydust!af745e87 # ERDE.a4ea4cbc # Holz Erde -> Farydust : COST ERDE.a4ea4cbc # Farydust!af745e87 # Holz 25 5 Farydust -> Erde : BUY Holz 100 7 Erde -> Farydust : YUB Holz 0 7 Farydust -> Erde : BUY Holz 100 14 Erde -> Farydust : YUB Holz 0 14 Farydust -> Erde : BUY Holz 100 22 Erde -> Farydust : YUB Holz 80 22 Farydust -> Erde : SELL Pangalactic_Gargleblast 1 120 Erde -> Farydust : LLES Pangalactic_Gargleblast 1 100 Verbindungsabbau ----------------- Messages: Raumschiffe müssen von Planeten abdocken, um zum nächsten Planeten zu reisen, höfliche Planete sagen tschüss zu ihren Nachbarn, bevor sie desintegieren. Dafür sind BYE und EYB da. Nach EYB wird der channel geschlossen! BYE [# ] EYB [# ] Reise zum nächsten Planeten --------------------------- Um die Verbindung zum nächsten Ziel aufbauen zu können, muss der aktuelle Planet nach dessen IP-Adresse und Port befragt werden Messages: WHOIS SIOHW # [ip port] Beispielskommunikation: Farydust -> Erde : WHOIS MARS.0f4ddfae Erde -> Farydust : SIOHW MARS.0f4ddfae # 192.0.2.1 9000 Farydust -> Erde : BYE Farydust!af745e87 # I'm flying to the Mars... Erde -> Farydust : EYB ERDE.a4ea4cbc # ... das wars. Farydust -> Mars : HELLO Farydust!af745e87 # I've come from Alabama Mars -> Farydust : OLLEH MARS.0f4ddfae # leave your banjo on your knee