一般协议头关键因素
1,协议用途标志
2,协议id
3,消息长度
4,协议类型(请求/响应)
5,响应状态

dubbo默认采用netty进行网络传输,协议中对字节流的处理在com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec类中,包含了对request请求的编码和解码,response响应的编码和解码。
dubbo协议采用固定长度的消息头(16字节)和不定长度的消息体来进行数据传输,消息头定义了netty在IO线程处理时需要的信息,协议的报文格式如下:

dubbo_message_protocol_header

消息头详解

协议头是16字节的定长数据:

2byte magic:类似java字节码文件里的魔数,用来判断是不是dubbo协议的数据包。魔数是常量0xdabb
1byte 的消息标志位:16-20序列id,21 event,22 two way,23请求或响应标识
1byte 状态,当消息类型为响应时,设置响应状态。24-31位。状态位, 设置请求响应状态,dubbo定义了一些响应的类型。具体类型见com.alibaba.dubbo.remoting.exchange.Response
8byte 消息ID,long类型,32-95位。每一个请求的唯一识别id(由于采用异步通讯的方式,用来把请求request和返回的response对应上)
4byte 消息长度,96-127位。消息体 body 长度, int 类型,即记录Body Content有多少个字节。

解码过程 ExchangeCodec->encode-> encodeRequest

public void encode(Channel channel, ChannelBuffer buffer, Object msg) throws IOException {if (msg instanceof Request) {encodeRequest(channel, buffer, (Request) msg);} else if (msg instanceof Response) {encodeResponse(channel, buffer, (Response) msg);} else {super.encode(channel, buffer, msg);}
}
   protected void encodeRequest(Channel channel, ChannelBuffer buffer, Request req) throws IOException {Serialization serialization = getSerialization(channel);// header.byte[] header = new byte[HEADER_LENGTH];// set magic number.Bytes.short2bytes(MAGIC, header);// set request and serialization flag.header[2] = (byte) (FLAG_REQUEST | serialization.getContentTypeId());if (req.isTwoWay()) header[2] |= FLAG_TWOWAY;if (req.isEvent()) header[2] |= FLAG_EVENT;// set request id.Bytes.long2bytes(req.getId(), header, 4);// encode request data.int savedWriteIndex = buffer.writerIndex();buffer.writerIndex(savedWriteIndex + HEADER_LENGTH);ChannelBufferOutputStream bos = new ChannelBufferOutputStream(buffer);ObjectOutput out = serialization.serialize(channel.getUrl(), bos);if (req.isEvent()) {encodeEventData(channel, out, req.getData());} else {encodeRequestData(channel, out, req.getData());}out.flushBuffer();if (out instanceof Cleanable) {((Cleanable) out).cleanup();}bos.flush();bos.close();int len = bos.writtenBytes();checkPayload(channel, len);Bytes.int2bytes(len, header, 12);// writebuffer.writerIndex(savedWriteIndex);buffer.writeBytes(header); // write header.buffer.writerIndex(savedWriteIndex + HEADER_LENGTH + len);}

消息体详解

实现源码在DubboCodec.encodeRequestData(Channel channel, ObjectOutput out, Object data):

   protected void encodeRequestData(Channel channel, ObjectOutput out, Object data) throws IOException {RpcInvocation inv = (RpcInvocation) data;out.writeUTF(inv.getAttachment(Constants.DUBBO_VERSION_KEY, DUBBO_VERSION));out.writeUTF(inv.getAttachment(Constants.PATH_KEY));out.writeUTF(inv.getAttachment(Constants.VERSION_KEY));out.writeUTF(inv.getMethodName());out.writeUTF(ReflectUtils.getDesc(inv.getParameterTypes()));Object[] args = inv.getArguments();if (args != null)for (int i = 0; i < args.length; i++) {out.writeObject(encodeInvocationArgument(channel, inv, i));}out.writeObject(inv.getAttachments());}

消息体的内容如下:
1、dubbo版本号
2、invoke的路径
3、invoke的provider端暴露的服务的版本号
4、调用的方法名称
5、参数类型描述符
6、遍历请求参数值并编码
7、dubbo请求的attachments

dubbo协议报文消息格式相关推荐

  1. HTTP协议报文基本格式

    HTTP协议报文基本格式     HTTP协议(Hypertext Transfer Protocol――超文本传输协议),浏览器端(客户端)向WEB服务器端访问页面的过程和HTTP协议报文的格式. ...

  2. 六、Dubbo协议模块原理源码解析

    课程概要: RPC协议基本组成 RPC协议报文编码与实现详解 Dubbo中所支持RPC协议与使用 RPC协议基本组成 RPC 协议名词解释 在一个典型RPC的使用场景中,包含了服务发现.负载.容错.网 ...

  3. HTTP(超文本传输协议)报文格式

    HTTP请求报文 http请求报文数据分为三部分: 请求行 请求头部 请求数据 http请求报文的格式如下图所示: 下面是Get请求的例子: GET /92316461213.jpg HTTP/1.1 ...

  4. MQTT协议详解及开发教程(四)MQTT协议报文格式

    推荐一款稳定的基于C编写的MQTT Client开源库 cMQTT MQTT协议详解及开发教程(一)MQTT协议概述 MQTT协议详解及开发教程(二)MQTT服务器EMQx搭建 MQTT协议详解及开发 ...

  5. 5.3.1 TCP协议特点和TCP报文段格式

    5.3.1 TCP协议特点和TCP报文段格式

  6. 【计算机网络】网络层 : BGP 协议 ( BGP 协议简介 | BGP 协议信息交换 | BGP 协议报文格式 | BGP-4 常用报文 | RIP 、OSPF、BGP 协议对比 )

    文章目录 一.路由选择协议分类 二.BGP 协议 简介 三.BGP 协议 信息交换过程 三.BGP 协议 报文格式 四.BGP 协议 特点 五.BGP-4 协议的 四种报文 六.RIP .OSPF.B ...

  7. MQTT-SN协议乱翻之消息格式

    前言 紧接着上篇初步介绍,本文为第二篇,主要梳理MQTT-SN 1.2协议中定义的消息格式. 通用消息格式 消息头 其它可变部分 2/4字节表示 N字节组成 消息头部 长度 消息类型 1或3个字节 1 ...

  8. 计算机网络学习笔记(28. Email消息格式与POP协议)

    1. Email消息格式 2. Email消息格式:多媒体扩展 3. 邮件访问协议 4. POP协议 "下载并删除"模式 i.用户如果换了客户端软件,无法重读该邮件 "下 ...

  9. 三菱MELSEC 1帧协议报文格式。

    关于三菱 MC 1E协议报文说明: 是不是1E协议可以发送:D100 .报文: 01ff0A00 64 00 00 00 20 44   0200 试试,返回报文:810000000000 报文格式: ...

最新文章

  1. 使用JavaScript在文本框中的Enter键上触发按钮单击
  2. 入门Go语言神器!超全学习资源+笔记,新手从零学习全过程资源汇总
  3. 【转载】详解 Spring 3.0 基于 Annotation 的依赖注入实现
  4. Python 闭包详解
  5. 使用JQuery从客户端调用C#方法
  6. 转载:sqlmap的应用实战
  7. 三种python序列类型
  8. 【Python基础】为什么更改列表'y'也会更改列表'x'?
  9. C库函数 - strcspn()
  10. android电视手机遥控器,tcl电视遥控器
  11. jquery 获取 radio值 与 jQuery filter() 方法
  12. 维基百科 双线性插值
  13. PIC单片机入门教程(一)—— 准备工作
  14. 在计算机里看不到硬盘的信息,在电脑bios里面检测不到硬盘如何解决?
  15. 轩辕剑--资料集(三)
  16. 京东广告受众基础属性预估
  17. php计算笛卡尔积批量生成电商sku列表
  18. 速写在网站建设中的重要地位
  19. Numpy中stack(),hstack(),vstack()函数的使用方法
  20. Android基础--首选项(SharedPreferences)

热门文章

  1. qt界面和python怎么交互_python使用Qt界面以及逻辑实现
  2. 浪潮云分布式云ICP加速千行百业羽化创新
  3. 【python 字母索引】找到英文句子里面每个单词最后一个字母的索引
  4. 大数据产品经理极速撰写PRD的5个步骤
  5. 产品经理必须懂的【测试知识】
  6. 大数据分析工具Power BI(十):制作可视化图表的报表类型
  7. zygomys——golang实现lisp语言
  8. Whale帷幄 - saas营销推广策划 saas营销解决方案
  9. 面试智力题:海盗分珍珠
  10. Win10 + VS2017 + CPU + opencv3.2 + Darknet 配置