Difference between revisions of "Pocket Minecraft Protocol"
m (→ID_OPEN_CONNECTION_REPLY_1 (0x06): typo) |
(Added new packet 0xC0, examples) |
||
Line 74: | Line 74: | ||
| class="col1 centeralign" | Ping ID | | class="col1 centeralign" | Ping ID | ||
| class="col2 centeralign" | int64 | | class="col2 centeralign" | int64 | ||
− | | class="col3 centeralign" | <code> | + | | class="col3 centeralign" | <code>0x00000000003c6d0d</code> |
| class="col4" | Time since start in Milliseconds | | class="col4" | Time since start in Milliseconds | ||
|- class="row2" | |- class="row2" | ||
Line 110: | Line 110: | ||
| class="col0 centeralign" | Version | | class="col0 centeralign" | Version | ||
| class="col1 centeralign" | byte | | class="col1 centeralign" | byte | ||
− | | class="col2 centeralign" | 5 | + | | class="col2 centeralign" | <code>5</code> |
| class="col3" | Protocol version, currently 5 | | class="col3" | Protocol version, currently 5 | ||
|- class="row2" | |- class="row2" | ||
| class="col0 centeralign" | Null Payload | | class="col0 centeralign" | Null Payload | ||
| class="col1 centeralign" | many 0x00 bytes | | class="col1 centeralign" | many 0x00 bytes | ||
− | | class="col2 centeralign" | 0x00 * 1447 | + | | class="col2 centeralign" | <code>0x00 * 1447</code> |
| class="col3" | MTU (Maximum Transport Unit) | | class="col3" | MTU (Maximum Transport Unit) | ||
|- class="row4" | |- class="row4" | ||
Line 152: | Line 152: | ||
| class="col0 centeralign" | Server ID | | class="col0 centeralign" | Server ID | ||
| class="col1 centeralign" | int64 | | class="col1 centeralign" | int64 | ||
− | | class="col2 centeralign" | | + | | class="col2 centeralign" | <code>0x00000000372cdc9e</code> |
| class="col3" | This value seems to be constant for an installation of PM, or differs between the demo and full version. | | class="col3" | This value seems to be constant for an installation of PM, or differs between the demo and full version. | ||
|- class="row3" | |- class="row3" | ||
| class="col0 centeralign" | Unused | | class="col0 centeralign" | Unused | ||
| class="col1 centeralign" | byte | | class="col1 centeralign" | byte | ||
− | | class="col2 centeralign" | 0 | + | | class="col2 centeralign" | <code>0</code> |
| class="col3" | | | class="col3" | | ||
|- class="row4" | |- class="row4" | ||
| class="col0 centeralign" | MTU Size | | class="col0 centeralign" | MTU Size | ||
| class="col1 centeralign" | short | | class="col1 centeralign" | short | ||
− | | class="col2 centeralign" | 1447 | + | | class="col2 centeralign" | <code>1447</code> |
| class="col3" | Lenght of 0x05. Used to determine packet loss and max UDP packet size (MTU) | | class="col3" | Lenght of 0x05. Used to determine packet loss and max UDP packet size (MTU) | ||
|- class="row5" | |- class="row5" | ||
Line 194: | Line 194: | ||
| class="col0 centeralign" | Unused | | class="col0 centeralign" | Unused | ||
| class="col1 centeralign" | 5 bytes | | class="col1 centeralign" | 5 bytes | ||
− | | class="col2 centeralign" | 0x043f57fefd | + | | class="col2 centeralign" | <code>0x043f57fefd</code> |
− | | class="col3" | | + | | class="col3" | Only seen this value |
|- class="row3" | |- class="row3" | ||
| class="col0 centeralign" | Port | | class="col0 centeralign" | Port | ||
| class="col1 centeralign" | short | | class="col1 centeralign" | short | ||
− | | class="col2 centeralign" | 19132 | + | | class="col2 centeralign" | <code>19132</code> |
| class="col3" | | | class="col3" | | ||
|- class="row4" | |- class="row4" | ||
| class="col0 centeralign" | MTU Size | | class="col0 centeralign" | MTU Size | ||
| class="col1 centeralign" | short | | class="col1 centeralign" | short | ||
− | | class="col2 centeralign" | 1464 | + | | class="col2 centeralign" | <code>1464</code> |
| class="col3" | | | class="col3" | | ||
|- class="row5" | |- class="row5" | ||
| class="col0 centeralign" | Client ID | | class="col0 centeralign" | Client ID | ||
| class="col1 centeralign" | int64 | | class="col1 centeralign" | int64 | ||
− | | class="col2 centeralign" | | + | | class="col2 centeralign" | <code>0x00000000372cdc9e</code> |
− | | class="col3" | | + | | class="col3" | The Client / Server ID will be the same for a device |
|- class="row6" | |- class="row6" | ||
| class="col0" | Total Size: | | class="col0" | Total Size: | ||
Line 238: | Line 238: | ||
| class="col4" | | | class="col4" | | ||
|- class="row2" | |- class="row2" | ||
− | | class="col0 centeralign" | | + | | class="col0 centeralign" | Server ID |
| class="col1 centeralign" | int64 | | class="col1 centeralign" | int64 | ||
− | | class="col2 centeralign" | | + | | class="col2 centeralign" | <code>0x00000000372cdc9e</code> |
| class="col3" | | | class="col3" | | ||
|- class="row3" | |- class="row3" | ||
| class="col0 centeralign" | Unused | | class="col0 centeralign" | Unused | ||
| class="col1 centeralign" | 5 bytes | | class="col1 centeralign" | 5 bytes | ||
− | | class="col2 centeralign" | 0x043f57fefd | + | | class="col2 centeralign" | <code>0x043f57fefd</code> |
| class="col3" | | | class="col3" | | ||
|- class="row4" | |- class="row4" | ||
Line 254: | Line 254: | ||
Sent from server in response to packet 0x07. | Sent from server in response to packet 0x07. | ||
− | {{anchor| | + | {{anchor|0x1D}} |
− | === ID_ADVERTISE_SYSTEM ( | + | === ID_ADVERTISE_SYSTEM (0x1D) === |
− | + | Same as [[#0x1C|ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x1C)]], but with the Packet ID changed. Depends of the version | |
− | {{anchor| | + | {{anchor|0x1C}} |
− | === ID_UNCONNECTED_PING_OPEN_CONNECTIONS ( | + | === ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x1C) === |
''Server to Client'' | ''Server to Client'' | ||
Line 274: | Line 274: | ||
| class="col1 centeralign" | Ping ID | | class="col1 centeralign" | Ping ID | ||
| class="col2 centeralign" | int64 | | class="col2 centeralign" | int64 | ||
− | | class="col3 centeralign" | <code> | + | | class="col3 centeralign" | <code>0x00000000003c6d0d</code> |
| class="col4" | Time since start in Milliseconds | | class="col4" | Time since start in Milliseconds | ||
|- class="row2" | |- class="row2" | ||
| class="col0 centeralign" | Server ID | | class="col0 centeralign" | Server ID | ||
| class="col1 centeralign" | int64 | | class="col1 centeralign" | int64 | ||
− | | class="col2 centeralign" | | + | | class="col2 centeralign" | <code>0x00000000372cdc9e</code> |
| class="col3" | | | class="col3" | | ||
|- class="row4" | |- class="row4" | ||
Line 289: | Line 289: | ||
| class="col0 centeralign" | Host Info | | class="col0 centeralign" | Host Info | ||
| class="col1 centeralign" | string | | class="col1 centeralign" | string | ||
− | | class="col2 centeralign" | MCCPP;Demo;Steve | + | | class="col2 centeralign" | <code>MCCPP;Demo;Steve</code> |
| class="col3" | Used to send the username (MCCPP;Demo; + username) | | class="col3" | Used to send the username (MCCPP;Demo; + username) | ||
|- class="row3" | |- class="row3" | ||
Line 304: | Line 304: | ||
=== Unknown (0x84) === | === Unknown (0x84) === | ||
− | '' | + | ''Two-Way'' |
+ | |||
+ | |||
+ | Fields in this packet are variable, also the lenght | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 315: | Line 318: | ||
|- class="row1" | |- class="row1" | ||
| class="col0 centeralign" rowspan="7" | 0x84 | | class="col0 centeralign" rowspan="7" | 0x84 | ||
− | | class="col1 centeralign" | | + | | class="col1 centeralign" | Unknown |
− | | class="col2 centeralign" | | + | | class="col2 centeralign" | variable |
− | | class="col3 centeralign" | | + | | class="col3 centeralign" | |
− | | class="col4" | | + | | class="col4" | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|- class="row6" | |- class="row6" | ||
| class="col0" | Total Size: | | class="col0" | Total Size: | ||
Line 349: | Line 327: | ||
|} | |} | ||
− | Sent after 0x08 | + | Sent after 0x08, and 0xC0 |
+ | |||
+ | |||
+ | {{anchor|0xC0}} | ||
+ | === Unknown (0xC0) === | ||
+ | |||
+ | ''Two-Way'' | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |- class="row0" | ||
+ | | class="col0" | Packet ID | ||
+ | | class="col1" | Field Name | ||
+ | | class="col2" | Field Type | ||
+ | | class="col3" | Example | ||
+ | | class="col4" | Notes | ||
+ | |- class="row1" | ||
+ | | class="col0 centeralign" rowspan="7" | 0xC0 | ||
+ | | class="col1 centeralign" | Ping ID | ||
+ | | class="col2 centeralign" | 6 bytes | ||
+ | | class="col3 centeralign" | <code>0x000101000000</code> | ||
+ | | class="col4" | | ||
+ | |- class="row3" | ||
+ | | class="col0" | Total Size: | ||
+ | | class="col1 rightalign" colspan="4" | 7 Bytes | ||
+ | |} | ||
+ | Sent by the Client after the first 0x84. Then, the Server replies with the same packet | ||
[[Category:Pocket Minecraft]] | [[Category:Pocket Minecraft]] |
Revision as of 01:27, 19 October 2012
Unlike the Minecraft protocol, this protocol uses UDP with (so far observed, at least) one message per packet. This makes the protocol easier to work with when it comes to packet serialization, and might offer latency improvements, but will inevitably have the usual UDP issues (packets lost, truncated, duplicated, out-of-order, etc.).
Old servers listen on UDP port 19132. As of the survival update, the port is the same Clients don't pick any specific port to listen on.
Please note that even where packet field names are written in this page, these are still largely hypothetical and could well be incorrect guesses.
It has been determined that PM uses RakNet for its networking library, some documentation that seems relevant.
Contents
- 1 Terminology
- 2 Types
- 3 Packets
- 3.1 ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x02)
- 3.2 ID_OPEN_CONNECTION_REQUEST_1 (0x05)
- 3.3 ID_OPEN_CONNECTION_REPLY_1 (0x06)
- 3.4 ID_OPEN_CONNECTION_REQUEST_2 (0x07)
- 3.5 ID_OPEN_CONNECTION_REPLY_2 (0x08)
- 3.6 ID_ADVERTISE_SYSTEM (0x1D)
- 3.7 ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x1C)
- 3.8 Unknown (0x84)
- 3.9 Unknown (0xC0)
Terminology
- PM
- Pocket Minecraft (aka Minecraft PE or Minecraft Pocket Edition)
Types
Size | Range | Notes | |
---|---|---|---|
byte | 1 | -128 to 127 | Signed, two's complement |
short | 2 | -32768 to 32767 | Signed, two's complement |
int32 | 4 | -2147483648 to 2147483647 | Signed, two's complement |
int64 | 8 | Maybe a double? | |
MAGIC | 16 | 0x00ffff00fefefefefdfdfdfd12345678 | always hex bytes 0x00ffff00fefefefefdfdfdfd12345678, corresponding to RakNet's default OFFLINE_MESSAGE_DATA_ID |
string | ≥ 1 | N/A | Prefixed by a short containing the length of the string in characters. It appears that only the following ASCII characters can be displayed: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ |
Packets
All packets start with a single byte that identifies the packet type, the rest of the packet follows it.
ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x02)
Client to Broadcast
Packet ID | Field Name | Field Type | Example | Notes |
0x02 | Ping ID | int64 | 0x00000000003c6d0d
|
Time since start in Milliseconds |
MAGIC | MAGIC | |||
Total Size: | 25 Bytes |
Clients start out by sending this packet to the IP broadcast address on port 19132 repeatedly (approx once per second) when joining a server was chosen on the main screen, and stops when the user selects a server (or leaves the screen). The ping ID from the client increases over time, and appears to be the number of milliseconds since the client program was started (might be used to measure server response latency).
ID_OPEN_CONNECTION_REQUEST_1 (0x05)
Client to Server
Packet ID | Field Name | Field Type | Example | Notes |
0x05 | MAGIC | MAGIC | ||
Version | byte | 5
|
Protocol version, currently 5 | |
Null Payload | many 0x00 bytes | 0x00 * 1447
|
MTU (Maximum Transport Unit) | |
Total Size: | 18 Bytes + lenght of Null Payload |
Sent from client after it receives packet 0x1d. The client will repeatedly send this with reducing sizes until it successfully receives a reply. Observed behaviour is that the client will send packets ~0.5s apart in the following way, until it gets a 0x06 response packet, or reaches the end of these: 4 packets of Null Payload lenght of 1447 4 packets of Null Payload lenght of 1155 5 packets of Null Payload lenght of 531 After this the client appears not to send any more packets to the server, but also doesn't (at least immediately) leave the "locating server" progress screen. If the server doesnt't reply the client, the client will display a "Connect Error" window
ID_OPEN_CONNECTION_REPLY_1 (0x06)
Server to Client
Packet ID | Field Name | Field Type | Example | Notes |
0x06 | MAGIC | MAGIC | ||
Server ID | int64 | 0x00000000372cdc9e
|
This value seems to be constant for an installation of PM, or differs between the demo and full version. | |
Unused | byte | 0
|
||
MTU Size | short | 1447
|
Lenght of 0x05. Used to determine packet loss and max UDP packet size (MTU) | |
Total Size: | 28 Bytes |
Sent from server after it receives packet 0x05.
ID_OPEN_CONNECTION_REQUEST_2 (0x07)
Client to Server
Packet ID | Field Name | Field Type | Example | Notes |
0x07 | MAGIC | MAGIC | ||
Unused | 5 bytes | 0x043f57fefd
|
Only seen this value | |
Port | short | 19132
|
||
MTU Size | short | 1464
|
||
Client ID | int64 | 0x00000000372cdc9e
|
The Client / Server ID will be the same for a device | |
Total Size: | 39 Bytes |
Sent from client in response to packet 0x06.
ID_OPEN_CONNECTION_REPLY_2 (0x08)
Server to Client
Packet ID | Field Name | Field Type | Example | Notes |
0x08 | MAGIC | MAGIC | ||
Server ID | int64 | 0x00000000372cdc9e
|
||
Unused | 5 bytes | 0x043f57fefd
|
||
Total Size: | 30 Bytes |
Sent from server in response to packet 0x07.
ID_ADVERTISE_SYSTEM (0x1D)
Same as ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x1C), but with the Packet ID changed. Depends of the version
ID_UNCONNECTED_PING_OPEN_CONNECTIONS (0x1C)
Server to Client
Packet ID | Field Name | Field Type | Example | Notes |
0x1c | Ping ID | int64 | 0x00000000003c6d0d
|
Time since start in Milliseconds |
Server ID | int64 | 0x00000000372cdc9e
|
||
MAGIC | MAGIC | |||
Host Info | string | MCCPP;Demo;Steve
|
Used to send the username (MCCPP;Demo; + username) | |
Total Size: | 35 Bytes + lenght of string |
Server sends this packet in response to a 0x02 packet. It may be either a 0x1d or a 0x1c, depending on version. If the Server is invisible, this packet will be sent without username)
Unknown (0x84)
Two-Way
Fields in this packet are variable, also the lenght
Packet ID | Field Name | Field Type | Example | Notes |
0x84 | Unknown | variable | ||
Total Size: | 28 Bytes |
Sent after 0x08, and 0xC0
Unknown (0xC0)
Two-Way
Packet ID | Field Name | Field Type | Example | Notes |
0xC0 | Ping ID | 6 bytes | 0x000101000000
|
|
Total Size: | 7 Bytes |
Sent by the Client after the first 0x84. Then, the Server replies with the same packet