feat(core): Gnutella joining after Java, measured against Java

GnutellaRun lets Java's PeerToPeerAnwendung join peers on terminal-net.
The core's gnutella.ts does the same: a ping in Java's text format to
port 6346, a pong back, the ping sent on to the other peers and their
pongs back the way it came, at most the program's number of peers.

Departure from Java: a ping that comes a second time gets no pong and
its connection stays (Java's worker throws on the missing pong).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-02 12:29:54 +00:00
co-authored by Claude Opus 5.5
parent 9d42b90157
commit b4a95e6cac
18 changed files with 37937 additions and 3 deletions
+35
View File
@@ -870,6 +870,41 @@ Gemessen (02.10.2026):
ebenso eine unter Last (andere Sitzungen auf dem Rechner: die erste
ARP-Runde dauert dann knapp 300 statt 225 ms).
## Gnutella, Beitreten (F3.6a)
`GnutellaRun` installiert Javas Gnutella-Programm (`PeerToPeerAnwendung`)
auf vier Rechnern von `terminal-net` (192.168.0.20, .30, .31 und 10.0.0.2
hinter dem Router; .10 ohne) und ruft `beitretenNetzwerk` und
`resetNetwork` zu festen Zeiten, wie das Fenster es tut. Geschrieben werden
je Karte die Frames samt Tabellen, die bekannten Teilnehmer jedes Programms
bei jeder Meldung an sein Fenster und am Ende.
Gemessen (02.10.2026):
* Ein Paket ist Text, seine Felder durch `//` getrennt (`PeerToPeerPaket
.toString`): Ping `guid//0x00//hops//ttl//0//IP`, Pong
`guid//0x01//0//8//Bits//IP//6346//Dateien//Bytes`; die Bitlänge zählt
die Zeichen der Adresse mal acht und für jede Zahl die kleinste
Zweierpotenz, die sie fasst. Die GUID ist zufällig (`new Random()`).
* Beitreten: eine Verbindung zum Port 6346 des Teilnehmers, der Ping; der
Teilnehmer nimmt den Absender des Pings auf, antwortet mit einem Pong und
schickt den Ping (hops+1, ttl−1) über je eine neue Verbindung an seine
anderen Teilnehmer, außer an den Absender und den Rechner des Pings;
deren Pongs gehen (hops+1, ttl−1) über die Verbindung zurück, auf der der
Ping kam (`sendePaket` nach GUID). Wer einen Pong auf seinen eigenen Ping
bekommt, nimmt dessen Rechner auf; jeder höchstens so viele, wie er
behält. Keine Verbindung wird je geschlossen.
* Fehler Javas: kommt derselbe Ping ein zweites Mal an, gibt `erstellePong`
`null` zurück, und `toString()` darauf wirft; der Arbeiter schließt die
Verbindung (gemeint war: kein Pong). Ein Text ohne Paketkopf wirft
ebenso und schließt die Verbindung.
* Zu sich selbst kein Ping; zu einem Rechner ohne Programm ein SYN (Javas
eines statt drei); ins Leere nur ARP.
* Wo viele Verbindungen zugleich laufen, kommen die Frames zweier
Verbindungen (oder beider Richtungen einer) an einer Karte mal so, mal so
herum, einige zehn Millisekunden auseinander: Javas Thread-Takt über
mehrere Sprünge.
## Datei-Explorer, Texteditor, Bildbetrachter (F3.5b)
`FileCases` tut, was die Fenster dieser Programme mit den Dateien eines