Dies ist die neueste Raknet -Protokolldokumentation. Es enthält Informationen zu den im Protokoll verwendeten Datentypen und Details zu jedem Paket und zu den zugehörigen Feldern.
TODO: Ändern Sie, um es für das Auge besser zu machen und viele nutzlose Sachen zu entfernen. Und organisieren auch Dinge wie Enums/Konstanten an einem Ort und entfernen Sie auch wiederholte Dinge.
In dieser Dokumentation geht davon aus, dass Sie eine ähnliche/gleiche Sicherheitsmethode von libcat wünschen. Aus diesem Grund, wenn der Server, auf den Sie abzielen, nicht libcat oder was auch immer das gleiche hat, aber auch die Sicherheit aktiviert ist, stürzt der Kunde ab, da er Ihnen nur einen Cookie, keinen Identitätsbeweis oder irgendetwas von den Likes gibt. Sie können jedoch die Anfrage zur Unterstützung beider Fälle abrufen.
| Typ | Größe | Notiz |
|---|---|---|
| Uint8 | 1 Byte | Unsigned 8-Bit Ganzzahl |
| Uint16 | 2 Bytes | Nicht signiert 16-Bit-Ganzzahl |
| Uint24 | 3 Bytes | Unsigned 24-Bit-Ganzzahl mit einem Mindestwert von 0 und einem Maximalwert von 16777215 |
| Uint32 | 4 Bytes | Unsigned 32-Bit Ganzzahl |
| Uint64 | 4/8 Bytes | Unsigned 64-Bit-Ganzzahl (4 Bytes für 32-Bit-Systeme, 8 Bytes für 64-Bit-Systeme) |
| Uint16-String | Variable | UTF-8 codierte Zeichenfolge mit einer Länge von 2 Bytes vor der Zeichenfolge |
| Magie | 16 Bytes | Ein Array von nicht signierten 8-Bit-Ganzzahlen mit einer bestimmten Sequenz [0x00, 0xFF, 0xFF, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0x12, 0x34, 0x56, 0x78] |
| Pad-mit Null | Variable | Null -Bytes, die zum Polsterung mit einer Größe Ihrer Wahl verwendet werden |
| bool | 1 Byte | Schreiben oder lesen Sie als einzelne nicht signierte 8-Bit-Ganzzahl mit einem Wert von 0 oder 1 (Null wird verwendet, um Falsch darzustellen, und man wird verwendet, um True darzustellen) |
| Adresse | 7-29 Bytes | IPv4: 1-Byte (Adressversion), 4 Bytes (IP-Adresse), 2 Bytes (Port), IPv6: 1-Byte (Adressversion), nicht signiert für die Adressfamilie (in Little-Endian), nicht signiert für die Portnummer, nicht signierte Ganzzahl für Flussinformationen, 16 Bytes für die Adresse, eine nicht signierte Intiere für die ID-ID. |
| bisschen | 1 Bit | Schreiben oder lesen Sie das Bit in den Puffer, nachdem Sie es abgeschlossen haben |
| schweben | 4 Bytes | IEEE 754 Einzelprezisions-Schwimmpunktzahl |
Sie können diese sofort definieren, ohne zu lesen, wie sie hergestellt wurden, wenn Sie Ihr Implemention schneller machen möchten.
| Name | Wert |
|---|---|
| Mtusize | 1492 |
| Udpheadersize | 28 |
| Publickeysize | 294 |
| RequstChallengesize | 64 |
| Antwortingcryptionkey | 128 |
| MaxNumberoflocaladdresse | 10 |
| Identitätsdicht | 294 |
| ClientproofSize | 32 |
| DefaultProtocolversion | 6 |
| Numberofarrangedstreams | 32 |
| Name | AUSWEIS | Typ |
|---|---|---|
| Unverbindlich | 0x01 | OFFLINE |
| UnnEContedPingopenconnections | 0x02 | OFFLINE |
| Nicht miteinander verbunden | 0x1c | OFFLINE |
| Verbinden | 0x00 | Online [von/bis Datagram] |
| ConnectedPong | 0x03 | Online [von/bis Datagram] |
| OpenConnectionRequestone | 0x05 | OFFLINE |
| OpenConnectionRepry | 0x06 | OFFLINE |
| OpenConnectionRequesttwo | 0x07 | OFFLINE |
| OpenConnectionReprytwo | 0x08 | OFFLINE |
| ConnectionRequest | 0x09 | Online [von/bis Datagram] |
| RemoteSystemRequirespublickey | 0x0a | OFFLINE |
| OurSystemRequiressecurity | 0x0b | Beide [?] |
| ConnectionTtemptFailed | 0x11 | OFFLINE |
| Bereits verbunden | 0x12 | OFFLINE |
| ConnectionRequestaccepted | 0x10 | Online [von/bis Datagram] |
| NewComingConnection | 0x13 | Online [von/bis Datagram] |
| TrennungNotifizierung | 0x15 | ONLINE |
| ConnectionLost | 0x16 | Beide [?] |
| InkompatibleProtokolversion | 0x19 | ONLINE |
Warten Sie auf ein nicht miteinander verbundenes Paket eines Kunden.
Warten Sie auf ein OpenConnectionRequestone -Paket eines Kunden.
Warten Sie auf ein OpenConnectionRequesttwo -Paket des Kunden.
Warten Sie vom Client auf Datagramme.
Senden Sie ein nicht miteinander verbundenes Paket an den Server.
Senden Sie ein OpenConnectionRequestone -Paket an den Server.
Senden Sie ein OpenConnectionRequestTtwo -Paket an den Server.
Senden Sie Datagramme an den Server.
Dieses Paket wird verwendet, um festzustellen, ob ein Server online ist oder nicht.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Nur repariertonopenconnections | bool | N / A | Wenn der Server auf TRUE eingestellt ist, sendet er nur eine Antwort, wenn die Verbindung des Clients zum Server derzeit geöffnet ist. Dies hilft zu verhindern, dass das Senden von Antworten an Kunden, die ihre Verbindungen geschlossen haben, gesendet werden. Die resultierende Nachrichten -ID für die Anfrage wäre UnconnectedPingOpenConnections . Wenn es auf False gesetzt ist, muss die Kennung keine Änderung sein. |
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| ClientsendTime | Uint64 | Big Endian | Client -Zeitstempel zur Berechnung der Latenz |
| Magie | Uint8 [16] | N / A | Magische Sequenz, um das Paket zu identifizieren |
| Clientguid | Uint64 | Big Endian | Eindeutige Kennung für den Kunden |
Dieses Paket ist die Reaktion auf ein nicht verbundenes Ping -Paket.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| ServersendTime | Uint64 | Big Endian | Server -Zeitstempel zur Berechnung der Latenz |
| Serverguid | Uint64 | Big Endian | Eindeutige Kennung für den Server |
| Magie | Uint8 [16] | N / A | Magische Sequenz, um das Paket zu identifizieren |
| Responsedata | Uint16-String | Big Endian | Antwortdaten, die normalerweise für Serverinformationen verwendet werden |
Dieses Paket wird verwendet, um die Verbindung zwischen dem Client und dem Server am Leben zu erhalten.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| ClientsendTime | Uint64 | Big Endian | Client -Zeitstempel zur Berechnung der Latenz |
Dieses Paket ist die Antwort auf ein angeschlossenes Ping -Paket.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| ClientsendTime | Uint64 | Big Endian | Client -Zeitstempel aus dem Ping |
| ServersendTime | Uint64 | Big Endian | Server -Zeitstempel zur Berechnung der Latenz |
Dieses Paket wird verwendet, um den Handshake -Prozess zwischen einem Client und einem Server zu initiieren.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Magie | Uint8 [16] | N / A | Magische Sequenz, um das Paket zu identifizieren |
| Protokollversion | Uint8 | N / A | Vom Client unterstützte Protokollversion |
| mtusize | Pad-mit Null | N / A | MTU -Größe des Clients maximale Übertragungseinheit (MTU) |
Wenn Sie Pad-with-Null verwenden, werden Sie zur MTU-Größe die aktuelle Leseposition plus 28 (UDP-Headergröße) zum Lesen hinzufügen. Lassen Sie die MTU -Größe zum Schreiben mit der aktuellen Puffer -Schreibposition (oder ihrer Größe) plus 28 (UDP -Headergröße) plus der aktuellen Puffergröße abziehen. Um den Paketpuffer zu validieren, prüfen Sie, ob seine Größe 28 (UDP -Headergröße) sowie die aktuelle Puffergröße beträgt.
Dieses Paket ist die Antwort auf eine offene Verbindungsanforderung ein Paket.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Magie | Uint8 [16] | N / A | Magische Sequenz, um das Paket zu identifizieren |
| Serverguid | Uint64 | Big Endian | Eindeutige Kennung für den Server |
| Serverhassecurity | bool | N / A | Ob der Server Sicherheit benötigt oder nicht |
| mtusize | Uint16 | Big Endian | MTU -Größe des Servers (Maximum Getriebeeinheit) |
Dieses Paket ist die Antwort auf eine offene Verbindungsanforderung ein Paket mit zusätzlichen Sicherheitsinformationen.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Magie | Uint8 [16] | N / A | Magische Sequenz, um das Paket zu identifizieren |
| Serverguid | Uint64 | Big Endian | Eindeutige Kennung für den Server |
| Serverhassecurity | bool | N / A | Ob der Server Sicherheit benötigt oder nicht |
| Hascookie | bool | N / A | Ob das Paket einen Keks enthält |
| Plätzchen | Uint32 | Big Endian | Kekswert |
| serverpublickey | Uint8 [294] | N / A | Öffentlicher Schlüssel zur Verschlüsselung verwendet |
| mtusize | Uint16 | Big Endian | MTU -Größe des Servers (Maximum Getriebeeinheit) |
Dieses Paket wird verwendet, um den Handshake -Prozess zwischen einem Client und einem Server abzuschließen.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Magie | Uint8 [16] | N / A | Magische Sequenz, um das Paket zu identifizieren |
| Serveraddress | Uint8 [7-29] | N / A | Server -IP -Adresse und Port -Kombination |
| mtusize | Uint16 | Big Endian | MTU -Größe des Clients maximale Übertragungseinheit (MTU) |
| Clientguid | Uint64 | Big Endian | Eindeutige Kennung für den Kunden |
Dieses Paket wird verwendet, um den Handshake -Prozess zwischen einem Client und einem Server abzuschließen.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Magie | Uint8 [16] | N / A | Magische Sequenz, um das Paket zu identifizieren |
| Plätzchen | Uint32 | Big Endian | Kekswert |
| enthält Schalenge | bool | N / A | Ob das System eine Handshake -Herausforderung erfordert |
| Herausforderung | Uint8 [64] | N / A | Das System Handshake Challenge Bytes Challenge Bytes |
| Serveraddress | Uint8 [7-29] | N / A | Server -IP -Adresse und Port -Kombination |
| mtusize | Uint16 | Big Endian | MTU -Größe des Clients maximale Übertragungseinheit (MTU) |
| Clientguid | Uint64 | Big Endian | Eindeutige Kennung für den Kunden |
Hinweis: Wenn das OpenConnectionRepry -Paket über Sicherheit verfügt, dieses Paket jedoch keine Herausforderung enthält, sollte der Client sofort ein Fernbedienungs -Paket senden, um den Server darüber zu benachrichtigen, dass es in der OpenConnectionRequesttwo keine Herausforderung gibt.
Sie können Ihre eigene Art zur Berechnung des Verbindungsergebnisses schreiben, aber dies ist der Standardweg.
Berechnung des VerbindungsOutcome :
bitwise and prüfen Sie, ob die folgenden Überprüfungen verwendet werden, und contains address und contains guid -Boolesche Werte.clientGuid bereits einem Client zugeordnet ist, der eine andere Client -Adresse hat, setzen Sie den Verbindungsstatus auf 3.clientGuid zugeordnet ist, setzen Sie den Verbindungsstatus auf 4.Sobald Sie das
ConnectionOutcomeberechnet haben, müssen Sie prüfen, ob es gleich 1 ist, und senden Sie dasOpenConnectionReplyTwo-Paket.
Wenn das
ConnectionOutcomenicht 0 ist, senden Sie dasAlreadyConnectedPaket.
Dieses Paket ist die Antwort auf eine offene Verbindungsanforderung mit zwei Paketen.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Magie | Uint8 [16] | N / A | Magische Sequenz, um das Paket zu identifizieren |
| Serverguid | Uint64 | Big Endian | Eindeutige Kennung für den Server |
| ClientAddress | Uint8 [7-29] | N / A | Client IP -Adresse und Port -Kombination |
| mtusize | Uint16 | Big Endian | MTU -Größe des Servers (Maximum Getriebeeinheit) |
| Erfordert | bisschen | N / A | Ob die Verbindung Verschlüsselung erfordert oder nicht |
| Verschlüsselung | Uint8 [128] | N / A | Der Verschlüsselungsschlüssel des Clients - er wird nur geschrieben oder gelesen, wenn das Feld requiresEncryption auf true eingestellt ist. |
Dieses Paket wird verwendet, um eine Verbindung zwischen einem Client und einem Server mit aktivierter oder deaktivierter Sicherheitsfunktionen herzustellen.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Clientguid | Uint64 | Big Endian | Eindeutige Kennung für den Kunden |
| ClientsendTime | Uint64 | Big Endian | Zeitstempel des Clients, wenn er angeschlossen wurde |
| Dosierung | bool | N / A | Ob die Verbindung Sicherheit erfordert oder nicht |
| kundensicher | Uint8 [32] | N / A | Nachweis der Client -Authentifizierung |
| Tatidentität | bool | N / A | Ob das Paket einen Identitätsbeweis erfordert |
| Identitätssicher | Uint8 [294] | N / A | Nachweis der Kundenidentität |
HINWEIS: Wenn der Identitätsbeweis ungültig ist und
doIdentityauf true festgelegt ist, senden Sie sofort einRemoteSystemRequiresPublicKey-Paket mit einer Typ -ID vonClientIdentityIsInvalid. WenndoIdentityauf False eingestellt ist und es keinen Identitätsbeweis gibt, senden Sie einRemoteSystemRequiresPublicKey-Paket mit einer Typ -ID derClientIdentityIsMissing.
Dieses Paket wird verwendet, um die Fehler in Bezug auf öffentliche Schlüsselanfragen für die Kundenauthentifizierung und Identifizierung zu werfen.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Typid | Uint8 | N / A | Art der öffentlichen Schlüsselanfrage |
| Name | AUSWEIS |
|---|---|
| Serverpublickeyismissing | 0 |
| Clientidentityismissing | 1 |
| ClientidentityISInvalid | 2 |
Dieses Paket wird gesendet, wenn der Server keine Sicherheit benötigt, aber immer noch obligatorisch ist.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| ClientAddress | Uint8 [7-29] | N / A | Client IP -Adresse und Port -Kombination |
| Serverguid | Uint64 | Big Endian | Eindeutige Kennung für den Server |
Dieses Paket wird gesendet, wenn die Versuchsanzahl versucht, sich dem Server anzuschließen als ein bestimmter Betrag (abhängig von Ihrer Implementierung), oder der Client enthält keine zugewiesene Adresse. Dies ist das, was Sie überprüfen und senden, wenn die Anforderungen erfüllt werden, bevor Sie das OpenConnectionRequestOne -Paket senden.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
Dieses Paket wird gesendet, wenn der Client bereits verbunden ist.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Magie | Uint8 [16] | N / A | Magische Sequenz, um das Paket zu identifizieren |
| Clientguid | Uint64 | Big Endian | Eindeutige Kennung für den Kunden |
Dieses Paket ist die Antwort auf eine Verbindungsanforderung mit aktivierter Sicherheit.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| ClientAddress | Uint8 [7-29] | N / A | Client IP -Adresse und Port -Kombination |
| ClientIndex | Uint16 | Big Endian | Einzigartige Kennung, die dem Client zugewiesen ist |
| ServerMachineaddresse | Adresse [10] | N / A | Server lokale Maschinenadressen |
| ClientsendTime | Uint64 | Big Endian | Zeitstempel für den Kunden |
| ServersendTime | Uint64 | Big Endian | Zeitstempel für den Server |
Dieses Paket wird an alle anderen Clients gesendet, wenn ein neuer Client eine Verbindung zum Server herstellt.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Serveraddress | Uint8 [7-29] | N / A | Server -IP -Adresse und Port -Kombination |
| ClientMachineadresse | Adresse [10] | N / A | Client lokale Maschinenadressen |
| ClientsendTime | Uint64 | Big Endian | Zeitstempel für den Kunden |
| ServersendTime | Uint64 | Big Endian | Zeitstempel für den Server |
Nachdem Sie dieses Paket an den Server gesendet oder empfangen haben, müssen Sie die Verbindung am Leben erhalten, indem Sie periodische ConnectedPing senden. Diese Pakete sind im Wesentlichen eine Möglichkeit zu sagen: "Hey, ich bin immer noch hier und bin mit dem Server verbunden." Der Server sendet auch ConnectedPong -Pakete als Antwort zurück, um zu bestätigen, dass die Verbindung noch aktiv ist. Dieser Ping-Pong-Prozess verhindert, dass die Verbindung aufgrund von Inaktivitäts- oder Netzwerkproblemen das Timing nicht mehr herausstellt.
Dieses Paket wird gesendet, wenn ein Client die Verbindung vom Server abnimmt.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
Dieses Paket wird gesendet, wenn eine Verbindung zu einem Client verloren geht.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Clientguid | Uint64 | Big Endian | Eindeutige Kennung für den Kunden |
| ClientAddress | Uint8 [7-29] | N / A | Client IP -Adresse und Port -Kombination |
Dieses Paket wird gesendet, wenn ein Client versucht, eine Verbindung zu einem Server mit einer inkompatiblen Protokollversion herzustellen.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Protokollversion | Uint8 | N / A | Protokollversion, die vom Server unterstützt wird |
| Magie | Uint8 [16] | N / A | Magische Sequenz, um das Paket zu identifizieren |
| Serverguid | Uint64 | Big Endian | Eindeutige Kennung für den Server |
Dieses Paket wird zum Senden und Empfangen von Daten zwischen Clients und dem Server verwendet. Es kann einer von drei Typen sein: ValidDatagram, Ackeddatagram oder NackedDatagram.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| isvalid | bisschen | N / A | Immer wahr |
| Isack | bisschen | N / A | Wenn wahr, ist das Paket ein Ackeddatagram |
| isnack | bisschen | N / A | Wenn wahr, ist das Paket ein Nackeddatagram |
Wenn
isAckundisNackbeide falsch sind, ist das Paket ein gültigesDatagramm.
Dieses Paket ist eine Antwort auf ein ValidDatagram, das angibt, dass der Server die Daten erhalten hat.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| erfordert Bandas | bisschen | N / A | Wenn wahr, enthält das Paket B und als Werte |
| B | schweben | Big Endian | Nicht benutzt |
| ALS | schweben | Big Endian | Datenankunftsrate |
| Bereiche | Reichweite | N / A | Array von Bereichswerten, die empfangen wurden |
Dieses Paket ist eine Antwort auf ein ValidDatagram, das angibt, dass der Server nicht alle erwarteten Daten erhalten hat.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Bereiche | Reichweite | N / A | Array von Bereichswerten, die nicht empfangen wurden |
Diese Struktur wird verwendet, um die Bereiche von Ackeddatagrammen und die fehlenden Bereiche von NackedDatagrams darzustellen.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Größe | Uint16 | Big Endian | Anzahl der Bereiche im Array |
| isssingle | bool | N / A | Wenn m max gleich ist, ist dies auf wahr gesetzt |
| min | Uint24 | Kleiner Endian | Mindestwert im Bereich |
| Max | Uint24 | Kleiner Endian | Maximaler Wert im Bereich - wird nicht geschrieben, wenn es Single ist |
Dieses Paket wird zum Senden und Empfangen von Daten zwischen Clients und dem Server verwendet.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ispacketpair | bisschen | N / A | Wenn wahr, ist das Paket eines von zwei zugehörigen Paketen |
| iscontinuousSend | bisschen | N / A | Wenn wahr, ist das Paket ein kontinuierliches Send -Paket |
| erfordert Bandas | bisschen | N / A | Wenn wahr, enthält das Paket B und als Werte |
| Rangernumber | Uint24 | Kleiner Endian | Die Sequenznummer des Datagramms |
| Kapseln | Datagramcapsel [] | N / A | Reihe von Kapseln im Paket |
Überprüfung auf beschädigte Anordnungskanäle : (Das gültige Datagramm muss "sequenziert und angeordnet sein (keine ACK -Quittung)).
Wenn arrangmentChannel größer ist oder der Anzahl der verfügbaren angeordneten Streams entspricht, die 2 ^ 5 sind, ist es korrekt (überspringen und tun, was benötigt wird).
Jeder gültige Datagrammanordnungstyp eines Array -Maximalwerts ist die Anzahl der ordnungsgemäßen Streams und darf nicht größer oder gleich sein.
Lochanzahl in empfangenen Datagrammen finden : (Das gültige Datagramm muss Reliable or in sequence sein, bevor er weiter fortfahren)
Sie müssen die Lochzahl in gültigen Datagrammen überprüfen, die Reliable or in sequence sind, und der Grund ist, nach ihrer Bestellung zu überprüfen, und es dient als Überprüfung, ob beim Senden oder in allen anderen Gründen eine Art fehlende gültige Datagramm -oder falsche rangeNumber verwendet wurde.
receivedPacketsBaseIndex : Es erhöht nur, wenn das gültige Datagramm Reliable or in sequence
receivedPacketQueue : Es ist etwas, das die rangeNumber des gültigen Datagramms als Schlüssel in der DS_Queue speichert und der Wert ist nicht wahr.
Um die Lochzahl zu finden, subtrahieren Sie die aktuell empfangene rangeNumber des Datagramms mit dem receivedPacketsBaseIndex und die Eigenschaft erhöht jedes Mal, wenn keine Lochzahl vorliegt ( receivedPacketsBaseIndex nur dann, wenn sie Reliable or in sequence abweichen).
receivedPacketQueue , wenn es vorhanden ist, und erhöhen Sie die receivedPacketsBaseIndex (vor-).uint24 ist, der bitwise right shifted ist es ein dupliziertes Paket (überspringen und tun, was benötigt wird).receivedPacketQueue -GrößereceivedPacketQueue ist und nicht gleich falsch ist, füllen Sie das Loch, indem Sie die Taste der Lochzahl in receivedPacketQueue mit einem Schlüssel ersetzen, dass der Wert gleich ist.Wenn diese angegebenen Bedingungen nicht erfüllt wurden, dann:
bitwise and dem uint32 -MAX -Wert bei Bedarf) größer ist als die receivedPacketQueue -Größe, füllen Sie ihn, indem Sie die wahren Werte in der Warteschlange drücken. Danach können Sie eine Schleife erstellen und prüfen, ob die Größe receivedPacketQueue größer als 0 ist und der erste Wert von receivedPacketQueue falsch ist und dann das letzte Element des receivedPacketQueue entfernen und dann die receivedPacketsBaseIndex erhöhen.
Danach können Sie die gültigen Datagramme normal behandeln.
Diese Struktur repräsentiert eine Kapsel in einem Validdatagramm.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Zuverlässigkeit | 3 Bit | Big Endian | Art der verwendeten Zuverlässigkeit |
| isSegmented | bisschen | N / A | Wenn wahr, ist das Paket segmentiert |
| Größe | Uint16 | Big Endian | Größe des Pufferfelds dort unten in Bits |
| ReliablecapsuleIndex | Uint24 | Kleiner Endian | Index verwendet für zuverlässige Pakete (es bedeutet, dass dies zuverlässig ist) |
| sequenziertCapsuleIndex | Uint24 | Kleiner Endian | Index für sequenzierte Pakete (dadurch bedeutet dies Zuverlässigkeit dafür) |
| Anordnung | Capsulearrangement | N / A | Anordnung der für sequenzierten und angeordneten Pakete verwendeten Kapsel (dadurch können Sie die Zuverlässigkeit verwenden) |
| Segment | Capsulesment | N / A | Segment der Kapsel, die beim Segmentieren der Kapsel verwendet wird |
| Puffer | Puffer | N / A | Pufferdaten, die die Daten enthalten, sollten über Netzwerke gesendet werden |
Diese Struktur repräsentiert die Anordnung einer Kapsel in einem Validdatagramm.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| arrangedCapsuleIndex | Uint24 | Kleiner Endian | Index der angeordneten Kapsel |
| ArrangementChannel | Uint8 | N / A | Kanal, der für die Anordnung verwendet wird |
Diese Struktur repräsentiert die Segmentierung einer Kapsel in einem Validdatagramm.
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Größe | Uint32 | Big Endian | Größe des Segments |
| Ausweis | Uint16 | Big Endian | Eindeutiger Kennung, die dem Segment zugeordnet sind |
| Index | Uint32 | Big Endian | Index des Segments |
Jedem in Raknet gesendeten Datagramm wird ein Zuverlässigkeits -Typid zugewiesen, mit dem angeben, wie die Daten vom Protokoll behandelt werden sollen. In der folgenden Tabelle werden die verfügbaren Zuverlässigkeitstypen und deren Eigenschaften aufgeführt:
| Name | AUSWEIS | Ist zuverlässig | Ist arrangiert | Wird sequenziert | Eigenschaften/Merkmale |
|---|---|---|---|---|---|
| Unzuverlässig | 0 | NEIN | NEIN | NEIN | Dieser Zuverlässigkeits -TypID sendet Datagramme ohne Garantien, dass sie am Ziel ankommen. Es wird garantiert nicht garantiert, dass sie in einer bestimmten Reihenfolge oder überhaupt nicht geliefert werden |
| Unreliabliert | 1 | NEIN | Ja | Ja | Dieser Zuverlässigkeits -Typid sendet Datagramme ohne Garantien, dass sie am Ziel ankommen, stellt jedoch sicher, dass sie in der von ihnen gesendeten Reihenfolge geliefert werden |
| Zuverlässig | 2 | Ja | NEIN | NEIN | Dieser Zuverlässigkeits -TypID sendet Datagramme, die garantiert in der von ihnen gesendeten Reihenfolge geliefert werden. Wenn ein Datagramm verloren geht, wird Raknet es übertragen, bis es vom Empfänger bestätigt wird |
| Reliblearranged | 3 | Ja | Ja | NEIN | Dieser Zuverlässigkeits -TypID sendet Datagramme, die garantiert in der von ihnen gesendeten Reihenfolge geliefert werden. Wenn ein Datagramm verloren geht, wird Raknet es nicht und alle Datagramme, die nicht bestätigt wurden |
| ReliableSequenced | 4 | Ja | Ja | Ja | Dieser Zuverlässigkeits -TypID sendet Datagramme, die garantiert in der von ihnen gesendeten Reihenfolge geliefert werden, und stellt sicher, dass sie nacheinander geliefert werden |
| Unzuverlässig mithackReceipt | 5 | NEIN | NEIN | NEIN | Dieser Zuverlässigkeits -TypID sendet Datagramme ohne Garantie, dass sie am Ziel ankommen, der Empfänger sendet jedoch nach Erhalt dieses Datagramms eine Bestätigungsbeleg |
| Zuverlässig mithackReceipt | 6 | Ja | NEIN | NEIN | Dieser Zuverlässigkeits -TypID sendet Datagramme, die garantiert in der von ihnen gesendeten Reihenfolge geliefert werden, und der Empfänger sendet nach Erhalt dieses Datagramms eine Bestätigungsbeleg |
| ReliBlearRangedWithackReceipt | 7 | Ja | Ja | NEIN | Dieser Zuverlässigkeits -TypID sendet Datagramme, die garantiert in der von ihnen gesendeten Reihenfolge geliefert werden, aber alle Datenagramme, die noch nicht bestätigt wurden, und der Empfänger sendet nach Erhalt dieses Datagramms eine Bestätigungsbeleg |
Hier finden Sie jede Zuverlässigkeitsdefinition, die an anderen Stellen bei der Dokumentation verwendet wird.
Sequenced und zuverlässig angeordnet und zuverlässig mit ACK Recepit angeordnetRAKNET verwendet eine selektive Wiederholungsübermittlung, um eine zuverlässige Zustellung von Datagrammen sicherzustellen. Wenn ein Datagramm gesendet wird, wird ihm eine Sequenznummer zugewiesen. Wenn ein Datagramm innerhalb eines bestimmten Zeitlimits nicht bestätigt wird, wird Raknet das Datagramm mit derselben Sequenznummer übertragen. Wenn der Empfänger ein doppeltes Datagramm mit derselben Sequenznummer erhält, kann er es verwerfen, da er diese Sequenznummer bereits bestätigt hat.
Ackqueue und Nackqueue werden verwendet, um den Überblick zu behalten, welche Datagramme bestätigt wurden und welche nicht. Der Ackqueue speichert eine Liste der Datagrammsequenznummern, die erfolgreich bestätigt wurden, während der Nackqueue eine Liste von Datagramm -Sequenznummern speichert, die nicht bestätigt wurden und erneut übertragen werden müssen. Wenn ein Datagramm mit einer bereits bestätigten Sequenznummer empfangen wird, kann es verworfen werden.
Paketpair ist eine von Raknet verwendete Technik zur Verbesserung der Effizienz von Datagrammübertragungen. Wenn ein Datagramm bestätigt wird, sendet Raknet auch das nächste Datagramm in der Sequenz. Auf diese Weise kann der Empfänger sofort mit der Verarbeitung des nächsten Datagramms beginnen, die Latenz verringern und den Durchsatz verbessern.
ContinuousSend ist eine Funktion von RakNet, mit der Datagramme kontinuierlich gesendet werden können, ohne auf Bestätigung zu warten. Dies kann die Leistung in einigen Fällen verbessern, kann jedoch auch zu Paketverlusten und -nachrichtungen führen, da der Absender vor dem Senden des nächsten Datagramms nicht auf Feedback wartet.
Raknet verwendet einen Zusammenbautenmechanismus, um segmentierte Datagramme zu rekonstruieren, die möglicherweise außerhalb der Reihenfolge empfangen werden. Wenn ein Datagramm segmentiert ist, wird jedem Segment ein eindeutiger Bezeichner zugewiesen. Wenn der Empfänger ein Segment erhält, wird er gepuffert, bis alle Segmente mit derselben Kennung empfangen wurden. Sobald alle Segmente empfangen wurden, werden sie in das ursprüngliche Datagramm wieder zusammengearbeitet.
Die Durchflussregelung ist ein RAKNET -Mechanismus, der zur Verwaltung der Datenübertragungsrate zwischen Absender und Empfänger verwendet wird. Es stellt sicher, dass der Empfänger die eingehenden Daten in einem Tempo behandeln kann, das er verarbeiten kann, wodurch überwältigend oder überflutet der Puffer des Empfängers verhindern oder überflutet wird. Durch die Durchflussregelung wird ein Gleichgewicht zwischen der Übertragungsgeschwindigkeit des Absenders und der Verarbeitungsfähigkeit des Empfängers aufrechterhalten und die Gesamtwirkungsgrad und Stabilität der Kommunikation optimiert.
Constion Manager hält die Überlastungskontrolle und überprüft nach übersprungenen Bereichszahlen, um Nacks zu senden, und andere Dinge.
TODO: Fügen Sie den Dokument hinzu
Die Überlastungskontrolle ist eine RAKNET -Technik, die zur Verhinderung von Netzwerküberlastungen durch Ausgleich von Datenübertragungsraten verwendet wird. Es werden Techniken wie TCP -Überlastungsregelung, Paketabfall, Ratenbegrenzung, Verkehrsformung, QoS und Lastausgleich verwendet. Diese Techniken gewährleisten eine zuverlässige Datenlieferung und eine effiziente Übertragung in Raknet.
Die Segmentierung in RAKNET verbessert die Datenzuweisung, indem große Nachrichten in kleinere Segmente unterteilt werden. Diese Segmente mit Kopfzeilen, die Position und Größe angeben, sorgen für eine erfolgreiche Zusammensetzung am Ende des Empfängers. Durch den Vergleich der Puffergröße mit der MTU -Größe (Maximum Getriebeeinheit) wird der Puffer die MTU für die Übertragung in Segmente aufgeteilt. Dieser Mechanismus in Raknet verhindert den Datenverlust, verwaltet große Nutzlasten und garantiert eine zuverlässige Übertragung in vernetzten Anwendungen.
"B" repräsentiert die Verbindungskapazität oder die maximale Datenmenge, die pro Sekunde über die Netzwerkverbindung übertragen werden können. Die Verbindungskapazität wird durch mehrere Faktoren bestimmt, einschließlich der Netzwerkinfrastruktur, der Netzwerkkonfiguration und der verfügbaren Ressourcen. Durch die Verwendung eines Float -Werts kann die Netzwerkkapazität genauer und genauer dargestellt werden, was eine bessere Nutzung der verfügbaren Ressourcen ermöglicht.
"As" repräsentiert die Datenankunftsrate, die die Rate ist, mit der die Daten vom Absender generiert und gesendet werden. Die Verwendung eines Schwimmerwerts ermöglicht eine genauere Darstellung der Ankunftsrate, die je nach Anwendungsanforderungen und Netzwerkbedingungen variieren kann. Durch den Vergleich der Ankunftsrate mit der Verbindungskapazität kann der Absender die Datenmenge bestimmen, die über die Netzwerkverbindung gesendet werden können, ohne eine Überlastung oder eine Abbau der Leistung zu verursachen.
Um die Größe der Kapsel zu bestimmen, können Sie folgende Schritte befolgen:
reliableCapsuleIndex darzustellen.sequencedCapsuleIndex darzustellen.arrangedCapsuleIndex und dann um 1 Schritt für das arrangementChannel .size , 2 Schritte für die id und 4 Schritte für den index des Segments. Die UserPackEtenum -ID ist 0x86 , wodurch der Beginn der Verwendung Ihrer benutzerdefinierten Paket -IDs markiert wird.
Es wird empfohlen, einen PacketAggregator zu erstellen, wenn man bedenkt, dass Sie eine abgeschlossene Implementierung haben, dann senden und empfangen.
Sie können eine ID uint8 limit Wahl einlegen UserPacketEnumID z UserPacketEnumID
Zum Beispiel: UserPacketEnumID + 22 = 0x9c
Eine einfache Paketstruktur, die zeigt, was der PacketAggregator sein kann:
| Feld | Typ | Endiangess | Notiz |
|---|---|---|---|
| Ausweis | Uint8 | N / A | Eindeutige Kennung des Pakets |
| Kompressionalgorithmus | Uint8 | Der Komprimierungsalgorithmus [kann keine sein, OpenSSL, Zlib, Gzip, Snappy, irgendetwas] | |
| Streams | Puffer[] | Ein Array von Paketströmen (jedes Element im Streams -Array repräsentiert einen Paketpuffer, der codiert wird/und im compressionAlgorithm dekodiert werden soll) |
Danach senden Sie es in den gültigen Datagrammkapsel/S -Puffer
Um ein Nicht-Raknet-Paket zu senden, bestimmen Sie zunächst, ob eine Segmentierung erforderlich ist, indem Sie vergleichen, ob die Größe der Kapselpuffer größer ist als die MTU-Größe minus 2 plus 3 plus 4-mal 1 (für die Daten-Byte-Byte-Länge des Dataagram) und die Subtrahiere von 11, wenn die Sicherheit verwendet wird. Subtrahieren Sie dann den angegebenen Wert mit der Kapselgröße. Wenn eine Segmentierung erforderlich ist, ist Segemnt den Stream der Kapsel vor dem Hinzufügen zur Übertragung der Datagrammwarteschlange. Wenn keine Segmentierung erforderlich ist, fügen Sie sie direkt zur Warteschlange hinzu. Denken Sie daran, dass segmentierte Pakete nicht unzuverlässig sein dürfen. Wenn dies der Fall ist, konvertieren Sie sie in zuverlässige Pakete, um eine erfolgreiche und bestellte Lieferung aller Paketteile zu gewährleisten.
Der Weg, es in Teile zu unterteilt:
Holen Sie sich die Kapselgröße und auch die Größe der Kapselpuffer, dann die Größe, mit der Sie überprüft werden, ob sie größer sind als die Größe der Kapselpuffer, und definieren Sie sie.
to get the count of how many segments is needed to be made: subtract the capsule buffer size with 1 then divide it with the size that you used to check if is greater than the capsule buffer size then sum them with 1 (not two times) or you can ceil instead of subtracting 1 and adding 1 at the end
then define a current segment index outside the loop and is 0 by default
then do a loop that will use the count of how many segments then the segmentation process will start:
after that define a variable representing start offset and it is equals to current segment index multiplied by the size that you used to check if is greater than the capsule buffer size
after that define a variable representing bytes to send that is equals to capsule buffer size subtracted by start offset
check if bytes to send is greater than the size that you used to check if is greater than the capsule buffer size and if true set the bytes to send value to the size that you used to check...
after that create a new variable representing the end offset
check if the bytes to send is not the size that you used to check if is greater than the capsule buffer size then set the end offset to the capsule buffer size subtracted by the current segment index multiplied by the size that you used to check if is greater than the capsule buffer size
if the check fails then the end offset will be the bytes to send
after that slice the capsule buffer with the start offset and end offset then you can do the feilds in the capsule.
you will need an array that has the capsules that contains the segments that will then be sent in queue.
the segment id will be the sender last segment id property that will increment outside the loop every time.
Here are a list of resources to help you better understand the RakNet protocol: