首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

MOOON 分散式訊息結構深度解析:支援 IPv4/IPv6 雙棧的高效二進制協議

     編輯:關於C語言

設計權衡:IPv4/IPv6 共存策略

為兼容雙協議棧,訊息頭採用編譯期宏切換地址長度:

#ifdef IPV6_SUPPORTED
    #define IP_BYTES (4*4) // IPv6 16 bytes
#else
    #define IP_BYTES 4     // IPv4 4 bytes
#endif

來源與目標 IP 必須同版本,不允許混用,犧牲 IPv4 場景 24 bytes 空間換取代碼簡潔與零拷貝解析。

核心結構定義

#pragma pack(4) // 4-byte 對齊

typedef struct TDistributedMessageFlags {
    union {
        uint32_t flags;
        struct {
            uint32_t ip_type:1;   // IPv4/IPv6 標識
            uint32_t reserved:31; // 預留擴展
        } flags_bits;
    } flags;
    TDistributedMessageFlags(uint32_t v) : flags(v) {}
} distribted_message_flags_t;

typedef struct TDistributedMessage {
    net::common_message_header header; // 通用頭部
    uint32_t flags;                    // 標誌位
    uint32_t source_ip[IP_BYTES];      // 來源 IP
    uint32_t destination_ip[IP_BYTES]; // 目的 IP
    uint16_t source_port;
    uint16_t destination_port;
    uint32_t source_service_id;
    uint32_t destination_service_id;
    uint32_t source_session_id;
    uint32_t destination_session_id;
    uint32_t source_sequence_number;   // 解決 TIME_WAIT 類問題
    uint32_t destination_sequence_number;
    uint32_t source_thread_affinity;   // 執行緒親和性綁定
    uint32_t destination_thread_affinity;
    char data[0];                      // 柔性陣列承載業務負載
    std::string to_string() const;     // 除錯轉字串
} distribted_message_t;

#pragma pack()

關鍵設計亮點

  • 位域優化 Flags:僅 1 bit 標識 IP 版本,其餘 31 bit 預留未來擴展
  • 序列號機制:雙向序列號獨立遞增,解決連接復用時的舊封包干擾
  • 執行緒親和性:來源/目標執行緒親和值,支援無鎖佇列精準分發
  • 零拷貝友好:data[0] 柔性陣列配合記憶體池,實現頭部與負載單次分配

已知代價

IPv4 場景下每訊息固定多佔 24 bytes(雙 IP 各浪費 12 bytes)。高吞吐場景可考慮壓縮編碼或分版本協議優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved