Это последняя документация по протоколу Raknet. Он включает информацию о типах данных, используемых в протоколе, и подробности о каждом пакете и связанных с ними полях.
TODO: изменить, чтобы сделать его лучше для глаз и удалить много бесполезных вещей. А также организуйте вещи, такие как перечисления/константы в 1 месте, а также удаляйте повторяющиеся вещи.
В этой документации предполагается, что вы хотите аналогичный/тот же метод безопасности Libcat, поэтому, если на сервере, на котором вы нацелены, нет Libcat или того же, что и то же самое, но у них также есть безопасность, клиент будет сбоем, потому что он будет только предоставить вам файл cookie, никаких личности или чего -либо из лайков. Но вы можете получить запрос на поддержку обоих случаев.
| Тип | Размер | Примечание |
|---|---|---|
| uint8 | 1 байт | Неподписанное 8-битное целое число |
| uint16 | 2 байта | Неподписанное 16-битное целое число |
| uint24 | 3 байта | 24-битное целое число с минимальным значением 0 и максимальным значением 16777215 |
| uint32 | 4 байта | Unsigned 32-разрядное целое число |
| uint64 | 4/8 байтов | Unsigned 64-разрядное целое число (4 байта для 32-битных систем, 8 байтов для 64-битных систем) |
| uint16-string | переменная | Кодированная строка UTF-8 с длиной 2 байта, предшествующих строке |
| магия | 16 байтов | Массив не знаковых 8-битных целых чисел с определенной последовательности [0x00, 0xFF, 0xFF, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0x12, 0x34, 0x56, 0x78] |
| Pad-with-ra | переменная | Нулевые байты, используемые для прокладки с размером по вашему выбору |
| буль | 1 байт | Напишите или прочитайте как одно беззнательное 8-битное целое число, со значением 0 или 1 (ноль используется для представления FALSE, и один используется для представления True) |
| адрес | 7-29 байтов | IPv4: 1 байт (адресная версия), 4 байта (IP-адрес), 2 байта (порт), IPv6: 1 байт (адресная версия), не знака о короткометражном семействе адресов (в Little-Endian), не знаком с коротким номером порта, Unsigned Integer для информации о потоке, 16 байтов для адреса, беззначенный интеральный идентификатор Scope. |
| кусочек | 1 бит | Напишите или прочитайте бит внутри буфера после его завершения |
| плавать | 4 байта | IEEE 754 с одноодежным номером с плавающей запятой |
Вы можете мгновенно определить их, не читая, как они были сделаны, если вы хотите сделать свое реализацию быстрее.
| Имя | Ценить |
|---|---|
| Mtusize | 1492 |
| Udpheadersize | 28 |
| Publickeisize | 294 |
| Requstchallengesize | 64 |
| Ответчингкипциякей | 128 |
| Maxnumberoflocaladdresses | 10 |
| IdentityProofsize | 294 |
| ClientProofSize | 32 |
| По умолчанию протоколверсия | 6 |
| Числофарфрангедстерисы | 32 |
| Имя | ИДЕНТИФИКАТОР | Тип |
|---|---|---|
| Не связанный | 0x01 | В автономном режиме |
| Неосвязанные подключения | 0x02 | В автономном режиме |
| Не связанный с ними | 0x1c | В автономном режиме |
| Подключение | 0x00 | Онлайн [от/до datagram] |
| ConnectedPong | 0x03 | Онлайн [от/до datagram] |
| OpenConnectionRequestone | 0x05 | В автономном режиме |
| OpenConnectionReplyOne | 0x06 | В автономном режиме |
| OpenConnectionRequesttwo | 0x07 | В автономном режиме |
| OpenConnectionReplyTwo | 0x08 | В автономном режиме |
| ConnectionRequest | 0x09 | Онлайн [от/до datagram] |
| RemoteSystemRequirSpublickey | 0x0a | В автономном режиме |
| OreSystemRequireSecurity | 0x0b | ОБА [?] |
| ConnectionTemplefailed | 0x11 | В автономном режиме |
| Уже подключен | 0x12 | В автономном режиме |
| ConnectionRequestaccepted | 0x10 | Онлайн [от/до datagram] |
| NewincommingConnection | 0x13 | Онлайн [от/до datagram] |
| Разъединение | 0x15 | Онлайн |
| ConnectionLost | 0x16 | ОБА [?] |
| Несовместимая протоколверсия | 0x19 | Онлайн |
Подождите не связанный пакет от клиента.
Подождите пакет OpenConnectionRequestone от клиента.
Подождите пакет OpenConnectionRequesttwo от клиента.
Подождите Datagrams от клиента.
Отправьте не подключенный пакет на сервер.
Отправьте на сервер пакет OpenConnectionRequestone.
Отправьте пакет OpenConnectionRequesttwo на сервер.
Отправить Datagrams на сервер.
Этот пакет используется для определения того, является ли сервер онлайн или нет.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| Только replyonopenceNctions | буль | N/a | Если установлено в True, сервер отправит ответ только в случае открытия подключения клиента с сервером. Это помогает предотвратить отправку ответов клиентам, которые закрыли свои соединения. Полученным идентификатором сообщения для запроса будет UnconnectedPingOpenConnections . Если установить на FALSE, то идентификатор не должен быть изменен. |
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| ClientsendTime | uint64 | Большой эндиан | Неэппредактивная метка времени клиента, используемая для расчета задержки |
| магия | uint8 [16] | N/a | Волшебная последовательность для идентификации пакета |
| ClientGuid | uint64 | Большой эндиан | Уникальный идентификатор для клиента |
Этот пакет является ответом на не связанный пакет Ping.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| ServersendTime | uint64 | Большой эндиан | Серверные временные метки, используемая для расчета задержки |
| ServerGuid | uint64 | Большой эндиан | Уникальный идентификатор для сервера |
| магия | uint8 [16] | N/a | Волшебная последовательность для идентификации пакета |
| Ответы | uint16-string | Большой эндиан | Данные ответа, обычно используемые для информации о сервере |
Этот пакет используется для поддержания соединения между клиентом и сервером.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| ClientsendTime | uint64 | Большой эндиан | Неэппредактивная метка времени клиента, используемая для расчета задержки |
Этот пакет является ответом на подключенный пакет Ping.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| ClientsendTime | uint64 | Большой эндиан | Наблюдение за временем клиента из пинга |
| ServersendTime | uint64 | Большой эндиан | Серверные временные метки, используемая для расчета задержки |
Этот пакет используется для инициирования процесса рукопожатия между клиентом и сервером.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| магия | uint8 [16] | N/a | Волшебная последовательность для идентификации пакета |
| протоколверсия | uint8 | N/a | Версия протокола поддерживается клиентом |
| Mtusize | Pad-with-ra | N/a | Максимальный размер блока передачи (MTU) клиента |
При использовании Pad-with-Zero добавьте в размер MTU текущую позицию считывания плюс 28 (размер заголовка UDP) для чтения. Для написания, размер MTU вычтет с текущей позицией записи буфера (или его размера) плюс 28 (размер заголовка UDP) плюс текущий размер буфера. Чтобы проверить буфер пакетов, проверьте, является ли его размер 28 (размер заголовка UDP) плюс текущий размер буфера.
Этот пакет является ответом на открытый запрос на соединение один пакет.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| магия | uint8 [16] | N/a | Волшебная последовательность для идентификации пакета |
| ServerGuid | uint64 | Большой эндиан | Уникальный идентификатор для сервера |
| Serverhassecurity | буль | N/a | Требует ли сервера безопасности или нет |
| Mtusize | uint16 | Большой эндиан | Максимальный размер блока передачи (MTU) сервера |
Этот пакет является ответом на открытый запрос на соединение один пакет с дополнительной информацией о безопасности.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| магия | uint8 [16] | N/a | Волшебная последовательность для идентификации пакета |
| ServerGuid | uint64 | Большой эндиан | Уникальный идентификатор для сервера |
| Serverhassecurity | буль | N/a | Требует ли сервера безопасности или нет |
| Хаскуки | буль | N/a | Включает ли пакет печенье |
| печенье | uint32 | Большой эндиан | Ценность печенья |
| ServerPublickey | uint8 [294] | N/a | Открытый ключ, используемый для шифрования |
| Mtusize | uint16 | Большой эндиан | Максимальный размер блока передачи (MTU) сервера |
Этот пакет используется для завершения процесса рукопожатия между клиентом и сервером.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| магия | uint8 [16] | N/a | Волшебная последовательность для идентификации пакета |
| ServerAddress | uint8 [7-29] | N/a | IP -адрес сервера и порт комбо |
| Mtusize | uint16 | Большой эндиан | Максимальный размер блока передачи (MTU) клиента |
| ClientGuid | uint64 | Большой эндиан | Уникальный идентификатор для клиента |
Этот пакет используется для завершения процесса рукопожатия между клиентом и сервером.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| магия | uint8 [16] | N/a | Волшебная последовательность для идентификации пакета |
| печенье | uint32 | Большой эндиан | Ценность печенья |
| содержит | буль | N/a | Требует ли система рукопожатия. |
| испытание | uint8 [64] | N/a | System Handshake Challenge Bytes |
| ServerAddress | uint8 [7-29] | N/a | IP -адрес сервера и порт комбо |
| Mtusize | uint16 | Большой эндиан | Максимальный размер блока передачи (MTU) клиента |
| ClientGuid | uint64 | Большой эндиан | Уникальный идентификатор для клиента |
ПРИМЕЧАНИЕ. Если в пакете OpenConnectionReplyOne есть безопасность, но этот пакет не содержит задачи, клиент должен немедленно отправить пакет remoteSystemRequirSpublickey, чтобы уведомить сервер, что в пакете OpenConnectionRequestTwo не было проблем.
Вы можете написать свой собственный способ вычисления результата соединения, но это стандартный способ.
Расчет ConnectionAtcome :
bitwise and проверить, необходимы ли приведенные ниже проверки с использованием contains address и contains guid Bulean значения.clientGuid уже связан с клиентом, который имеет другой адрес клиента, установите состояние соединения на 3.clientGuid , установите состояние соединения на 4.После того, как вы рассчитали
ConnectionOutcome, вам нужно будет проверить, будет ли он равен 1, а затем отправьте пакетOpenConnectionReplyTwo.
Если
ConnectionOutcomeне 0, отправьтеAlreadyConnectedпакет.
Этот пакет является ответом на запрос на открытый подключение к двум пакетам.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| магия | uint8 [16] | N/a | Волшебная последовательность для идентификации пакета |
| ServerGuid | uint64 | Большой эндиан | Уникальный идентификатор для сервера |
| ClientAddress | uint8 [7-29] | N/a | IP -адрес клиента и порт комбо |
| Mtusize | uint16 | Большой эндиан | Максимальный размер блока передачи (MTU) сервера |
| Требуется задержка | кусочек | N/a | Требует ли соединение шифрование или нет |
| шифрование | uint8 [128] | N/a | Ключ шифрования клиента - он написан или читается только в том случае, если полевое requiresEncryption установлено на TRUE. |
Этот пакет используется для установления соединения между клиентом и сервером с включенной или отключенной безопасностью.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| ClientGuid | uint64 | Большой эндиан | Уникальный идентификатор для клиента |
| ClientsendTime | uint64 | Большой эндиан | TimeStamp of Client, когда он попросил подключиться |
| Досещательность | буль | N/a | Требует ли соединение безопасности или нет |
| ClientProof | uint8 [32] | N/a | Доказательство аутентификации клиента |
| DoideIdentity | буль | N/a | Требуется ли пакет доказательство идентификации |
| идентификационная защита | uint8 [294] | N/a | Доказательство личности клиента |
ПРИМЕЧАНИЕ. Если доказательство идентификации является недействительным, а
doIdentityустановлена на True, немедленно отправьте пакетRemoteSystemRequiresPublicKeyс идентификатором типаClientIdentityIsInvalid. ЕслиdoIdentityустановлена на FALSE, и нет никакого доказательства личности, отправьте пакетRemoteSystemRequiresPublicKeyс типом идентификаторомClientIdentityIsMissing.
Этот пакет используется для того, чтобы бросить ошибки, связанные с запросами открытого ключа для аутентификации и идентификации клиента.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| тип | uint8 | N/a | Тип запроса на открытый ключ |
| Имя | ИДЕНТИФИКАТОР |
|---|---|
| ServerPublicKeyismissing | 0 |
| ClientIdentityIssing | 1 |
| ClientIdentityIsInvalid | 2 |
Этот пакет отправляется, когда сервер не требует безопасности, но он все еще является обязательным.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| ClientAddress | uint8 [7-29] | N/a | IP -адрес клиента и порт комбо |
| ServerGuid | uint64 | Большой эндиан | Уникальный идентификатор для сервера |
Этот пакет отправляется, когда подсчет попыток, попытка присоединиться к серверу, выше, чем определенная сумма (в зависимости от вашей реализации), или клиент не содержит назначенный адрес; Это то, что вы проверяете и отправляете, если требования выполняются перед отправкой пакета OpenConnectionRequestOne .
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
Этот пакет отправляется, когда клиент уже подключен.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| магия | uint8 [16] | N/a | Волшебная последовательность для идентификации пакета |
| ClientGuid | uint64 | Большой эндиан | Уникальный идентификатор для клиента |
Этот пакет является ответом на запрос на подключение с включенной безопасностью.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| ClientAddress | uint8 [7-29] | N/a | IP -адрес клиента и порт комбо |
| ClientIndex | uint16 | Большой эндиан | Уникальный идентификатор, назначенный клиенту |
| Servermachineaddresses | адрес [10] | N/a | Адреса локальной машины сервера |
| ClientsendTime | uint64 | Большой эндиан | Временная лагерь для клиента |
| ServersendTime | uint64 | Большой эндиан | Временная метка для сервера |
Этот пакет отправляется всем остальным клиентам, когда новый клиент подключается к серверу.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| ServerAddress | uint8 [7-29] | N/a | IP -адрес сервера и порт комбо |
| ClientMachineadDresses | адрес [10] | N/a | Адреса локальной машины клиента |
| ClientsendTime | uint64 | Большой эндиан | Временная лагерь для клиента |
| ServersendTime | uint64 | Большой эндиан | Временная метка для сервера |
После того, как вы отправите или получите этот пакет на сервер, вам необходимо сохранить соединение, отправив периодические ConnectedPing пакеты. Эти пакеты, по сути, способ сказать: «Эй, я все еще здесь и подключен к серверу». Сервер также отправляет пакеты ConnectedPong кне в ответ, чтобы подтвердить, что соединение все еще активно. Этот процесс Ping-Pong помогает предотвратить выезд подключения из-за неактивности или проблем с сетью.
Этот пакет отправляется, когда клиент отключается от сервера.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
Этот пакет отправляется, когда соединение с клиентом теряется.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| ClientGuid | uint64 | Большой эндиан | Уникальный идентификатор для клиента |
| ClientAddress | uint8 [7-29] | N/a | IP -адрес клиента и порт комбо |
Этот пакет отправляется, когда клиент пытается подключиться к серверу с несовместимой версией протокола.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| протоколверсия | uint8 | N/a | Версия протокола, поддерживаемая сервером |
| магия | uint8 [16] | N/a | Волшебная последовательность для идентификации пакета |
| ServerGuid | uint64 | Большой эндиан | Уникальный идентификатор для сервера |
Этот пакет используется для отправки и получения данных между клиентами и сервером. Это может быть один из трех типов: ValidDatagram, Ackeddatagram или Nackeddatagram.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| Isvalid | кусочек | N/a | Всегда верно |
| Исак | кусочек | N/a | Если правда, пакет - это ackeddatagram |
| ISNACK | кусочек | N/a | Если это правда, пакет - это nackeddatagram |
Если
isAckиisNackоба ложны, пакет является ValidEdatram.
Этот пакет является ответом на ValidDatagram, указывающий, что сервер получил данные.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| Требуется бандса | кусочек | N/a | Если правда, пакет включает в себя B и как значения |
| Беременный | плавать | Большой эндиан | Не используется |
| КАК | плавать | Большой эндиан | Коэффициент прибытия данных |
| диапазоны | Диапазон | N/a | Массив значений диапазона, которые были получены |
Этот пакет является ответом на ValidDatagram, указывающий, что сервер не получил все ожидаемые данные.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| диапазоны | Диапазон | N/a | Массив значений диапазона, которые не были получены |
Эта структура используется для представления диапазонов ackeddatagrams и отсутствующих диапазонов Nackeddatagrams.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| размер | uint16 | Большой эндиан | Количество диапазонов в массиве |
| истец | буль | N/a | Если мин равен макс, то это установлено на истину |
| мин | uint24 | Маленький Эндиан | Минимальное значение в диапазоне |
| максимум | uint24 | Маленький Эндиан | Максимальное значение в диапазоне - не написано, если не одиноко |
Этот пакет используется для отправки и получения данных между клиентами и сервером.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| ispacketpair | кусочек | N/a | Если правда, пакет является одним из двух связанных пакетов |
| Iscontinourysend | кусочек | N/a | Если правда, пакет - это пакет с непрерывной отправкой |
| Требуется бандса | кусочек | N/a | Если правда, пакет включает в себя B и как значения |
| РАСПОЛОЖЕНИЕ | uint24 | Маленький Эндиан | Номер последовательности Datagram |
| капсулы | Datagramcapsule [] | N/a | Массив капсул в пакете |
Проверка на коррумпированные каналы договоренности : (Действительная дейтаграмма должна быть «секвенирована и организована» (без квитанции ACK))
Если arrangmentChannel больше или равна количеству доступных расположенных потоков, которые составляют 2 ^ 5, то он соответствует (пропустите и сделайте то, что необходимо).
Каждый действительный тип расположения Datagram максимального значения - это количество расположенных потоков и не должно быть больше или равна.
Поиск количества отверстий в полученных данных : (Действительная дейтаграмма должна быть Reliable or in sequence прежде чем продолжить)
Вам необходимо будет проверить количество отверстий в действительных данных, которые являются Reliable or in sequence и причина в том, чтобы проверить их заказ, и он служит проверкой, если в отправке была использована какая -то отсутствующая допустимая дейтаграмма или неправильный rangeNumber .
receivedPacketsBaseIndex : он увеличивает только если допустимая Reliable or in sequence
receivedPacketQueue : Это то, что хранит в качестве ключа в списке « rangeNumber действительной патограммы», и его значение является истинной, а не докутаграмма, она может быть ложной, но после встречи с некоторыми кодициями, которые будут указаны ниже (ложь означает, что мы получили его успешно, и истинные означает, что мы не получили его успешно), и его структура данных является DS_Queue (оригинальный raknet для Impt).
Чтобы найти счетчик отверстий, вычитайте текущий полученный действительный инструмент rangeNumber с помощью receivedPacketsBaseIndex , и что свойство увеличивает каждый раз, когда нет количества отверстий ( receivedPacketsBaseIndex только при увеличении, если Reliable or in sequence ).
receivedPacketQueue , если она существует, и добавьте (предварительно) увеличить receivedPacketsBaseIndex .uint24 , которое bitwise right shifted на 1, то это дублированный пакет (пропустите и делайте то, что необходимо).receivedPacketQueue меньше размераreceivedPacketQueue и не равно false, заполните отверстие, заменив ключ количества отверстий в receivedPacketQueue с ключом, что его значение равно false.Если эти условия заявили, не были встречены тогда:
bitwise and значение uint32 MAX, если это необходимо) больше, чем размер receivedPacketQueue , заполните его, выдвигая истинные значения в очереди. После этого вы можете создать цикл и проверить, больше ли размер receivedPacketQueue больше 0, а первое значение receivedPacketQueue - это ложное, затем удалите последний элемент receivedPacketQueue , а затем увеличивает receivedPacketsBaseIndex .
После этого вы можете обрабатывать действительные Datagrams обычно.
Эта структура представляет капсулу в ValidDatagram.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| надежность | 3 бита | Большой эндиан | Тип используемой надежности |
| Issemed | кусочек | N/a | Если правда, пакет сегментирован |
| размер | uint16 | Большой эндиан | Размер буферного поля внизу в битах |
| Reliablecapsuleindex | uint24 | Маленький Эндиан | Индекс, используемый для надежных пакетов (это означает использование надежности для этого) |
| SequenceCapsuleIndex | uint24 | Маленький Эндиан | Индекс, используемый для секвенированных пакетов (это означает использование надежности для этого) |
| договоренность | Капсулеолеку | N/a | Расположение капсулы, используемой для секвенированных и расположенных пакетов (это означает использование надежности для этого) |
| сегмент | Капсулезегмент | N/a | Сегмент капсулы, используемой при сегментировании капсулы |
| буфер | Буфер | N/a | Буферные данные, содержащие данные, хотели отправлять через сети |
Эта структура представляет собой расположение капсулы в ValidDatagram.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| ArangedCapsuleIndex | uint24 | Маленький Эндиан | Индекс расположенной капсулы |
| ArancementChannel | uint8 | N/a | Канал, используемый для расположения |
Эта структура представляет собой сегментацию капсулы в ValidDatagram.
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| размер | uint32 | Большой эндиан | Размер сегмента |
| идентификатор | uint16 | Большой эндиан | Уникальный идентификатор, связанный с сегментом |
| индекс | uint32 | Большой эндиан | Индекс сегмента |
Каждому фактограмму, отправляемой в Raknet, назначается тип надежности, который указывает, как данные должны обрабатывать протоколом. В следующей таблице перечислены доступные типы надежности и их свойства:
| Имя | ИДЕНТИФИКАТОР | Надежен | Расположен | Секвенировано | Характеристики/особенности |
|---|---|---|---|---|---|
| Ненадежный | 0 | Нет | Нет | Нет | Этот тип надежности отправляет Datagrams без каких -либо гарантий, что они прибудут в пункт назначения. Они не гарантированно будут доставлены в каком -либо конкретном порядке или вообще |
| Unreliablesequend | 1 | Нет | Да | Да | Этот тип надежности отправляет Datagrams без каких -либо гарантий, что они прибудут в пункт назначения, но гарантируют, что они доставляются в последовательности, которую они были отправлены |
| Надежный | 2 | Да | Нет | Нет | Этот тип надежности отправляет Datagrams, гарантированно поставленные в заказ, который они были отправлены. Если Datagram потерян, Raknet повторно передает его до тех пор, пока не будет подтвержден получателем |
| Надежный | 3 | Да | Да | Нет | Этот тип надежности отправляет Datagrams, гарантированно поставленные в заказ, который они были отправлены. Если Datagram потерян, Raknet не будет повторять его и все данные Datagrams, которые не были подтверждены |
| Reliablesequend | 4 | Да | Да | Да | Этот тип надежности отправляет Datagrams, гарантированно поставленные в заказ, который они были отправлены, и гарантирует, что они поставляются последовательно |
| Ненадежный withackReceipt | 5 | Нет | Нет | Нет | Этот тип надежности отправляет DATAGRAM без каких -либо гарантий, что они прибудут в пункт назначения, но получатель отправляет квитанцию о подтверждении после получения этой Datagram |
| Надежный withackReceipt | 6 | Да | Нет | Нет | Этот тип надежности отправляет Datagrams, гарантированно поставленные в заказ, который был отправлен, и получатель отправляет квитанцию о подтверждении при получении данной Datagram |
| Reliablearrangedwithackreceipt | 7 | Да | Да | Нет | Этот тип надежности отправляет Datagrams, гарантированно предоставленные в заказе, который они были отправлены, но все Datagrams перед ним, которые не были подтверждены, и получатель отправляет квитанцию о подтверждении после получения этой Datagram |
Здесь вы можете найти все определения надежности, которое используется в других местах в документации.
Sequenced и надежной расположенной и надежной расположенной с ACK RecepitRaknet использует выборочную повторную повторную передачу для обеспечения надежной доставки данных. При отправке Datagram ему присваивается номер последовательности. Если Datagram не подтверждается в течение определенного периода времени ожидания, Raknet повторно передает Datagram, используя тот же номер последовательности. Когда приемник получает дубликат Datagram с одинаковым номером последовательности, он может отказаться от нее, поскольку уже подтвердил этот номер последовательности.
Ackqueue и Nackqueue используются для отслеживания того, какие фактограммы были признаны, а какие нет. В Ackqueue хранится список номеров последовательностей данных, которые были успешно признаны, в то время как Nackqueue хранит список номеров последовательностей Datagram, которые не были признаны и должны быть повторно переданы. Когда датаграмма получается с номером последовательности, который уже был признан, ее можно отказаться.
PacketPair - это метод, используемый Raknet для повышения эффективности повторных данных Datagram. Когда датаграмма признана, Raknet отправляет следующую дейтаграмму и в последовательности. Это позволяет получателю немедленно начать обработку следующей дейтаграммы, уменьшая задержку и повышая пропускную способность.
Непрерывная сторона - это функция Raknet, которая позволяет постоянно отправлять Datagrams, не ожидая подтверждения. Это может улучшить производительность в некоторых случаях, но также может привести к потере пакетов и ретрансмиссиям, поскольку отправитель не ждет отзывы перед отправкой следующей дейтаграммы.
Raknet использует механизм повторной сборки для восстановления сегментированных дейтаграмм, которые могут быть получены вне порядка. Когда параграмма сегментирован, каждому сегменту присваивается уникальный идентификатор. Когда приемник получает сегмент, он буферируется до тех пор, пока не будут получены все сегменты с одним и тем же идентификатором. Как только все сегменты были получены, они восстанавливаются в исходной датаграмме.
Управление потоком - это механизм Raknet, используемый для управления скоростью передачи данных между отправителем и приемником. Это гарантирует, что приемник может обрабатывать входящие данные в темпе, которые он может обрабатывать, предотвращая подавляющую или переполняющую буфер приемника. Управление потоком помогает поддерживать баланс между скоростью передачи отправителя и возможностями обработки приемника, оптимизируя общую эффективность и стабильность связи.
Менеджер заторов удерживает контроль за перегрузкой, проверяя пропущенные номера диапазонов, чтобы отправить NACKS и другие вещи.
Тодо: Добавьте документ
Контроль заторов - это метод Raknet, используемый для предотвращения перегрузки сети путем балансировки скоростей передачи данных. Используются методы, такие как контроль перегрузки TCP, пакет пакетов, ограничение скорости, формирование трафика, QoS и балансировка нагрузки. Эти методы обеспечивают надежную доставку данных и эффективную передачу в Raknet.
Сегментация в Raknet усиливает доставку данных, деляя большие сообщения на более мелкие сегменты. Эти сегменты, с заголовками, указывающими положение и размер, обеспечивают успешную повторную сборку на конце приемника. Сравнивая размер буфера с размером максимальной передачи (MTU), если буфер превышает MTU, он разделен на сегменты для передачи. Этот механизм в Raknet предотвращает потерю данных, управляет большими полезными нагрузками и гарантирует надежную передачу в сетевых приложениях.
«B» представляет собой емкость ссылки или максимальный объем данных, которые могут быть переданы в секунду по сетевой ссылке. Емкость ссылки определяется несколькими факторами, включая сетевую инфраструктуру, конфигурацию сети и доступные ресурсы. Используя значение плавающего, мощность сети может быть представлена более точно и точно, что позволяет лучше использовать доступные ресурсы.
«Как» представляет скорость прибытия данных, которая является скоростью, с которой данные генерируются и отправляются отправителем. Использование значения поплавки позволяет получить более точное представление скорости прибытия, что может варьироваться в зависимости от требований приложения и условий сети. Сравнивая скорость прибытия с емкостью ссылки, отправитель может определить объем данных, которые могут быть отправлены по ссылке сети, не вызывая заторов или деградации производительности.
Чтобы определить размер капсулы, вы можете выполнить эти шаги:
reliableCapsuleIndex .sequencedCapsuleIndex .arrangedCapsuleIndex , а затем на 1 шаг для arrangementChannel .size , 2 шага для id и 4 шага для index сегмента. Идентификатор userpacketenum - 0x86 , что отмечает начало того, где вы можете начать использовать свои пользовательские идентификаторы пакетов.
Рекомендуется создать PacketAggregator учитывая, что у вас есть завершенная реализация, а затем отправьте и получите его.
Вы можете поместить идентификатор по вашему выбору, например: UserPacketEnumID + ваш собственный идентификатор (он не должен заставлять UserPacketEnumID превзойти uint8 limit )
Например: UserPacketEnumID + 22 = 0x9c
Простая структура пакета, демонстрирующая то, каким может быть PacketAggregator :
| Поле | Тип | Эндианство | Примечание |
|---|---|---|---|
| идентификатор | uint8 | N/a | Уникальный идентификатор пакета |
| Compressionalgorithm | uint8 | Алгоритм сжатия [может быть никто, OpenSSL, Zlib, Gzip, Snappy, Anything] | |
| потоки | буфер [] | Массив пакетных потоков (каждый элемент в массиве потоков представляет собой буфер пакетов, который кодируется/должен быть декодирован в compressionAlgorithm ) |
После этого вы отправите его в действующем буфере CAPSULE/S Datagram Capsule/S
Чтобы отправить пакет без raknet, сначала определите, требуется ли сегментация, сравнивая, больше ли размер капсулы больше, чем размер MTU минус 2 плюс 3 плюс, плюс 4 раза 1 (для байтовой длины заголовка данных) и вычитается 11, если используется безопасность. Затем вычтите заданное значение с размером капсулы. Если сегментация необходима, выделите поток капсулы, прежде чем добавить его в очередь данных для передачи. Если сегментация не требуется, добавьте ее непосредственно в очередь. Remember, segmented packets must not be unreliable; if they are, convert them to reliable packets to guarantee successful and ordered delivery of all packet parts.
The way to segment it into parts:
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: