Skip to main content

A lightweight binary protocol implementation

Project description

Custom Binary Protocol API

A Python implementation of a configurable binary protocol for efficient data transfer without HTTP/REST overhead.

Requirements

  • Python 3.8 or higher
  • asyncio (built-in)
  • pytest (for running tests)

Overview

This project implements a lightweight, configurable binary protocol for client-server communication in Python. Unlike traditional REST APIs, this implementation uses a custom binary protocol for data transfer, resulting in lower latency and reduced network overhead.

Key Features

  • Structured Message Format: Define message structures with typed fields
  • Efficient Data Transfer: Custom binary protocol minimizes overhead compared to HTTP/REST
  • Type-safe Field Handling: Automatic serialization of primitive types
  • Asynchronous Communication: Built on asyncio for high-performance I/O operations
  • Zero Dependencies: Pure Python implementation with no external requirements
  • Bi-directional Communication: Supports full-duplex communication between client and server
  • Fixed and Variable Length Fields: Support for both fixed and variable-length data
  • Optimized Performance: Fast-path for fixed-length messages

Quick Examples

Message Type Definition

from enum import IntEnum
from binary_protocol.protocol.message_structure import FieldDefinition, MessageStructure

# Define message types
class MessageType(IntEnum):
    SENSOR_DATA = 1
    STATUS = 2
    BENCHMARK = 3
    FIXED_BENCHMARK = 4  # New message type for fixed-length benchmarks

# Define fixed-length structure for high-speed sensor data
sensor_data_structure = MessageStructure([
    FieldDefinition("sensor1", float, format_string=">f"),  # 4-byte float
    FieldDefinition("sensor2", float, format_string=">f"),
    FieldDefinition("sensor3", float, format_string=">f"),
    FieldDefinition("sensor4", float, format_string=">f")
])

# Variable-length structure example
status_structure = MessageStructure([
    FieldDefinition("status_code", int, format_string=">I"),
    FieldDefinition("message", str)  # Variable length
])

# Fixed-length benchmark structure
fixed_benchmark_structure = MessageStructure([
    FieldDefinition("value", int, format_string=">I")  # 4-byte integer
])

Protocol Configuration

from binary_protocol import ProtocolConfig

config = ProtocolConfig(
    message_type_enum=MessageType,
    message_structures={
        MessageType.SENSOR_DATA: sensor_data_structure,
        MessageType.STATUS: status_structure,
        MessageType.BENCHMARK: benchmark_structure,
        MessageType.FIXED_BENCHMARK: fixed_benchmark_structure
    },
    header_format=">H",  # 2-byte header for message type
    max_payload_size=10 * 1024 * 1024  # 10MB
)

Benchmarking Tools

The protocol includes comprehensive benchmarking capabilities:

Available Benchmarks

  1. Variable Size Benchmark

    • Tests payload sizes from 1B to 9MB
    • Adaptive batch sizes for memory efficiency
    • Measures throughput and protocol overhead
    • Default: 50 iterations per size
  2. Fixed Length Benchmark

    • Optimized for 4-byte integer messages
    • Large batch processing (100,000 messages)
    • Minimal protocol overhead
    • Default: 1,000 iterations
  3. Sensor Data Benchmark

    • Simulates real-world sensor data (4x float values)
    • High-frequency transmission testing
    • Batch size: 50,000 messages
    • Default duration: 10 seconds

Running Benchmarks

Run benchmarks in example folder:

python examples/benchmark_server.py
python examples/benchmark_client.py

Protocol Configuration Options

Option Description Default
message_type_enum Enum class for message types Required
message_structures Dict of structures per type Required
header_format Struct format for message header ">H"
max_payload_size Maximum allowed payload size 1MB
connect_timeout Connection timeout in seconds 30.0
read_timeout Read operation timeout 30.0

Field Types and Performance

Field Type Format Performance Impact Batch Support
int/float (fixed) ">f", ">i", etc. Fastest Up to 100k msgs/batch
fixed-length str/bytes fixed_length=N Fast Up to 50k msgs/batch
variable-length str/bytes None Additional overhead Dynamic batch size

Security Considerations

  1. Encryption: Consider adding TLS for secure communication
  2. Authentication: Implement a secure authentication mechanism
  3. Input Validation: Validate field contents
  4. Rate Limiting: Protect against DoS attacks
  5. Message Size Limits: Configure appropriate max_payload_size

Configuration Options

Transport Configuration

Option Description Default Notes
transport_type TCP or UDP transport TCP Affects reliability and ordering
connect_timeout Connection timeout (s) 30.0 TCP only
read_timeout Read operation timeout 30.0 Both TCP/UDP
write_timeout Write operation timeout 30.0 TCP only
buffer_size Network buffer size 8192 Affects performance

Protocol Configuration

Option Description Default Impact
header_format Message header format ">H" Protocol overhead
max_payload_size Maximum payload size 1MB Memory usage
checksum_enabled Enable checksums False CPU usage
checksum_size Checksum size (bytes) 4 When enabled
validate_message Custom validation None CPU usage

Performance Tuning

Setting TCP UDP Notes
Fixed-length messages Optimal Optimal Fastest processing
Variable-length Good Fair Additional overhead
Large payloads Excellent Poor UDP fragmentation
High frequency Good Excellent UDP for minimal latency

Performance Optimizations

Option Description Default Impact
enable_performance_improvements Enable memory pooling and zero-copy optimizations True Significant memory and CPU improvement

When enable_performance_improvements is True (default):

  • Uses message pooling to reduce GC pressure
  • Implements zero-copy operations where possible
  • Optimizes fixed-length message handling
  • Reduces memory allocations

Example configuration with performance improvements:

config = ProtocolConfig(
    message_type_enum=MessageType,
    message_structures={
        MessageType.SENSOR_DATA: sensor_data_structure,
        MessageType.STATUS: status_structure
    },
    enable_performance_improvements=True  # Enable optimizations
)

Note: Disabling performance improvements may be useful for debugging or when memory usage is not a concern.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

binary_protocol-0.2.1.tar.gz (16.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

binary_protocol-0.2.1-py3-none-any.whl (17.6 kB view details)

Uploaded Python 3

File details

Details for the file binary_protocol-0.2.1.tar.gz.

File metadata

  • Download URL: binary_protocol-0.2.1.tar.gz
  • Upload date:
  • Size: 16.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for binary_protocol-0.2.1.tar.gz
Algorithm Hash digest
SHA256 fe0517a3f8c28565c8a3685bd5368d04b1f05e4818ab104c0c157e68d8f76c54
MD5 c847158a4e461a084476d2450664f4df
BLAKE2b-256 8dc4b6927fa37c557b10d1314adc087c80d35665a0a91e8477c7bd60cee618d7

See more details on using hashes here.

File details

Details for the file binary_protocol-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for binary_protocol-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 adfb5ac9fab38a225a7e0b0aff1b4cec559a808abf672104ed68ff159538fe15
MD5 3b6a1e53dfac877d656c1d24f8720a0e
BLAKE2b-256 17b4d2f5cc22bbb5a86fda6e8593ef5dbcbc23bc8d4eb384f1e0d04f29be6abe

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page