【原創】抓包分析RabbitMQ的幀數據構成

     本文僅記錄研究rabbitmq-c客戶端源碼時,對RabbitMQ幀數據構成進行總結。 api

     先上一張圖: 服務器

     上圖是rabbitmq-c客戶端與服務器進行初始信令交互時的抓包,在此僅此做爲示例使用。其中圖中所示爲第一條Connection.Start信令的具體內容。請關注如下幾個值: spa

1.第一行顯示的Length值爲389 code

2.協議內部的Length值爲327 rabbitmq

     那麼389-327=62字節的內容都包括了什麼?其包括了:14(Ethernet頭)+20(IP頭)+20(TCP頭)=54字節,以及AMQP的幀數據 7(幀頭)+1(幀尾)=8字節。 rpc

     源碼中有以下結構: get

struct amqp_connection_state_t_ {
  amqp_pool_t frame_pool;
  amqp_pool_t decoding_pool;

  amqp_connection_state_enum state;

  int channel_max;
  int frame_max;
  int heartbeat;
  amqp_bytes_t inbound_buffer;

  size_t inbound_offset;
  size_t target_size;

  amqp_bytes_t outbound_buffer;

  int sockfd;
  amqp_bytes_t sock_inbound_buffer;
  size_t sock_inbound_offset;
  size_t sock_inbound_limit;

  amqp_link_t *first_queued_frame;
  amqp_link_t *last_queued_frame;

  amqp_rpc_reply_t most_recent_api_result;
};

     其中 target_size 是指什麼呢?咱們能夠從另外三段代碼中找到答案: input

在amqp_new_connection中 源碼

state->target_size = 8;
在return_to_idle中
state->target_size = HEADER_SIZE;
在amqp_handle_input中
state->target_size = amqp_d32(raw_frame, 3) + HEADER_SIZE + FOOTER_SIZE;

     哈哈,原來該值正是AMQP的實際要處理的幀的長度(在上例中其實就是327+7+1)。 it

     有了上述說明,再看代碼時就不會被其中的各類幀解析代碼搞暈了!

相關文章
相關標籤/搜索