本文僅記錄研究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
有了上述說明,再看代碼時就不會被其中的各類幀解析代碼搞暈了!