Protocol Implementation
The Java Edition protocol is implemented inpumpkin-protocol/src/java/ with the following components:
- Packet Encoder - Encodes packets for transmission to clients
- Packet Decoder - Decodes packets received from clients
- Client Packets - Serverbound packet definitions
- Server Packets - Clientbound packet definitions
Network Encoder
TheTCPNetworkEncoder handles encoding packets for transmission to Java Edition clients.
Implementation
Defined inpumpkin-protocol/src/java/packet_encoder.rs:80-317
Features
- Compression Support - Automatic compression when packet size exceeds threshold
- Encryption Support - AES-128 CFB8 encryption layer
- Buffer Reuse - Reuses compression buffers to minimize allocations
- Async I/O - Fully asynchronous packet writing
Usage
Network Decoder
TheTCPNetworkDecoder handles decoding packets received from Java Edition clients.
Implementation
Defined inpumpkin-protocol/src/java/packet_decoder.rs:76-186
Features
- Decompression Support - Automatic decompression of compressed packets
- Decryption Support - AES-128 CFB8 decryption layer
- Validation - Validates packet sizes and compression ratios
- Async I/O - Fully asynchronous packet reading
Usage
Packet Processing Pipeline
Encoding (Server → Client)
pumpkin-protocol/src/java/packet_encoder.rs:200-309
Decoding (Client → Server)
pumpkin-protocol/src/java/packet_decoder.rs:104-185
Packet Traits
ClientPacket (Serverbound)
pumpkin-protocol/src/lib.rs:314-320
ServerPacket (Clientbound)
pumpkin-protocol/src/lib.rs:322-324
Packet Organization
Serverbound Packets
Located inpumpkin-protocol/src/java/server/:
handshake/- Handshake state packetsstatus/- Status state packetslogin/- Login state packetsconfig/- Configuration state packetsplay/- Play state packets
Clientbound Packets
Located inpumpkin-protocol/src/java/client/:
status/- Status state packetslogin/- Login state packetsconfig/- Configuration state packetsplay/- Play state packets
Error Handling
Encoding Errors
pumpkin-protocol/src/lib.rs:335-343
Decoding Errors
pumpkin-protocol/src/lib.rs:345-361
VarInt Codec
The protocol uses VarInt encoding for efficient integer transmission.Implementation
Defined inpumpkin-protocol/src/codec/var_int.rs:21-106
Encoding Algorithm
- Cast value to u32 to handle negative numbers
- While value > 0x7F:
- Write (value & 0x7F) | 0x80
- Right shift value by 7 bits
- Write final byte (value & 0x7F)
pumpkin-protocol/src/codec/var_int.rs:41-52
Status Response
The server responds to status queries with server information:pumpkin-protocol/src/lib.rs:369-381
Testing
The encoder and decoder include comprehensive tests:- Encoding/decoding without compression or encryption
- Encoding/decoding with compression only
- Encoding/decoding with encryption only
- Encoding/decoding with both compression and encryption
- Maximum packet size validation
- Invalid data handling
pumpkin-protocol/src/java/packet_encoder.rs:323-739pumpkin-protocol/src/java/packet_decoder.rs:188-436
Next Steps
- Encryption - Learn about AES encryption
- Compression - Learn about Zlib compression
- Bedrock Edition - Compare with Bedrock protocol
