博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】抓包分析RabbitMQ的帧数据构成
阅读量:6089 次
发布时间:2019-06-20

本文共 1125 字,大约阅读时间需要 3 分钟。

hot3.png

     本文仅记录研究rabbitmq-c客户端源码时,对RabbitMQ帧数据构成进行总结。

     先上一张图:

     上图是rabbitmq-c客户端与服务器进行初始信令交互时的抓包,在此仅此作为示例使用。其中图中所示为第一条Connection.Start信令的具体内容。请关注以下几个值:

1.第一行显示的Length值为389

2.协议内部的Length值为327

     那么389-327=62字节的内容都包括了什么?其包括了:14(Ethernet头)+20(IP头)+20(TCP头)=54字节,以及AMQP的帧数据 7(帧头)+1(帧尾)=8字节。

     源码中有如下结构:

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 是指什么呢?我们可以从另外三段代码中找到答案:

在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)。

     有了上述说明,再看代码时就不会被其中的各种帧解析代码搞晕了!

转载于:https://my.oschina.net/moooofly/blog/104441

你可能感兴趣的文章
Linux下内存泄漏工具【转】
查看>>
关于用自定义指令在vue中实现元素拖动
查看>>
hdu1028 Ignatius and the Princess III
查看>>
CentOS升级kernel
查看>>
[Luogu1075] 质因数分解
查看>>
LeetCode OJ:Three Sum(三数之和)
查看>>
LeetCode OJ:Minimum Size Subarray Sum(最小子数组的和)
查看>>
【nodejs原理&源码赏析(3)】欣赏手术级的原型链加工艺术
查看>>
Fitts’ Law / 菲茨定律(费茨法则)
查看>>
Nginx 之:nginx.conf结构
查看>>
curl zip上传并且解压
查看>>
Safecracker
查看>>
List遍历以及剔除指定数据
查看>>
Apache+php+mysql+SQLyog在windows7下的安装与配置图解
查看>>
浏览器安全有关同源策略
查看>>
如何通过手机号码核实真实姓名
查看>>
数据库迁移之从oracle 到 MySQL
查看>>
WebService_HelloWorld
查看>>
sql 把特定数据排在最前面
查看>>
JS基本概念 -- 数据类型(二)
查看>>