Il s'agit de la dernière documentation du protocole Raknet. Il comprend des informations sur les types de données utilisés dans le protocole et les détails sur chaque paquet et leurs champs associés.
TODO: Modifiez pour l'améliorer pour l'œil et supprimer beaucoup de choses inutiles. Et organisez également des choses, telles que les énumérations / constantes à 1 endroit, et supprime également des choses répétées.
Cette documentation suppose que vous souhaitez une méthode de sécurité similaire / même de LiBCAT, c'est pourquoi si le serveur que vous ciblez n'a pas Libcat ou autre chose que celui-ci, mais ils ont également une sécurité, le client se bloquera car ils ne vous donneront qu'un cookie, aucune preuve d'identité ou quoi que ce soit des goûts. Mais vous pouvez expulser la demande de support des deux cas.
| Taper | Taille | Note |
|---|---|---|
| uint8 | 1 octet | Entier 8 bits non signé |
| uint16 | 2 octets | Entier 16 bits non signé |
| uint24 | 3 octets | Entier 24 bits non signé avec une valeur minimale de 0 et une valeur maximale de 16777215 |
| uint32 | 4 octets | Entier 32 bits non signé |
| uint64 | 4/8 octets | Entier 64 bits non signé (4 octets pour les systèmes 32 bits, 8 octets pour les systèmes 64 bits) |
| Uint16-String | variable | UTF-8 String codé avec une longueur de 2 octets précédant la chaîne |
| magie | 16 octets | Un tableau d'entiers 8 bits non signés avec une séquence spécifique [0x00, 0xFF, 0xFF, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0x12, 0x34, 0x56, 0x78] |
| pad-with-zéro | variable | Octets nuls utilisés pour le rembourrage avec une taille de votre choix |
| bool | 1 octet | Écrivez ou lisez comme un entier 8 bits non signé, avec une valeur de 0 ou 1 (zéro est utilisé pour représenter False, et un est utilisé pour représenter True) |
| adresse | 7-29 octets | IPv4: 1 octet (version d'adresse), 4 octets (adresse IP), 2 octets (port), ipv6: 1 octet (version d'adresse), abrégé non signé pour la famille d'adresses (dans Little-Endan), abrégé non signé pour le numéro de port, entier non signé pour les informations de flux, 16 octets pour l'adresse, un entier non signé pour l'id à l'apogée. |
| peu | 1 bit | Écrivez ou lisez le bit à l'intérieur du tampon après l'avoir terminé |
| flotter | 4 octets | IEEE 754 Numéro de point flottant à une seule précision |
Vous pouvez définir instantanément ceux sans lire comment ils ont été fabriqués si vous souhaitez accélérer votre implémentation.
| Nom | Valeur |
|---|---|
| Se répercuter | 1492 |
| Udpheadersize | 28 |
| Publickeysize | 294 |
| Requiner | 64 |
| Répondant à la liaison | 128 |
| MaxnumberoflocalAddress | 10 |
| Identité | 294 |
| ClientproofSize | 32 |
| DefaultProtocolversion | 6 |
| Nombre de contraintes | 32 |
| Nom | IDENTIFIANT | Taper |
|---|---|---|
| Sans connexion | 0x01 | Hors ligne |
| Non connecté | 0x02 | Hors ligne |
| Non connecté | 0x1c | Hors ligne |
| Connecté | 0x00 | En ligne [de / vers datagram] |
| Connectépong | 0x03 | En ligne [de / vers datagram] |
| OpenConnectionRequestone | 0x05 | Hors ligne |
| Openconnectionreplyone | 0x06 | Hors ligne |
| Openconnectionrequesttwo | 0x07 | Hors ligne |
| Openconnectionreplytwo | 0x08 | Hors ligne |
| ConnectionRequest | 0x09 | En ligne [de / vers datagram] |
| Éloignement | 0x0a | Hors ligne |
| OurSystemRequireSecurity | 0x0b | LES DEUX [?] |
| ConnectionAtTemptFailed | 0x11 | Hors ligne |
| Déjà connecté | 0x12 | Hors ligne |
| Connexionrequestaccepted | 0x10 | En ligne [de / vers datagram] |
| NewIncomingConnection | 0x13 | En ligne [de / vers datagram] |
| Déconnection | 0x15 | EN LIGNE |
| Connexion | 0x16 | LES DEUX [?] |
| Protocolversion incompatible | 0x19 | EN LIGNE |
Attendez un paquet non connecté d'un client.
Attendez un paquet OpenConnectionRequestone d'un client.
Attendez un paquet OpenConnectionRequestTwo du client.
Attendez les datagrammes du client.
Envoyez un paquet non connecté au serveur.
Envoyez un paquet OpenConnectionRequestone au serveur.
Envoyez un paquet OpenConnectionRequestTwo au serveur.
Envoyer des datagrammes au serveur.
Ce paquet est utilisé pour déterminer si un serveur est en ligne ou non.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| uniquement les connexions | bool | N / A | S'il est défini sur true, le serveur n'enverra une réponse que si la connexion du client au serveur est actuellement ouverte. Cela aide à empêcher l'envoi de réponses aux clients qui ont fermé leurs connexions. L'ID de message résultant de la demande serait UnconnectedPingOpenConnections . S'il est défini sur False, l'identifiant n'aura pas besoin d'être modifié. |
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| CLIENTSENDTime | uint64 | Big endian | Horodatage client utilisé pour calculer la latence |
| magie | uint8 [16] | N / A | Séquence magique pour identifier le paquet |
| ClientGuid | uint64 | Big endian | Identifiant unique pour le client |
Ce paquet est la réponse à un paquet de ping non connecté.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| ServerSendTime | uint64 | Big endian | Horodatage du serveur utilisé pour calculer la latence |
| serveur | uint64 | Big endian | Identifiant unique pour le serveur |
| magie | uint8 [16] | N / A | Séquence magique pour identifier le paquet |
| réponses | Uint16-String | Big endian | Données de réponse généralement utilisées pour les informations du serveur |
Ce paquet est utilisé pour maintenir la connexion en vie entre le client et le serveur.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| CLIENTSENDTime | uint64 | Big endian | Horodatage client utilisé pour calculer la latence |
Ce paquet est la réponse à un paquet de ping connecté.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| CLIENTSENDTime | uint64 | Big endian | Horodatage client du ping |
| ServerSendTime | uint64 | Big endian | Horodatage du serveur utilisé pour calculer la latence |
Ce paquet est utilisé pour initier le processus de poignée de main entre un client et un serveur.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| magie | uint8 [16] | N / A | Séquence magique pour identifier le paquet |
| protocole | uint8 | N / A | Version protocole prise en charge par le client |
| se répercuter | pad-with-zéro | N / A | Taille maximale de transmission (MTU) du client |
Lorsque vous utilisez Pad-With-Zero, ajoutez à la taille MTU, la position de lecture actuelle plus 28 (taille de l'en-tête UDP) pour la lecture. Pour l'écriture, obtenez la taille MTU soustraite avec la position d'écriture de tampon actuelle (ou sa taille) plus 28 (taille d'en-tête UDP) plus la taille du tampon actuel. Pour valider le tampon de paquets, vérifiez si sa taille est de 28 (taille de l'en-tête UDP) plus la taille du tampon actuel.
Ce paquet est la réponse à une demande de connexion ouverte un paquet.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| magie | uint8 [16] | N / A | Séquence magique pour identifier le paquet |
| serveur | uint64 | Big endian | Identifiant unique pour le serveur |
| ServerHassecurity | bool | N / A | Que le serveur nécessite une sécurité ou non |
| se répercuter | uint16 | Big endian | Taille maximale de transmission (MTU) du serveur |
Ce paquet est la réponse à une demande de connexion ouverte un paquet avec des informations de sécurité supplémentaires.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| magie | uint8 [16] | N / A | Séquence magique pour identifier le paquet |
| serveur | uint64 | Big endian | Identifiant unique pour le serveur |
| ServerHassecurity | bool | N / A | Que le serveur nécessite une sécurité ou non |
| hascookie | bool | N / A | Si le paquet comprend un cookie |
| cookie | uint32 | Big endian | Valeur cookie |
| serverpublickey | uint8 [294] | N / A | Clé publique utilisée pour le cryptage |
| se répercuter | uint16 | Big endian | Taille maximale de transmission (MTU) du serveur |
Ce paquet est utilisé pour terminer le processus de poignée de main entre un client et un serveur.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| magie | uint8 [16] | N / A | Séquence magique pour identifier le paquet |
| serveraddress | uint8 [7-29] | N / A | Adresse IP du serveur et combo de port |
| se répercuter | uint16 | Big endian | Taille maximale de transmission (MTU) du client |
| ClientGuid | uint64 | Big endian | Identifiant unique pour le client |
Ce paquet est utilisé pour terminer le processus de poignée de main entre un client et un serveur.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| magie | uint8 [16] | N / A | Séquence magique pour identifier le paquet |
| cookie | uint32 | Big endian | Valeur cookie |
| Contient le calcul | bool | N / A | Si le système nécessite un défi de poignée de main |
| défi | uint8 [64] | N / A | Les octets de défi de poignée de main du système |
| serveraddress | uint8 [7-29] | N / A | Adresse IP du serveur et combo de port |
| se répercuter | uint16 | Big endian | Taille maximale de transmission (MTU) du client |
| ClientGuid | uint64 | Big endian | Identifiant unique pour le client |
Remarque: Si le paquet OpenConnectionReplyOne a une sécurité mais que ce paquet ne contient pas de défi, le client doit immédiatement envoyer un paquet de télécommandesRequirsPublicKey pour informer le serveur qu'il n'y avait pas de défi dans le paquet OpenConnectionRequestTwo.
Vous pouvez rédiger votre propre façon de calculer le résultat de la connexion, mais c'est ci-dessous le moyen standard.
Calcul de la connexion
bitwise and pour vérifier si les vérifications ci-dessous sont nécessaires à l'aide contains address et contains guid .clientGuid est déjà associé à un client qui a une adresse client différente, définissez l'état de connexion sur 3.clientGuid , définissez l'état de connexion sur 4.Une fois que vous avez calculé le
ConnectionOutcome, vous devrez vérifier s'il est égal à 1, puis envoyez le paquetOpenConnectionReplyTwo.
Si le
ConnectionOutcomen'est pas 0, envoyez le paquetAlreadyConnected.
Ce paquet est la réponse à une demande de connexion ouverte à deux paquets.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| magie | uint8 [16] | N / A | Séquence magique pour identifier le paquet |
| serveur | uint64 | Big endian | Identifiant unique pour le serveur |
| Clientaddress | uint8 [7-29] | N / A | Adresse IP du client et combo de port |
| se répercuter | uint16 | Big endian | Taille maximale de transmission (MTU) du serveur |
| requiert la recherche | peu | N / A | Que la connexion nécessite un cryptage ou non |
| cryptage | uint8 [128] | N / A | La clé de cryptage du client - elle n'est écrite ou lue que si le champ requiresEncryption est défini sur true. |
Ce paquet est utilisé pour établir une connexion entre un client et un serveur avec sécurité activée ou désactivée.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| ClientGuid | uint64 | Big endian | Identifiant unique pour le client |
| CLIENTSENDTime | uint64 | Big endian | Horodatage du client lorsqu'il a demandé à être connecté |
| dosécurité | bool | N / A | Que la connexion nécessite une sécurité ou non |
| à l'épreuve du client | uint8 [32] | N / A | Preuve d'authentification du client |
| domestique | bool | N / A | Si le paquet nécessite une preuve d'identité |
| à l'épreuve de l'identité | uint8 [294] | N / A | Preuve de l'identité du client |
Remarque: Si la preuve d'identité n'est pas valide et
doIdentityest défini sur true, envoyez immédiatement un paquetRemoteSystemRequiresPublicKeyavec un ID de type deClientIdentityIsInvalid. SidoIdentityest défini sur False et qu'il n'y a pas de preuve d'identité, envoyez un paquetRemoteSystemRequiresPublicKeyavec un ID de type deClientIdentityIsMissing.
Ce paquet est utilisé pour lancer les erreurs liées aux demandes de clés publiques pour l'authentification et l'identification du client.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| typeid | uint8 | N / A | Type de demande de clé publique |
| Nom | IDENTIFIANT |
|---|---|
| ServerpublicKeyismissing | 0 |
| ClientIdentityishipsing | 1 |
| ClientIdentityisinvalid | 2 |
Ce paquet est envoyé lorsque le serveur ne nécessite pas de sécurité mais qu'il est toujours obligatoire.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| Clientaddress | uint8 [7-29] | N / A | Adresse IP du client et combo de port |
| serveur | uint64 | Big endian | Identifiant unique pour le serveur |
Ce paquet est envoyé lorsque le nombre de tentatives qui essaie de rejoindre le serveur est supérieur à un certain montant (dépend de votre implémentation) ou que le client ne contient pas d'adresse assignée; C'est ce que vous vérifiez et envoyez si les exigences sont satisfaites avant d'envoyer le paquet OpenConnectionRequestOne .
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
Ce paquet est envoyé lorsque le client est déjà connecté.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| magie | uint8 [16] | N / A | Séquence magique pour identifier le paquet |
| ClientGuid | uint64 | Big endian | Identifiant unique pour le client |
Ce paquet est la réponse à une demande de connexion avec la sécurité activée.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| Clientaddress | uint8 [7-29] | N / A | Adresse IP du client et combo de port |
| ClientIndex | uint16 | Big endian | Identifiant unique affecté au client |
| Servermachinadress | adresse [10] | N / A | Adresses de la machine locale du serveur |
| CLIENTSENDTime | uint64 | Big endian | Horodatage pour le client |
| ServerSendTime | uint64 | Big endian | Horodatage pour le serveur |
Ce paquet est envoyé à tous les autres clients lorsqu'un nouveau client se connecte au serveur.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| serveraddress | uint8 [7-29] | N / A | Adresse IP du serveur et combo de port |
| ClientMachineAddress | adresse [10] | N / A | Adresses de la machine locale du client |
| CLIENTSENDTime | uint64 | Big endian | Horodatage pour le client |
| ServerSendTime | uint64 | Big endian | Horodatage pour le serveur |
Après avoir envoyé ou reçu ce paquet au serveur, vous devez garder la connexion en vie en envoyant des paquets ConnectedPing périodiques. Ces paquets sont essentiellement un moyen de dire "Hé, je suis toujours là et connecté au serveur." Le serveur renvoie également les paquets ConnectedPong en réponse pour confirmer que la connexion est toujours active. Ce processus de ping-pong aide à empêcher la connexion de sortir en raison de problèmes d'inactivité ou de réseau.
Ce paquet est envoyé lorsqu'un client se déconnecte du serveur.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
Ce paquet est envoyé lorsqu'une connexion à un client est perdue.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| ClientGuid | uint64 | Big endian | Identifiant unique pour le client |
| Clientaddress | uint8 [7-29] | N / A | Adresse IP du client et combo de port |
Ce paquet est envoyé lorsqu'un client tente de se connecter à un serveur avec une version de protocole incompatible.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| protocole | uint8 | N / A | Version protocole prise en charge par le serveur |
| magie | uint8 [16] | N / A | Séquence magique pour identifier le paquet |
| serveur | uint64 | Big endian | Identifiant unique pour le serveur |
Ce paquet est utilisé pour envoyer et recevoir des données entre les clients et le serveur. Il peut s'agir de l'un des trois types: Validdatagram, AckedDatagram ou NackedDatagram.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| isvalide | peu | N / A | Toujours vrai |
| Isack | peu | N / A | Si c'est vrai, le paquet est un ackeddatagram |
| ne fait pas partie | peu | N / A | Si c'est vrai, le paquet est un nackeddatagram |
Si
isAcketisNacksont tous deux faux, le paquet est un validdatagram.
Ce paquet est une réponse à un validdatagram indiquant que le serveur a reçu les données.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| Biblebandas | peu | N / A | Si c'est vrai, le paquet comprend B et AS |
| B | flotter | Big endian | Non utilisé |
| COMME | flotter | Big endian | Taux d'arrivée des données |
| gammes | Gamme | N / A | Tableau de valeurs de plage qui ont été reçues |
Ce paquet est une réponse à un validdatagram indiquant que le serveur n'a pas reçu toutes les données attendues.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| gammes | Gamme | N / A | Tableau de valeurs de plage qui n'ont pas été reçues |
Cette structure est utilisée pour représenter les gammes de datagrams Ackeddatagrams et les gammes manquantes de nackeddatagrams.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| taille | uint16 | Big endian | Nombre de gammes dans le tableau |
| tisser | bool | N / A | Si min est égal à max, alors cela est défini sur true |
| min | uint24 | Peu endian | Valeur minimale dans la plage |
| max | uint24 | Peu endian | La valeur maximale dans la plage - n'est pas écrite si elle est unique |
Ce paquet est utilisé pour envoyer et recevoir des données entre les clients et le serveur.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| Ispacketpair | peu | N / A | Si c'est vrai, le paquet est l'un des deux paquets associés |
| IscontinuousSennd | peu | N / A | Si c'est vrai, le paquet est un paquet d'envoi continu |
| Biblebandas | peu | N / A | Si c'est vrai, le paquet comprend B et AS |
| rangenobumber | uint24 | Peu endian | Le numéro de séquence du datagramme |
| capsules | DatagramCapsule [] | N / A | Tableau de capsules dans le paquet |
Vérification des canaux d'arrangement corrompus : (le datagramme valide doit être `` séquencé et organisé (pas de reçu ACK))
Si arrangmentChannel est plus élevé ou est égal au nombre de flux disposés disponibles qui est 2 ^ 5, il est conforme (sautez et faites ce qui est nécessaire).
Chaque type d'arrangement de datagramme valide d'une valeur maximale de tableau est le nombre de flux organisés et ne doit pas être plus élevé ou égal à.
Trouver le nombre de trou dans les datagrammes reçus : (Le datagramme valide doit être Reliable or in sequence avant de poursuivre)
Vous devrez vérifier le nombre de trous dans des datagrammes valides qui est Reliable or in sequence et la raison est de vérifier leur commande et il sert de vérification s'il y avait une sorte de datagramme valide manquant que rangeNumber a été utilisé dans l'envoi ou quoi que ce soit d'autre.
receivedPacketsBaseIndex : il n'incrémente que si un datagramme valide Reliable or in sequence
receivedPacketQueue : C'est quelque chose qui stocke le rangeNumber de datagramme valide comme la clé de la liste et sa valeur n'est pas vraie non pas le datagramme, il peut être faux, mais après avoir rencontré certaines coditions qui seront énoncées ci-dessous (faux signifie que nous l'avons obtenu avec succès et véritable signifie que nous n'avons pas obtenu de succès) et que sa structure de données est un DS_Queue (vérifiez l'original Raknet pour l'implance).
Pour trouver le nombre de trous, soumettez le rangeNumber de Datagramme valide reçue actuel avec le receivedPacketsBaseIndex et cette propriété incrémente à chaque fois qu'il n'y a pas de nombre de trous ( receivedPacketsBaseIndex uniquement s'il Reliable or in sequence ).
receivedPacketQueue s'il existe et ajoutez (pré-) incrément le receivedPacketsBaseIndex .uint24 qui est bitwise right shifted de 1, il s'agit d'un paquet dupliqué (sauter et faire ce qui est nécessaire).receivedPacketQueuereceivedPacketQueue et n'est pas égal à FAUX, remplissez le trou en remplaçant la clé du nombre de trou dans receivedPacketQueue par une clé que sa valeur est égale à FALSE.Si ces conditions indiquaient pas, alors:
bitwise and la valeur maximale uint32 si nécessaire) est supérieur à la taille de la receivedPacketQueue , remplissez-le en poussant de vraies valeurs dans la file d'attente. Après cela, vous pouvez créer une boucle et vérifier si la taille receivedPacketQueue est supérieure à 0 et la première valeur de receivedPacketQueue est fausse, puis supprimez le dernier élément de la receivedPacketQueue puis incrémentez les receivedPacketsBaseIndex .
Après cela, vous pouvez gérer normalement les datagrammes valides.
Cette structure représente une capsule dans un validdatagram.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| fiabilité | 3 bits | Big endian | Type de fiabilité utilisée |
| iSSEGED | peu | N / A | Si c'est vrai, le paquet est segmenté |
| taille | uint16 | Big endian | Taille du champ tampon là-bas en bits |
| reliabecapsuleIndex | uint24 | Peu endian | Index utilisé pour les paquets fiables (cela signifie utiliser la fiabilité pour cela) |
| séquencécapsuleIndex | uint24 | Peu endian | Index utilisé pour les paquets séquencés (cela signifie utiliser la fiabilité pour cela) |
| arrangement | Capsulearrangement | N / A | Arrangement de la capsule utilisée pour les paquets séquencés et disposés (cela signifie utiliser la fiabilité pour cela) |
| segment | Capsuuleux | N / A | Segment de la capsule utilisée lorsque la capsule est segmentée |
| tampon | Tampon | N / A | Les données de tampon contenant les données souhaitaient être envoyées via des réseaux |
Cette structure représente la disposition d'une capsule dans un validdatagram.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| ArrangéCapsuleIndex | uint24 | Peu endian | Index de la capsule disposée |
| arrangement | uint8 | N / A | Canal utilisé pour l'arrangement |
Cette structure représente la segmentation d'une capsule dans un validdatagramme.
| Champ | Taper | Endication | Note |
|---|---|---|---|
| taille | uint32 | Big endian | Taille du segment |
| identifiant | uint16 | Big endian | Identifiant unique associé au segment |
| indice | uint32 | Big endian | Index du segment |
Chaque datagramme envoyé dans Raknet se voit attribuer un type de fiabilité qui spécifie comment les données doivent être gérées par le protocole. Le tableau suivant répertorie les typeides de fiabilité disponibles et leurs propriétés:
| Nom | IDENTIFIANT | Est fiable | Est disposé | Est séquencé | Caractéristiques / caractéristiques |
|---|---|---|---|---|---|
| Peu fiable | 0 | Non | Non | Non | Cette fiabilité TypeID envoie des datagrammes sans aucune garantie qu'ils arriveront à destination. Ils ne sont pas garantis d'être livrés dans une commande spécifique ou du tout |
| Sans file d'attente | 1 | Non | Oui | Oui | Cette fiabilité TypeID envoie des datagrammes sans garantie qu'ils arriveront à destination mais garantit qu'ils sont livrés dans la séquence, ils ont été envoyés |
| Fiable | 2 | Oui | Non | Non | Cette fiabilité TypeID envoie des datagrammes garantis pour être livrés dans l'ordre où ils ont été envoyés. Si un datagramme est perdu, Raknet le retransmettra jusqu'à ce qu'il soit reconnu par le récepteur |
| Reloyant | 3 | Oui | Oui | Non | Cette fiabilité TypeID envoie des datagrammes garantis pour être livrés dans l'ordre où ils ont été envoyés. Si un datagramme est perdu, Raknet ne le retransmettra pas et tous les datagrammes devant lui qui n'ont pas été reconnus |
| Filiabelesedendend | 4 | Oui | Oui | Oui | Cette fiabilité TypeID envoie des datagrammes garantis pour être livrés dans la commande, ils ont été envoyés et garantit qu'ils sont livrés séquentiellement |
| Peu fiable avec | 5 | Non | Non | Non | Cette fiabilité TypeID envoie des datagrammes sans garantie qu'ils arriveront à destination, mais le récepteur envoie un reçu d'accusé de réception à la réception de ce datagramme |
| Fiablewithackreceipt | 6 | Oui | Non | Non | Cette fiabilité TypeID envoie des datagrammes garantis pour être livrés dans l'ordre, ils ont été envoyés, et le récepteur envoie un reçu de réception à la réception de ce datagramme |
| ReliabeLarged withthackreceipt | 7 | Oui | Oui | Non | Cette fiabilité TypeID envoie des datagrammes garantis pour être livrés dans l'ordre, ils ont été envoyés, mais tous les datagrammes devant lui qui n'ont pas été reconnus, et le récepteur envoie un reçu d'accusé de réception à la réception de ce datagramme |
Ici, vous pouvez trouver chaque définition de fiabilité qui est utilisée dans d'autres endroits dans la documentation.
Sequenced et fiable organisée et fiable disposée avec ACK RecipitRaknet utilise la retransmission de répétitions sélective pour assurer une livraison fiable des datagrammes. Lorsqu'un datagramme est envoyé, il se voit attribuer un numéro de séquence. Si un datagramme n'est pas reconnu dans un certain délai d'attente, Raknet retransmettra le datagramme en utilisant le même numéro de séquence. Lorsque le récepteur reçoit un datagramme en double avec le même numéro de séquence, il peut le supprimer, car il a déjà reconnu ce numéro de séquence.
L'Ackqueue et Nackqueue sont utilisés pour garder une trace des datagrammes ont été reconnus et qui ne l'ont pas fait. L'Ackqueue stocke une liste de numéros de séquence de datagramme qui ont été reconnus avec succès, tandis que le Nackqueue stocke une liste de numéros de séquence de données qui n'ont pas été reconnus et doivent être retransmis. Lorsqu'un datagramme est reçu avec un numéro de séquence qui a déjà été reconnu, il peut être rejeté.
PacketPair est une technique utilisée par Raknet pour améliorer l'efficacité des retransmissions de datagram. Lorsqu'un datagramme est reconnu, Raknet envoie également le datagramme suivant dans la séquence. Cela permet au récepteur de commencer à traiter immédiatement le datagramme suivant, en réduisant la latence et en améliorant le débit.
ContinuousSend est une caractéristique de Raknet qui permet à l'envoi en continu sans attendre de l'accusé de réception. Cela peut améliorer les performances dans certains cas, mais peut également entraîner la perte de paquets et les retransmissions, car l'expéditeur n'attend pas les commentaires avant d'envoyer le prochain datagramme.
Raknet utilise un mécanisme de réassemblage pour reconstruire des datagrammes segmentés qui peuvent être reçus de l'ordre. Lorsqu'un datagramme est segmenté, chaque segment se voit attribuer un identifiant unique. Lorsque le récepteur reçoit un segment, il est tamponné jusqu'à ce que tous les segments avec le même identifiant aient été reçus. Une fois tous les segments reçus, ils sont réassemblés dans le datagramme d'origine.
Le contrôle du débit est un mécanisme RAKNET utilisé pour gérer le taux de transmission de données entre l'expéditeur et le récepteur. Il garantit que le récepteur peut gérer les données entrantes à un rythme qu'elle peut traiter, empêchant un écrasant ou débordant le tampon du récepteur. Le contrôle du débit aide à maintenir un équilibre entre la vitesse de transmission de l'expéditeur et la capacité de traitement du récepteur, optimisant l'efficacité globale et la stabilité de la communication.
Le gestionnaire de congestion détient le contrôle de la congestion, vérifiant les numéros de portée sautés pour envoyer des nacks et d'autres choses.
TODO: Ajouter le doc
Le contrôle de la congestion est une technique RAKNET utilisée pour empêcher la congestion du réseau en équilibrant les taux de transmission des données. Des techniques telles que le contrôle de la congestion TCP, la baisse des paquets, la limitation des taux, la mise en forme du trafic, la QoS et l'équilibrage de la charge sont utilisés. Ces techniques garantissent une livraison de données fiable et une transmission efficace dans Raknet.
La segmentation dans Raknet améliore la livraison des données en divisant de grands messages en segments plus petits. Ces segments, avec des en-têtes indiquant la position et la taille, assurent un réassemblage réussi du côté du récepteur. En comparant la taille du tampon à la taille maximale de l'unité de transmission (MTU), si le tampon dépasse le MTU, il est divisé en segments de transmission. Ce mécanisme dans Raknet empêche la perte de données, gère des charges utiles importantes et garantit une transmission fiable dans les applications en réseau.
"B" représente la capacité de liaison ou la quantité maximale de données qui peuvent être transmises par seconde sur la liaison réseau. La capacité de liaison est déterminée par plusieurs facteurs, y compris l'infrastructure réseau, la configuration du réseau et les ressources disponibles. En utilisant une valeur flottante, la capacité du réseau peut être représentée plus précisément et précisément, permettant une meilleure utilisation des ressources disponibles.
"As" représente le taux d'arrivée des données, qui est la vitesse à laquelle les données sont générées et envoyées par l'expéditeur. L'utilisation d'une valeur flottante permet une représentation plus précise du taux d'arrivée, qui peut varier en fonction des exigences de l'application et des conditions du réseau. En comparant le taux d'arrivée avec la capacité de liaison, l'expéditeur peut déterminer la quantité de données qui peuvent être envoyées sur la liaison du réseau sans provoquer une congestion ou une dégradation des performances.
Pour déterminer la taille de la capsule, vous pouvez suivre ces étapes:
reliableCapsuleIndex .sequencedCapsuleIndex .arrangedCapsuleIndex , puis par 1 étape pour la arrangementChannel .size , 2 étapes pour l' id et 4 étapes pour l' index du segment. L'ID UserPackeTetenum est 0x86 , qui marque le début de votre point de vue d'utiliser vos ID de paquets personnalisés.
Ce qui est recommandé, c'est de créer un PacketAggregator étant donné que vous avez une implémentation terminée, puis envoyez-la et recevez.
Vous pouvez mettre un identifiant de votre choix, comme: UserPacketEnumID + votre propre identifiant (il ne doit pas faire dépasser la uint8 limit UserPacketEnumID
Par exemple: UserPacketEnumID + 22 = 0x9c
Une structure de paquets simple présentant ce que le PacketAggregator peut être:
| Champ | Taper | Endication | Note |
|---|---|---|---|
| identifiant | uint8 | N / A | Identifiant unique du paquet |
| compressionalgorithme | uint8 | L'algorithme de compression [peut être aucun, OpenSSL, ZLIB, GZIP, Snappy, n'importe quoi] | |
| ruisseaux | tampon[] | Un tableau de flux de paquets (chaque élément du tableau des flux représente un tampon de paquets codé / et doit être décodé dans le compressionAlgorithm ) |
Après cela, vous l'enverrez dans le tampon de capsule / s valide
Pour envoyer un paquet non raknet, déterminez d'abord si la segmentation est nécessaire en comparant si la taille du tampon de capsule est supérieure à la taille MTU moins 2, plus 3, plus 4 fois 1 (pour la longueur d'octet d'en-tête de données du datagramme) et en soustrayant 11 si la sécurité est utilisée. Ensuite, soustrayez la valeur donnée avec la taille de la capsule. Si la segmentation est nécessaire, ségelez le flux de la capsule avant de l'ajouter à la file d'attente de datagram pour la transmission. Si aucune segmentation n'est requise, ajoutez-la directement à la file d'attente. N'oubliez pas que les paquets segmentés ne doivent pas être peu fiables; S'ils le sont, convertissez-les en paquets fiables pour garantir la livraison réussie et commandée de toutes les pièces de paquets.
Le chemin de le segmenter en parties:
get the capsule size and also the capsule buffer size then the size that you used to check if is greater than the capsule buffer size and define them.
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: