Ich verbinde mich über TCP mit meinem lokalen Bitcoin und habe folgendes Verhalten beobachtet:
Ich sehe viele Nachrichten, bei denen nur der Header angegeben ist oder nur ein Teil der Nutzlast angehängt ist. Natürlich könnte es auch ein Fehler in meinem Code sein.
Werden die Bytes in Blöcken gesendet? Welche der folgenden sind gültig?
|header1|payload1| (as per documentation, this is valid)
|header1| (no payload, even though required. Have seen this)
|payload1| (no header, have seen this)
|header1|partPayload1| (incomplete payload, not sure if seen these)
|partPayload1| (part earlier header's payload, not sure if seen these)
|header1|payload1|header2|payload2|
|header1|payload1|header2|partPayload2|
|header1|partPayload1|header2|
|partPayload1|header2|payload2|
Hinweis: Ich verwende Versionsnummer 70002, Relais = 1 und Dienste = 0.
BEARBEITEN: Im Allgemeinen warte ich auf die verbleibenden Bytes, und meistens kommen sie an, aber in seltenen Fällen, etwa 2%, kommt ein anderer Header an. Dies geschieht nur mit tx
Nachrichten.
EDIT2: Basierend auf den Kommentaren unten scheint es wahrscheinlich, dass es einen Fehler in meinem Code gibt. Ich überprüfe und kehre zurück.
EDIT3: War ein Fehler in meinem Code. Ich ging davon aus, dass Teildatenpakete einem einzelnen Header entsprechen. Es können mehrere Header vorhanden sein, nachdem die Daten vollständig sind (in demselben Paket). Das macht Sinn, wenn ich es als Stream betrachte.
TCP ist ein Stream-Protokoll. Obwohl der Stream drahtlos als eine Reihe von IP-Nachrichten gesendet wird, ist er semantisch nur ein Byte-Stream.
Das bedeutet, dass Sie sich auf Anwendungsebene nicht um die Nachrichtengrenzen kümmern sollten. Router und andere Internet-Infrastrukturen können Daten willkürlich in Pakete aufteilen, damit sie in ihre zugrunde liegenden Protokolle passen (zB Ethernet hat Frames von höchstens 1500 Bytes).
Jus12
Pieter Wuille
Jus12
x
Die Header-Prüfsumme überprüft, sagt, dass die Nutzlast (nicht Null) Bytes sein sollte , aber die Nachricht ist entweder nur 24 Bytes oder weniger als24+x
. Ich muss also auf den Rest der Nachricht warten, mit der Garantie, dass der Peer tatsächlich die vollständigen Daten gesendet hat und auf dem Weg ist, und er sendet keinen Header einer anderen Nachricht. Rechts?Pieter Wuille
Jus12
Pieter Wuille
Jus12
Pieter Wuille
Jus12
|header1|payload1|header2|payload2|
oder ist es immer nur eine Nachricht auf einmal?Pieter Wuille