Compression Implementation
Compression is implemented for Java Edition connections using the Zlib algorithm.Dependencies
Defined inpumpkin-protocol/Cargo.toml:30-32
- async-compression: Async zlib compression/decompression
- flate2: Synchronous zlib compression for testing
Compression Types
Defined inpumpkin-protocol/src/lib.rs:40-51
Compression Threshold
Packets smaller than the threshold are sent uncompressed. Typical value: 256 bytesCompression Level
Controls the compression ratio vs CPU usage tradeoff:- 0: No compression
- 1: Fastest, least compression
- 6: Default balance (recommended)
- 9: Best compression, slowest
Encoder Compression
TheTCPNetworkEncoder compresses outgoing packets when they exceed the threshold.
Compression State
Defined inpumpkin-protocol/src/java/packet_encoder.rs:83-90
Fields
- compression: Optional compression settings
- compressor: Reusable zlib compressor state
- compression_scratch: Reusable buffer for compressed data
Enabling Compression
Defined inpumpkin-protocol/src/java/packet_encoder.rs:103-108
Compression Algorithm
Defined inpumpkin-protocol/src/java/packet_encoder.rs:119-165
Buffer Reuse
The encoder reuses compression buffers to minimize allocations:- Compression scratch buffer is cleared but capacity retained
- Compressor state is reset and reused for same compression level
- New compressor only created when level changes
Compressed Packet Format
Defined inpumpkin-protocol/src/java/packet_encoder.rs:182-191
Format
Encoding Logic
Defined inpumpkin-protocol/src/java/packet_encoder.rs:215-285
Key Points
-
Data Length Field:
- If compressed: uncompressed data length
- If not compressed: 0
-
Threshold Check: Data is only compressed if
data_len >= threshold - Packet Length: Always the total bytes after this field
Decoder Decompression
TheTCPNetworkDecoder decompresses incoming packets.
Decompression State
Defined inpumpkin-protocol/src/java/packet_decoder.rs:76-80
Enabling Compression
Defined inpumpkin-protocol/src/java/packet_decoder.rs:90-92
Decompression Algorithm
Defined inpumpkin-protocol/src/java/packet_decoder.rs:122-146
Validation
- Size Limits: Decompressed length must be ≤
MAX_PACKET_DATA_SIZE(8 MB) - Threshold Check: Uncompressed packets > threshold trigger error
- Length Verification: Actual decompressed size must match declared size
pumpkin-protocol/src/java/packet_decoder.rs:170-177
Decompression Reader
Defined inpumpkin-protocol/src/java/packet_decoder.rs:13-36
Compression with Encryption
Processing Order
Encoding (Server → Client):- Encoder:
pumpkin-protocol/src/java/packet_encoder.rs:12(comment) - Decoder:
pumpkin-protocol/src/java/packet_decoder.rs:11(comment)
Implementation
Performance Considerations
Buffer Reuse
The encoder reuses buffers to minimize allocations:Compressor Reuse
The zlib compressor state is reused when compression level doesn’t change:Async Decompression
Decompression uses async zlib decoder to avoid blocking:Testing Compression
Test: Encode with Compression
Defined inpumpkin-protocol/src/java/packet_encoder.rs:444-494
Test: Decode with Compression
Defined inpumpkin-protocol/src/java/packet_decoder.rs:288-307
Test: Small Payload No Compression
Defined inpumpkin-protocol/src/java/packet_encoder.rs:697-738
Bedrock Edition Compression
Current Status
Bedrock Edition compression is partially implemented:Planned Implementation
Bedrock Edition will support zlib compression similar to Java Edition.Error Handling
Compression Errors
pumpkin-protocol/src/lib.rs:339
Decompression Errors
pumpkin-protocol/src/lib.rs:355-357
Best Practices
Threshold Selection
- Too Low: Wastes CPU compressing small packets
- Too High: Wastes bandwidth on large packets
- Recommended: 256 bytes (Minecraft default)
Compression Level
- Level 1-3: Fast, lower compression ratio
- Level 6: Balanced (recommended for servers)
- Level 9: Best compression, high CPU usage
Buffer Management
The encoder automatically manages buffer sizes:Next Steps
- Encryption - Learn about packet encryption
- Java Edition Protocol - See compression in context
- Overview - Return to protocol overview
