Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Minecraft:RakNet: Difference between revisions

From SAS Gaming Wiki
SyncBot (talk | contribs)
Sync: updated from Minecraft
SyncBot (talk | contribs)
Sync: updated from Minecraft
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
{{Exclusive|bedrock}}
{{Exclusive|bedrock}}


'''RakNet'''<ref>http://www.jenkinssoftware.com/</ref> is a networking library and protocol for multiplayer games. It runs over UDP and provides connection management, configurable reliability and ordering, sequencing, and fragmentation.
'''RakNet''' is a networking library and protocol for multiplayer games. It runs over [[Minecraft:wikipedia:User_Datagram_Protocol|UDP]] and provides connection management, configurable reliability and ordering, sequencing, and fragmentation.


UDP does not guarantee delivery or ordering. RakNet supports different delivery modes, so applications can request reliability or ordering when needed.
[[Minecraft:wikipedia:User_Datagram_Protocol|UDP]] does not guarantee delivery or ordering. RakNet supports different delivery modes, so applications can request reliability or ordering when needed.


The source code for RakNet is available in the [https://github.com/OculusVR/RakNet/ OculusVR archive].
The source code for RakNet is available in the [https://github.com/facebookarchive/RakNet archived source repository].


== Use in Bedrock Edition ==
== Use in Bedrock Edition ==


In [[Minecraft:Bedrock Edition]], [[Minecraft:NetherNet]] became the default transport for dedicated servers in [[Minecraft:26.50]]. RakNet is deprecated in the [[Minecraft:26.60.22]] Preview.
[[Minecraft:NetherNet]] became the default transport for [[Minecraft:Bedrock Dedicated Server]] in [[Minecraft:26.50]].<ref>{{cite|url=https://www.minecraft.net/en-us/article/minecraft--bedrock-edition-26-50-changelog|title=Minecraft: Bedrock Edition 26.50 Changelog|website=Minecraft.net}}</ref> RakNet is deprecated in [[Minecraft:26.60]], which removes client support for it.<ref>{{cite|url=https://feedback.minecraft.net/hc/en-us/articles/48740748263565-Minecraft-Beta-Preview-26-60-22-23|title=Minecraft Beta & Preview - 26.60.22/23|website=Minecraft Feedback}}</ref>
 
== Libraries ==
== Libraries ==


Here is an incomplete list of RakNet libraries. Their supported features and protocol versions may differ, so check each project's documentation for compatibility.
The following libraries implement RakNet. Supported features and protocol versions vary between implementations.


{| class="wikitable sortable" style="width: auto; text-align: center;"
{| class="wikitable sortable" style="width: auto; text-align: center;"
Line 23: Line 22:
  |-
  |-
  ! [https://github.com/sandertv/go-raknet go-raknet]
  ! [https://github.com/sandertv/go-raknet go-raknet]
  | RakNet implementation used by [https://github.com/df-mc/dragonfly Dragonfly].
  | style="text-align: left;" | RakNet implementation written in Go.
  | Go
  | Go
  | MIT
  | MIT
  |-
  |-
  ! [https://github.com/NetrexMC/RakNet RakNet]
  ! [https://github.com/NetrexMC/RakNet RakNet]
  | Asynchronous RakNet implementation written in Rust.
  | style="text-align: left;" | Asynchronous RakNet implementation written in Rust.
  | Rust
  | Rust
  | Apache-2.0
  | Apache-2.0
  |-
  |-
  ! [https://github.com/PieMC-Dev/PieRakNet PieRakNet]
  ! [https://github.com/PieMC-Dev/PieRakNet PieRakNet]
  | RakNet implementation written in Python for [https://github.com/PieMC-Dev/PieMC PieMC].
  | style="text-align: left;" | RakNet implementation written in Python.
  | Python
  | Python
  | GPL-3.0
  | GPL-3.0
  |-
  |-
  ! [https://github.com/CloudburstMC/Network Cloudburst Network]
  ! [https://github.com/CloudburstMC/Network Cloudburst Network]
  | Network components used by CloudburstMC projects.
  | style="text-align: left;" | Network components used by CloudburstMC projects.
  | Java
  | Java
  | Apache-2.0
  | Apache-2.0
  |-
  |-
  ! [https://github.com/Podrum/rak_net rak-net]
  ! [https://github.com/Podrum/rak_net rak-net]
  | Python RakNet implementation originally developed for Podrum.
  | style="text-align: left;" | Python RakNet implementation originally developed for Podrum.
  | Python
  | Python
  | GPL-2.0
  | GPL-2.0
  |-
  |-
  ! [https://github.com/whirvis/JRakNet JRakNet]
  ! [https://github.com/whirvis/JRakNet JRakNet]
  | Java implementation of the RakNet protocol.
  | style="text-align: left;" | Java implementation of the RakNet protocol.
  | Java
  | Java
  | MIT
  | MIT
  |-
  |-
  ! [https://github.com/yesdog/netty-raknet netty-raknet]
  ! [https://github.com/yesdog/netty-raknet netty-raknet]
  | RakNet implementation for Netty.
  | style="text-align: left;" | RakNet implementation for Netty.
  | Java
  | Java
  | MIT
  | MIT
  |-
  |-
  ! [https://github.com/alejzeis/JRakLibPlus JRakLibPlus]
  ! [https://github.com/alejzeis/JRakLibPlus JRakLibPlus]
  | RakNet server library based on RakLib and JRakLib.
  | style="text-align: left;" | RakNet server library based on RakLib and JRakLib.
  | Java
  | Java
  | LGPL
  | LGPL-3.0
  |-
  |-
  ! [https://github.com/pmmp/RakLib RakLib]
  ! [https://github.com/pmmp/RakLib RakLib]
  | Lightweight PHP RakNet server implementation.
  | style="text-align: left;" | Lightweight PHP RakNet server implementation.
  | PHP
  | PHP
  | GPL-3.0
  | GPL-3.0
  |-
  |-
  ! [https://www.npmjs.com/package/raknet/ raknet]
  ! [https://www.npmjs.com/package/raknet/ raknet]
  | UDP networking library for Node.js that follows the RakNet protocol.
  | style="text-align: left;" | UDP networking library for Node.js that follows the RakNet protocol.
  | JavaScript
  | JavaScript
  | MIT
  | MIT
  |-
  |-
  ! [https://pypi.org/project/PyRakLib/ PyRakLib]
  ! [https://pypi.org/project/PyRakLib/ PyRakLib]
  | Python port of RakLib that follows the RakNet protocol.
  | style="text-align: left;" | Python port of RakLib that follows the RakNet protocol.
  | Python
  | Python
  | GPL
  | GPL
  |-
  |-
  ! [https://github.com/b23r0/rust-raknet rust-raknet]
  ! [https://github.com/b23r0/rust-raknet rust-raknet]
  | RakNet implementation written in Rust.
  | style="text-align: left;" | RakNet implementation written in Rust.
  | Rust
  | Rust
  | MIT
  | MIT
  |-
  |-
  ! [https://github.com/SerenityJS/Baltica Baltica]
  ! [https://github.com/SerenityJS/Baltica Baltica]
  | Bedrock toolkit that includes a RakNet implementation.
  | style="text-align: left;" | Bedrock toolkit that includes a RakNet implementation.
  | TypeScript
  | TypeScript
  | See repository
  | See repository
  |-
  |-
  ! [https://github.com/mfdgaming/raknet.py RakNet.Py]
  ! [https://github.com/mfdgaming/raknet.py RakNet.Py]
  | RakNet protocol version 5 implementation for older MCPE versions.
  | style="text-align: left;" | RakNet implementation written in Python.
  | Python
  | Python
  | GPL
  | GPL-2.0
  |-
  |-
  ! [https://github.com/LavishMC/RakNet LavishMC RakNet]
  ! [https://github.com/LavishMC/RakNet LavishMC RakNet]
  | C++ fork of the original RakNet implementation.
  | style="text-align: left;" | C++ fork of the original RakNet implementation.
  | C++
  | C++
  | BSD
  | BSD
  |-
  |-
  ! [https://github.com/facebookarchive/RakNet RakNet (original)]
  ! [https://github.com/facebookarchive/RakNet RakNet (original)]
  | Original C++ RakNet implementation.
  | style="text-align: left;" | Original C++ RakNet implementation.
  | C++
  | C++
  | BSD-2-Clause
  | BSD-2-Clause
Line 105: Line 104:
== Data types ==
== Data types ==


RakNet packet fields use fixed-width integers and a few protocol-specific types. Byte order depends on the field; use the packet definition when encoding or decoding multi-byte values.<ref>[https://github.com/facebookarchive/RakNet/blob/master/Source/BitStream.h RakNet: BitStream] [https://github.com/GolemOrg/RakNet/blob/master/PROTOCOL.md GolemOrg: RakNet protocol notes]</ref>
The types below describe the packet layouts on this page. Multi-byte integers are big-endian unless stated otherwise; 24-bit indices are little-endian. Address structures have their own byte order.<ref>[https://github.com/facebookarchive/RakNet/blob/master/Source/BitStream.h RakNet: BitStream] [https://github.com/Sandertv/go-raknet/blob/master/packet.go go-raknet: Frame encoding]</ref>


{| class="wikitable"
{| class="wikitable"
Line 116: Line 115:
! Boolean
! Boolean
| 1 byte
| 1 byte
| <code>0x00</code> is false; <code>0x01</code> is true.
| {{cd|0x00}} is false; {{cd|0x01}} is true.
|-
|-
! Short
! Short
Line 129: Line 128:
| 4 bytes
| 4 bytes
| Signed 32-bit integer.
| Signed 32-bit integer.
|-
! Unsigned Int
| 4 bytes
| Unsigned 32-bit integer.
|-
|-
! Long
! Long
Line 136: Line 139:
! uint24le
! uint24le
| 3 bytes
| 3 bytes
| Unsigned 24-bit little-endian integer, used for frame sequence numbers.
| Unsigned 24-bit little-endian integer, used for datagram sequence numbers and frame indices.
|-
|-
! String
! String
| Variable
| Variable
| In RakNet string fields, an unsigned 16-bit length precedes the string bytes.
| An unsigned 16-bit byte length followed by that many string bytes.
|-
|-
! Magic
! Magic
| 16 bytes
| 16 bytes
| The fixed <code>00ffff00fefefefefdfdfdfd12345678</code> value used in offline packets.<ref>[https://github.com/facebookarchive/RakNet/blob/master/Source/RakPeer.cpp RakNet: RakPeer.cpp]</ref>
| The fixed {{cd|00ffff00fefefefefdfdfdfd12345678}} value used in offline packets.<ref>[https://github.com/facebookarchive/RakNet/blob/master/Source/RakPeer.cpp RakNet: RakPeer.cpp]</ref>
|-
|-
! Address
! Address
| 7 bytes (IPv4); 29 bytes (IPv6)
| 7 bytes (IPv4);<br/>29 bytes (IPv6)
| Encodes the address family, address and port. IPv4 address bytes are inverted; the port is big-endian. IPv6 also includes address-family, flow-info and scope fields.<ref name="address-format">[https://github.com/GolemOrg/RakNet/blob/master/PROTOCOL.md GolemOrg: RakNet address format]</ref>
| Encodes the address family, address and port. IPv4 address bytes are inverted; the port is big-endian. IPv6 also includes address-family, flow-info and scope fields.<ref name="address-format">[https://github.com/Sandertv/go-raknet/blob/master/internal/message/addr.go go-raknet: Address encoding]</ref>
|}
|}


== Handshake sequence ==
== Handshake sequence ==


RakNet establishes a peer connection first, then completes the connection with the application.<ref>[https://github.com/facebookarchive/RakNet/blob/master/Source/RakPeer.cpp RakNet: RakPeer.cpp] [https://github.com/GolemOrg/RakNet/blob/master/PROTOCOL.md GolemOrg: RakNet connection sequence]</ref>
The handshake begins with unconnected UDP packets and continues with connection-control messages carried inside RakNet frames.<ref>[https://github.com/facebookarchive/RakNet/blob/master/Source/RakPeer.cpp RakNet: RakPeer.cpp] [https://github.com/Sandertv/go-raknet/tree/master/internal/message go-raknet: Connection messages]</ref>


# C→S: [[#Open Connection Request 1|Open Connection Request 1]]
# C→S: [[#Open Connection Request 1|Open Connection Request 1]]
# S→C: [[#Open Connection Reply 1|Open Connection Reply 1]] (or [[#Incompatible Protocol|Incompatible Protocol]])
# S→C: [[#Open Connection Reply 1|Open Connection Reply 1]] (or [[#Incompatible Protocol|Incompatible Protocol]])
# C→S: [[#Open Connection Request 2|Open Connection Request 2]]
# C→S: [[#Open Connection Request 2|Open Connection Request 2]]
# S→C: [[#Open Connection Reply 2|Open Connection Reply 2]]. The RakNet peer connection is established.
# S→C: [[#Open Connection Reply 2|Open Connection Reply 2]]. The peers can now exchange framed connection-control messages.
# C→S: [[#Connection Request|Connection Request]]
# C→S: [[#Connection Request|Connection Request]]
# S→C: [[#Connection Request Accepted|Connection Request Accepted]]
# S→C: [[#Connection Request Accepted|Connection Request Accepted]]
# C→S: [[#New Incoming Connection|New Incoming Connection]]
# C→S: [[#New Incoming Connection|New Incoming Connection]]


After this exchange, peers can send connected packets. In Bedrock Edition, game packets are carried in RakNet frames as described at [[#Game Packet|Game Packet]].
After this exchange, the RakNet connection is established. Connection Request, Connection Request Accepted, and New Incoming Connection are themselves carried inside frames. In [[Minecraft:Bedrock Edition]], game packets are carried in RakNet frames as described at [[#Game Packet|Game Packet]].


== Packets ==
== Packets ==


Packet identifiers below follow the standard RakNet packet IDs. Some field details vary by implementation.<ref>[https://github.com/facebookarchive/RakNet/blob/master/Source/MessageIdentifiers.h RakNet: Message identifiers] [https://github.com/GolemOrg/RakNet/blob/master/PROTOCOL.md GolemOrg: RakNet protocol notes]</ref>
Offline packet IDs identify UDP datagrams; connected message IDs identify the payload inside a frame. The handshake tables below describe the layout with RakNet security disabled. Optional security handshakes and connection passwords are not included. Field details can vary by implementation.<ref>[https://github.com/facebookarchive/RakNet/blob/master/Source/MessageIdentifiers.h RakNet: Message identifiers] [https://github.com/Sandertv/go-raknet/blob/master/packet.go go-raknet: Frame encoding]</ref>


=== Unconnected Ping ===
=== Unconnected Ping ===
The client sends this packet to discover a server. ID {{cd|0x01}} is a regular unconnected ping; {{cd|0x02}} asks for a response only when the server is accepting new connections. The server replies with [[#Unconnected Pong|Unconnected Pong]].


{| class="wikitable"
{| class="wikitable"
Line 175: Line 180:
  ! Field Name
  ! Field Name
  ! Field Type
  ! Field Type
! Notes
  |-
  |-
  |rowspan="3"| 0x01, 0x02
  |rowspan="3"| 0x01, 0x02
  | Time
  | Time
  | Long
  | Long
|
  |-
  |-
  | MAGIC
  | Magic
| magic
  | Magic
  |  
  |-
  |-
  | Client GUID
  | Client GUID
  | Long
  | Long
|
  |}
  |}


The client sends this packet to discover a server. ID <code>0x01</code> is a regular unconnected ping; <code>0x02</code> asks for a response only when the server has open connections. The server replies with [[#Unconnected Pong|Unconnected Pong]].
=== Unconnected Pong ===


=== Unconnected Pong ===
The server sends this in response to an unconnected ping. It echoes the ping time and includes its GUID and a server ID string. In [[Minecraft:Bedrock Edition]], that string contains server-list information in a semicolon-delimited format; its fields can vary by game version.


{| class="wikitable"
{| class="wikitable"
Line 210: Line 211:
  |  
  |  
  |-
  |-
  | MAGIC
  | Magic
  | magic
  | Magic
  |  
  |  
  |-
  |-
  | Server ID String
  | Server ID String
  | string
  | String
  | Carries server-list information.
  | Carries server-list information.
  |}
  |}


The server sends this in response to an unconnected ping. It echoes the ping time and includes its GUID and a server ID string. In [[Minecraft:Bedrock Edition]], that string contains server-list information in a semicolon-delimited format; its fields can vary by game version.
=== Connected Ping ===


=== Connected Ping ===
This packet measures latency on an established connection. It is commonly sent unreliably.


{| class="wikitable"
{| class="wikitable"
Line 227: Line 228:
  ! Field Name
  ! Field Name
  ! Field Type
  ! Field Type
! Notes
  |-
  |-
  | 0x00
  | 0x00
  | Time
  | Time
  | Long
  | Long
|
  |}
  |}


This packet measures latency on an established connection. It is commonly sent unreliably.
=== Connected Pong ===


=== Connected Pong ===
The receiver replies with the original ping time and its own response time. It is commonly sent unreliably.


{| class="wikitable"
{| class="wikitable"
Line 243: Line 242:
  ! Field Name
  ! Field Name
  ! Field Type
  ! Field Type
! Notes
  |-
  |-
  |rowspan="2"| 0x03
  |rowspan="2"| 0x03
  | Ping Time
  | Ping Time
  | Long
  | Long
|
  |-
  |-
  | Pong Time
  | Pong Time
  | Long
  | Long
|
  |}
  |}
The receiver replies with the original ping time and its own response time. It is commonly sent unreliably.


=== Open Connection Request 1 ===
=== Open Connection Request 1 ===
Line 269: Line 263:
  |rowspan="3"| 0x05
  |rowspan="3"| 0x05
  | Magic
  | Magic
  | MAGIC
  | Magic
  |  
  |  
  |-
  |-
  | Protocol version
  | Protocol version
  | byte
  | Byte
  | RakNet protocol version used by the client.
  | RakNet protocol version used by the client; separate from the Bedrock game protocol version.
  |-
  |-
  | MTU
  | Padding
  | Zero padding
  | Zero bytes
  | Zero padding used to probe the path MTU.
  | Zero padding used to probe the path [[Minecraft:wikipedia:Maximum_transmission_unit|MTU]].
  |}
  |}


The padding is used to probe the path MTU. The server replies with the selected MTU, or sends [[#Incompatible Protocol|Incompatible Protocol]] if it does not support the client's RakNet protocol version.
The MTU is inferred from the datagram length, including IP and UDP overhead; it is not a numeric field in this request. The server replies with the selected MTU, or sends [[#Incompatible Protocol|Incompatible Protocol]] if it does not support the client's RakNet protocol version.


=== Open Connection Reply 1 ===
=== Open Connection Reply 1 ===
Line 293: Line 287:
  ! Notes
  ! Notes
  |-
  |-
  |rowspan="5"| 0x06
  |rowspan="4"| 0x06
| Magic
  | Magic
  | Magic
| MAGIC
  |  
  |  
  |-
  |-
Line 303: Line 297:
  |-
  |-
  | Use security
  | Use security
  | boolean
  | Boolean
  | Indicates whether the server is using RakNet's security challenge.
  | False for the layout shown here.
|-
| Cookie
| Int
| Present only when security is enabled; returned by the client in Open Connection Request 2.
  |-
  |-
  | MTU
  | MTU
  | Unsigned short
  | Unsigned Short
  | Selected MTU for the connection.
  | Selected MTU for the connection.
  |}
  |}
Line 323: Line 313:
  ! Field Name
  ! Field Name
  ! Field Type
  ! Field Type
! Notes
  |-
  |-
  |rowspan="6"| 0x07
  |rowspan="4"| 0x07
| Magic
  | Magic
  | Magic
| MAGIC
|
|-
| Cookie
| Int
| Present only when the server provided a cookie.
|-
| Has security challenge
| boolean
| Sent with the cookie when security is enabled.
  |-
  |-
  | Server Address
  | Server Address
  | address
  | Address
|
  |-
  |-
  | MTU
  | MTU
  | Unsigned Short
  | Unsigned Short
|
  |-
  |-
  | Client GUID
  | Client GUID
  | Long
  | Long
|
  |}
  |}


Line 363: Line 340:
  |rowspan="5"| 0x08
  |rowspan="5"| 0x08
  | Magic
  | Magic
  | MAGIC
  | Magic
  |  
  |  
  |-
  |-
Line 371: Line 348:
  |-
  |-
  | Client Address
  | Client Address
  | address
  | Address
  |  
  |  
  |-
  |-
Line 379: Line 356:
  |-
  |-
  | Encryption enabled
  | Encryption enabled
  | boolean
  | Boolean
  |  
  | False for the layout shown here.
  |}
  |}


=== Connection Request ===
=== Connection Request ===


The client sends this packet after the RakNet peer connection is established to request an application-level connection.
The client sends this framed message after Open Connection Reply 2 to continue the RakNet handshake.


{| class="wikitable"
{| class="wikitable"
Line 391: Line 368:
  ! Field Name
  ! Field Name
  ! Field Type
  ! Field Type
! Notes
  |-
  |-
  |rowspan="3"| 0x09
  |rowspan="3"| 0x09
  | GUID
  | GUID
  | Long
  | Long
|
  |-
  |-
  | Time
  | Time
  | Long
  | Long
|
  |-
  |-
  | Use security
  | Use security
  | boolean
  | Boolean
|
  |}
  |}


Line 419: Line 392:
  |rowspan="5"| 0x10
  |rowspan="5"| 0x10
  | Client address
  | Client address
  | address
  | Address
  |  
  |  
  |-
  |-
Line 427: Line 400:
  |-
  |-
  | Internal addresses
  | Internal addresses
  | 10x address
  | Address array
  | Internal server addresses.
  | Internal server addresses; the count varies by implementation, commonly 10 or 20.<ref name="accepted-addresses">[https://github.com/Sandertv/go-raknet/blob/master/internal/message/connection_request_accepted.go go-raknet: Connection Request Accepted]</ref>
  |-
  |-
  | Request time
  | Request time
  | Long
  | Long
  | Shall be the corresponding timestamp of the [[#Connection Request|Connection Request]]
  | Timestamp from the corresponding [[#Connection Request|Connection Request]].
  |-
  |-
  | Time
  | Time
Line 451: Line 424:
  |rowspan="4"| 0x13
  |rowspan="4"| 0x13
  | Server address
  | Server address
  | address
  | Address
  |  
  |  
  |-
  |-
  | Internal addresses
  | Internal addresses
  | 20x address
  | Address array
  | Internal client addresses.
  | Internal client addresses; the count varies by implementation, commonly 10 or 20.<ref>[https://github.com/Sandertv/go-raknet/blob/master/internal/message/new_incoming_connection.go go-raknet: New Incoming Connection]</ref>
  |-
  |-
  | Incoming Timestamp
  | Ping time
  | Long
  | Long
  |  
  | Server acceptance timestamp echoed by the client.
  |-
  |-
  | Server Timestamp
  | Pong time
  | Long
  | Long
  |  
  | Time at which the client sends this message.
|-
  |}
  |}


=== Disconnection Notification ===
=== Disconnection Notification ===


This packet notifies the other peer that the sender is disconnecting
This packet notifies the other peer that the sender is disconnecting.


{| class="wikitable"
{| class="wikitable"
Line 486: Line 458:
  ! Field Name
  ! Field Name
  ! Field Type
  ! Field Type
! Notes
  |-
  |-
  |rowspan="3"| 0x19
  |rowspan="3"| 0x19
  | Protocol
  | Protocol
  | byte
  | Byte
|
  |-
  |-
  | Magic
  | Magic
  | MAGIC
  | Magic
|
  |-
  |-
  | Server GUID
  | Server GUID
  | Long
  | Long
|
|-
  |}
  |}


=== Frame Set Packet ===
=== Frame Set Packet ===
Line 514: Line 480:
  ! Notes
  ! Notes
  |-
  |-
  |rowspan="11"| 0x80..0x8d
  |rowspan="11"| 0x80–0x9f
  |colspan="3"| Sequence number
  |colspan="3"| Sequence number
  | uint24le
  | uint24le
Line 521: Line 487:
  |rowspan="10"| Frames
  |rowspan="10"| Frames
  |colspan="2"| Flags
  |colspan="2"| Flags
  | byte
  | Byte
  | Top 3 bits give the reliability type, fourth bit is 1 when the frame is fragmented and part of a compound.
  | Top 3 bits give the reliability type, fourth bit is 1 when the frame is fragmented and part of a compound.
  |-
  |-
  |colspan="2"| Length '''IN BITS'''
  |colspan="2"| Body bit length
  | unsigned short
  | Unsigned Short
  | Length of the body '''in bits'''. ''Big-endian.''
  | Length of this frame's body in bits.
  |-
  |-
  |colspan="2"| Reliable frame index
  |colspan="2"| Reliable frame index
Line 536: Line 502:
  | Only if sequenced, used for discarding out-of-date packets
  | Only if sequenced, used for discarding out-of-date packets
  |-
  |-
  |rowspan="2"| Order<br>(only if ordered, see<br>below)
  |rowspan="2"| Order<br>(if ordered or sequenced)
  | Ordered frame index
  | Ordered frame index
  | uint24le
  | uint24le
Line 542: Line 508:
  |-
  |-
  | Order channel
  | Order channel
  | byte
  | Byte
  | Maximum of 32 channels
  | Maximum of 32 channels
  |-
  |-
Line 548: Line 514:
  | Compound size
  | Compound size
  | Unsigned Int
  | Unsigned Int
  | Total size of the compound
  | Number of fragments in the split message.
  |-
  |-
  | Compound ID
  | Compound ID
Line 556: Line 522:
  | Index
  | Index
  | Unsigned Int
  | Unsigned Int
  | Index of this fragment in the compound
  | Zero-based index of this fragment in the split message.
  |-
  |-
  | Body
  | Body
  | ceil(length/8) bytes
  | ceil(length/8) bytes
|
  |
  |
  |}
  |}


'''Note 1: there can be multiple frames in each Frame Set Packet.'''<br>
A frame-set header has bit {{cd|0x80}} set and ACK/NACK bits {{cd|0x60}} clear. The remaining bits are flags, so the header is not a fixed message ID. A frame set can contain multiple frames.<ref name="frames">[https://github.com/Sandertv/go-raknet/blob/master/packet.go go-raknet: Frame encoding]</ref>
'''Note 2: A packet is a Frame Set Packet if <code>(packet_ID & 0x80) == 0x80</code> and <code>(packet_ID & 0x60) == 0</code>'''


The reliability types are as follows:
The reliability values transmitted in the frame header are as follows:


{| class="wikitable"
{| class="wikitable"
Line 605: Line 569:
| style="text-align: center;" | x
| style="text-align: center;" | x
| style="text-align: center;" |  
| style="text-align: center;" |  
|-
| style="text-align: center;" | 5
| unreliable (+ ACK receipt)
| style="text-align: center;" |
| style="text-align: center;" |
| style="text-align: center;" |
|-
| style="text-align: center;" | 6
| reliable (+ ACK receipt)
| style="text-align: center;" | x
| style="text-align: center;" |
| style="text-align: center;" |
|-
| style="text-align: center;" | 7
| reliable ordered (+ ACK receipt)
| style="text-align: center;" | x
| style="text-align: center;" |
| style="text-align: center;" | x
|}
|}
The original RakNet API also defines receipt modes 5, 6, and 7. These are encoded as wire values 0, 2, and 3 respectively; receipt notification is handled locally.<ref>[https://github.com/facebookarchive/RakNet/blob/master/Source/ReliabilityLayer.cpp RakNet: Reliability layer]</ref>


Sequenced delivery discards older packets when a newer packet has arrived. Ordered delivery preserves the order of reliable packets within a channel.
Sequenced delivery discards older packets when a newer packet has arrived. Ordered delivery preserves the order of reliable packets within a channel.
Line 629: Line 577:
=== Game Packet ===
=== Game Packet ===


This packet carries game-protocol data. In [[Minecraft:Bedrock Edition]], its body contains a batch of game packets.
This Bedrock-specific message carries a batch of game packets inside a RakNet frame.


{| class="wikitable"
{| class="wikitable"
Line 640: Line 588:
  | Body
  | Body
  | bytes
  | bytes
  | In [[Minecraft:Bedrock Edition]], the body contains a batch of game packets. Framing and compression are described in [[Minecraft:Bedrock Edition protocol#Packet Format|Bedrock Edition protocol]].
  | In [[Minecraft:Bedrock Edition]], the body contains a batch of game packets. Framing and compression are described in [[Minecraft:Bedrock Edition protocol#Packet format|Bedrock Edition protocol]].
  |}
  |}
In [[Minecraft:Bedrock Edition]], the body carries a batch of game packets encoded according to the [[Minecraft:Bedrock Edition protocol]]. See [[Minecraft:Bedrock_Edition_protocol/Packets|Bedrock Edition protocol/Packets]] for their definitions.
Packet definitions are listed at [[Minecraft:Bedrock Edition protocol/Packets]].


=== NACK ===
=== NACK ===
Line 672: Line 620:
| Start Sequence number
| Start Sequence number
| uint24le
| uint24le
|First datagram sequence number in the range.
|First datagram sequence number in the inclusive range.
|-
|-
| End Sequence number
| End Sequence number
| uint24le
| uint24le
|Last datagram sequence number in the range.
|Last datagram sequence number in the inclusive range.
|}
|}
A NACK reports frame-set sequence numbers that were not received, prompting retransmission where required.
A NACK reports frame-set sequence numbers that were not received, prompting retransmission where required.
Line 708: Line 656:
| Start Sequence number
| Start Sequence number
| uint24le
| uint24le
|First datagram sequence number in the range.
|First datagram sequence number in the inclusive range.
|-
|-
| End Sequence number
| End Sequence number
| uint24le
| uint24le
|Last datagram sequence number in the range.
|Last datagram sequence number in the inclusive range.
|}
|}
An ACK reports frame-set sequence numbers that were received. Both ACK and NACK packets can contain multiple records.
An ACK reports frame-set sequence numbers that were received. Both ACK and NACK packets can contain multiple records.

Latest revision as of 11:10, 20 October 2026

Template:Exclusive

RakNet is a networking library and protocol for multiplayer games. It runs over UDP and provides connection management, configurable reliability and ordering, sequencing, and fragmentation.

UDP does not guarantee delivery or ordering. RakNet supports different delivery modes, so applications can request reliability or ordering when needed.

The source code for RakNet is available in the archived source repository.

Use in Bedrock Edition

Minecraft:NetherNet became the default transport for Minecraft:Bedrock Dedicated Server in Minecraft:26.50.<ref>Template:Cite</ref> RakNet is deprecated in Minecraft:26.60, which removes client support for it.<ref>Template:Cite</ref>

Libraries

The following libraries implement RakNet. Supported features and protocol versions vary between implementations.

Name Description Language License
go-raknet RakNet implementation written in Go. Go MIT
RakNet Asynchronous RakNet implementation written in Rust. Rust Apache-2.0
PieRakNet RakNet implementation written in Python. Python GPL-3.0
Cloudburst Network Network components used by CloudburstMC projects. Java Apache-2.0
rak-net Python RakNet implementation originally developed for Podrum. Python GPL-2.0
JRakNet Java implementation of the RakNet protocol. Java MIT
netty-raknet RakNet implementation for Netty. Java MIT
JRakLibPlus RakNet server library based on RakLib and JRakLib. Java LGPL-3.0
RakLib Lightweight PHP RakNet server implementation. PHP GPL-3.0
raknet UDP networking library for Node.js that follows the RakNet protocol. JavaScript MIT
PyRakLib Python port of RakLib that follows the RakNet protocol. Python GPL
rust-raknet RakNet implementation written in Rust. Rust MIT
Baltica Bedrock toolkit that includes a RakNet implementation. TypeScript See repository
RakNet.Py RakNet implementation written in Python. Python GPL-2.0
LavishMC RakNet C++ fork of the original RakNet implementation. C++ BSD
RakNet (original) Original C++ RakNet implementation. C++ BSD-2-Clause

Data types

The types below describe the packet layouts on this page. Multi-byte integers are big-endian unless stated otherwise; 24-bit indices are little-endian. Address structures have their own byte order.<ref>RakNet: BitStream go-raknet: Frame encoding</ref>

Type Size Description
Byte 1 byte Unsigned 8-bit value.
Boolean 1 byte Template:Cd is false; Template:Cd is true.
Short 2 bytes Signed 16-bit integer.
Unsigned Short 2 bytes Unsigned 16-bit integer.
Int 4 bytes Signed 32-bit integer.
Unsigned Int 4 bytes Unsigned 32-bit integer.
Long 8 bytes 64-bit integer. Whether it represents a signed value depends on the field.
uint24le 3 bytes Unsigned 24-bit little-endian integer, used for datagram sequence numbers and frame indices.
String Variable An unsigned 16-bit byte length followed by that many string bytes.
Magic 16 bytes The fixed Template:Cd value used in offline packets.<ref>RakNet: RakPeer.cpp</ref>
Address 7 bytes (IPv4);
29 bytes (IPv6)
Encodes the address family, address and port. IPv4 address bytes are inverted; the port is big-endian. IPv6 also includes address-family, flow-info and scope fields.<ref name="address-format">go-raknet: Address encoding</ref>

Handshake sequence

The handshake begins with unconnected UDP packets and continues with connection-control messages carried inside RakNet frames.<ref>RakNet: RakPeer.cpp go-raknet: Connection messages</ref>

  1. C→S: Open Connection Request 1
  2. S→C: Open Connection Reply 1 (or Incompatible Protocol)
  3. C→S: Open Connection Request 2
  4. S→C: Open Connection Reply 2. The peers can now exchange framed connection-control messages.
  5. C→S: Connection Request
  6. S→C: Connection Request Accepted
  7. C→S: New Incoming Connection

After this exchange, the RakNet connection is established. Connection Request, Connection Request Accepted, and New Incoming Connection are themselves carried inside frames. In Minecraft:Bedrock Edition, game packets are carried in RakNet frames as described at Game Packet.

Packets

Offline packet IDs identify UDP datagrams; connected message IDs identify the payload inside a frame. The handshake tables below describe the layout with RakNet security disabled. Optional security handshakes and connection passwords are not included. Field details can vary by implementation.<ref>RakNet: Message identifiers go-raknet: Frame encoding</ref>

Unconnected Ping

The client sends this packet to discover a server. ID Template:Cd is a regular unconnected ping; Template:Cd asks for a response only when the server is accepting new connections. The server replies with Unconnected Pong.

Packet ID Field Name Field Type
0x01, 0x02 Time Long
Magic Magic
Client GUID Long

Unconnected Pong

The server sends this in response to an unconnected ping. It echoes the ping time and includes its GUID and a server ID string. In Minecraft:Bedrock Edition, that string contains server-list information in a semicolon-delimited format; its fields can vary by game version.

Packet ID Field Name Field Type Notes
0x1c Time Long
Server GUID Long
Magic Magic
Server ID String String Carries server-list information.

Connected Ping

This packet measures latency on an established connection. It is commonly sent unreliably.

Packet ID Field Name Field Type
0x00 Time Long

Connected Pong

The receiver replies with the original ping time and its own response time. It is commonly sent unreliably.

Packet ID Field Name Field Type
0x03 Ping Time Long
Pong Time Long

Open Connection Request 1

The first packet in the handshake sequence, sent by the client to the server.

Packet ID Field Name Field Type Notes
0x05 Magic Magic
Protocol version Byte RakNet protocol version used by the client; separate from the Bedrock game protocol version.
Padding Zero bytes Zero padding used to probe the path MTU.

The MTU is inferred from the datagram length, including IP and UDP overhead; it is not a numeric field in this request. The server replies with the selected MTU, or sends Incompatible Protocol if it does not support the client's RakNet protocol version.

Open Connection Reply 1

The second packet in the handshake sequence, sent by the server to the client.

Packet ID Field Name Field Type Notes
0x06 Magic Magic
Server GUID Long
Use security Boolean False for the layout shown here.
MTU Unsigned Short Selected MTU for the connection.

Open Connection Request 2

The third packet in the handshake sequence, sent by the client to the server.

Packet ID Field Name Field Type
0x07 Magic Magic
Server Address Address
MTU Unsigned Short
Client GUID Long

Open Connection Reply 2

The fourth packet in the handshake sequence, sent by the server to the client.

Packet ID Field Name Field Type Notes
0x08 Magic Magic
Server GUID Long
Client Address Address
MTU Unsigned Short
Encryption enabled Boolean False for the layout shown here.

Connection Request

The client sends this framed message after Open Connection Reply 2 to continue the RakNet handshake.

Packet ID Field Name Field Type
0x09 GUID Long
Time Long
Use security Boolean

Connection Request Accepted

The server sends this packet to accept the client's connection request.

Packet ID Field Name Field Type Notes
0x10 Client address Address
System index Unsigned Short System index assigned by the server.
Internal addresses Address array Internal server addresses; the count varies by implementation, commonly 10 or 20.<ref name="accepted-addresses">go-raknet: Connection Request Accepted</ref>
Request time Long Timestamp from the corresponding Connection Request.
Time Long Server acceptance time.

New Incoming Connection

The client sends this packet to confirm that it received the server's acceptance.

Packet ID Field Name Field Type Notes
0x13 Server address Address
Internal addresses Address array Internal client addresses; the count varies by implementation, commonly 10 or 20.<ref>go-raknet: New Incoming Connection</ref>
Ping time Long Server acceptance timestamp echoed by the client.
Pong time Long Time at which the client sends this message.

Disconnection Notification

This packet notifies the other peer that the sender is disconnecting.

Packet ID Field Name Field Type Notes
0x15 No payload Signals that the sender is disconnecting.

Incompatible Protocol

The server sends this packet when it does not support the RakNet protocol version used by the client.

Packet ID Field Name Field Type
0x19 Protocol Byte
Magic Magic
Server GUID Long

Frame Set Packet

This packet carries one or more frames between connected peers.

Packet ID Field Name Field Type Notes
0x80–0x9f Sequence number uint24le Used for building ACK and NACK ranges
Frames Flags Byte Top 3 bits give the reliability type, fourth bit is 1 when the frame is fragmented and part of a compound.
Body bit length Unsigned Short Length of this frame's body in bits.
Reliable frame index uint24le Only if reliable, used for detecting frame level duplication
Sequenced frame index uint24le Only if sequenced, used for discarding out-of-date packets
Order
(if ordered or sequenced)
Ordered frame index uint24le Tells the receiver the correct order in which to deliver frames to the application
Order channel Byte Maximum of 32 channels
Fragment
(only if fragmented)
Compound size Unsigned Int Number of fragments in the split message.
Compound ID Unsigned Short Identifies which compound this fragment is part of
Index Unsigned Int Zero-based index of this fragment in the split message.
Body ceil(length/8) bytes

A frame-set header has bit Template:Cd set and ACK/NACK bits Template:Cd clear. The remaining bits are flags, so the header is not a fixed message ID. A frame set can contain multiple frames.<ref name="frames">go-raknet: Frame encoding</ref>

The reliability values transmitted in the frame header are as follows:

ID Name Reliable Sequenced Ordered
0 unreliable
1 unreliable sequenced x
2 reliable x
3 reliable ordered x x
4 reliable sequenced x x

The original RakNet API also defines receipt modes 5, 6, and 7. These are encoded as wire values 0, 2, and 3 respectively; receipt notification is handled locally.<ref>RakNet: Reliability layer</ref>

Sequenced delivery discards older packets when a newer packet has arrived. Ordered delivery preserves the order of reliable packets within a channel.

Game Packet

This Bedrock-specific message carries a batch of game packets inside a RakNet frame.

Packet ID Field Name Field Type Notes
0xfe Body bytes In Minecraft:Bedrock Edition, the body contains a batch of game packets. Framing and compression are described in Bedrock Edition protocol.

Packet definitions are listed at Minecraft:Bedrock Edition protocol/Packets.

NACK

This packet reports datagrams that were not received so the sender can retransmit them when required.

Packet ID Field Name Field Type Notes
0xa0 Record count Unsigned Short Number of records in the packet
Records Is Single? boolean False for range, True for no range
No Range, if is_single == true Sequence number uint24le Datagram sequence number in this record.
Range, if is_single == false Start Sequence number uint24le First datagram sequence number in the inclusive range.
End Sequence number uint24le Last datagram sequence number in the inclusive range.

A NACK reports frame-set sequence numbers that were not received, prompting retransmission where required.

ACK

This packet acknowledges datagrams received from the other peer.

Packet ID Field Name Field Type Notes
0xc0 Record count Unsigned Short Number of records in the packet
Records Is Single? boolean False for range, True for no range
No Range, if is_single == true Sequence number uint24le Datagram sequence number in this record.
Range, if is_single == false Start Sequence number uint24le First datagram sequence number in the inclusive range.
End Sequence number uint24le Last datagram sequence number in the inclusive range.

An ACK reports frame-set sequence numbers that were received. Both ACK and NACK packets can contain multiple records.

References

Template:Reflist

Navigation

Template:Navbox Bedrock Edition