DSF 私有协议编码分析

DSF 消息序列化与反序列解析

DSF框架消息序列化与反序列化 ProtoBuff协议 , 是通过拓展Netty的ByteBuf实现的, 具体实现类名为com.huawei.csc.remoting.common.buf.impl.NettyBuffer

com.huawei.csc.usf.framework.bus.MsgCoder 实现了com.huawei.csc.remoting.common.encode.MessageEncoder和 com.huawei.csc.remoting.common.decode.MessageDecoder两个接口,com.huawei.csc.usf.framework.bus.DSFMsgCoder 继承了MsgCoder实现了对DSF协议的编解码器。

协议编码

对象编码方式

ID Type
-1 null
1 string
2 protostaff bytes
3 USFCtxObject
4 byte[]

string 对象编码方法:

length | UTF8 bytes

byte[] 对象编码方法 :

length | bytes

USFCtxObject 对象编码方式

USFObjType | Obj

protostaff bytes 编码方式

length | bytes

Obj 编码方法:

id | obj

其他泛型的编码方式:

map 编码方式

mapsize | Key(string) | Value(obj) | key2|value2...

array of obj[]

length |obj1 | obj2

UsfObjType: 0 LOCAL, 1 REMOTE, 2 LOCAL_MANUAL;
| 仅为了便于阅读,并未使用分割符

协议的编码方式是典型的变长编码法:所有对象的编码方式都是 id|obj的方式进行编码,先向buffer中写对象类型,然后紧跟着写对象序列化后的的bytes,中间的“|”仅为了便于阅读,并不是分隔符。string、byte[],除sting、byte[] 和USFCtxObject 之外,其他自定义的对象都是通过protostaff进行序列化,string\byte[]\USFCtxObject、Map、Array 的序列化方法见表格,一般是 Lenght|bytes的方法进行序列化。

DSF协议定义:

magic msgType msg encode(type val name -> )
4 bindrequest int MsgLen </P> byte 4 MsgMagic </P> int seqid </P> string payload</P> string version
5 bindresponse,bindVersionV1 int MsgLen </P> byte 5 MsgMagic </p> int seqid </p>string PayLoad
5 bindresponse,otherversion int MsgLen </p> byte 5 Msg Magic</p> int SeqId </p> Object PayLoad
0 request int MsgLen</p> byte 0 MsgMagic </p> string ReqId </p>int isAsync :0-> no 1->yes </p> int 0 msgType: 0->request 1->reply </p> string serviceName </p> string operationName </p>Long Long Int : 0L0L0d MsgSeprator</p> Obj[] payload </p> string group</p> map attachement (with sendtime) </p> Object reqobj </p> Object null(0xffffffff) excption
0 reply int MsgLen</p> byte 0 Msg Magic </p> string ReqId </p> int isAsync </p> int 1 msgType:0->request 1->reply </p> string serviceName </p> string operation </p> Long 0L |Long 0L|int 0 MsgSeprator</p> payload:null(-1,0xfffffffff) </p> string group </p> map attachement(with sendtime)</p> Object rspObj </p> Object exception

msgtype : 0 request 1 respons
isSync : 0 no 1 yes
len-4 是因为 java int 为32位 占4个byte
报文中的 0xffffffff 是 表示对象为 null

从抓包分析来看,DSF协议并没有按照其父类的设计,写 magic、servicegroup、src、des 等等,估计是开发人员没有按照大师的设计来,进行了一部分简化。另外本身协议设计也是根据固定读写顺序来的,协议拓展性并不高;协议内容中因为大量使用int类型传输数据,协议压缩率可以进一步提升。

DSF 抓包分析

--request bigend ?

0000008b00000000013100000000000000000000000853657276696365410000000873617948656c6c6f000000000000000000000000000000000000000000000001000000010000000568656c6c6f0000000764656661756c74000000010000000873656e6454696d650000000300000000000000010000000d31353031333739303237393037ffffffffffffffff

--request hex

           0  1  2  3  4  5  6  6   8  9  a  b  c  d  e  f
           -----------------------------------------------
00000000  00 00 00 8b 00 00 00 00  01 31 00 00 00 00 00 00   ........ .1......
00000010  00 00 00 00 00 08 53 65  72 76 69 63 65 41 00 00   ......Se rviceA..
00000020  00 08 73 61 79 48 65 6c  6c 6f 00 00 00 00 00 00   ..sayHel lo......
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ........ ........
00000040  00 01 00 00 00 01 00 00  00 05 68 65 6c 6c 6f 00   ........ ..hello.
00000050  00 00 07 64 65 66 61 75  6c 74 00 00 00 01 00 00   ...defau lt......
00000060  00 08 73 65 6e 64 54 69  6d 65 00 00 00 03 00 00   ..sendTi me......
00000070  00 00 00 00 00 01 00 00  00 0d 31 35 30 31 33 37   ........ ..150137
00000080  39 30 32 37 39 30 37 ff  ff ff ff ff ff ff ff      9027907. .......

request 解析


           0  1  2  3  4  5  6  7   8  9  a  b  c  d  e  f            ascii msg
           -----------------------------------------------
00000000  00 00 00 8b|00 00 00 00| 01|31|00 00 00 00|00 00   ........ .1......
       package len 8b|msg type 0 |len|id| is async  |msg   
00000010  00 00|00 00 00 08|53 65  72 76 69 63 65 41|00 00   ......Se rviceA..
     send    0 |string len8| S  e   r  v  i  c  e  A|str len 8
                           |Servicename             |
00000020  00 08|73 61 79 48 65 6c  6c 6f|00 00 00 00 00 00   ..sayHel lo......
               | s  a  y  H  e  l   l  o|          OL
               |operation name          |OL 0L 0d seprator
00000030  00 00|00 00 00 00 00 00  00 00|00 00 00 00|00 00   ........ ........
               |         OL             |     Od    |obj len 1
00000040  00 01|00 00 00 01|00 00  00 05|68 65 6c 6c 6f|00   ........ ..hello.
               | obj type 1|string len 5| h  e  l  l  o| 
               |ref objtype|in param                   |   
00000050  00 00 07|64 65 66 61 75  6c 74|00 00 00 01|00 00   ...defau lt......
         str len 7| d  e  f  a  u   l  t|map size  1|
                  |group name           |attachment map 
00000060  00 08|73 65 6e 64 54 69  6d 65|00 00 00 03|00 00   ..sendTi me......
      str len 8| s  e  n  d  T  i   m  e|           |
               |key :sendTime           |USFCtxObject|USFOBjType                
00000070  00 00|00 00 00 01|00 00  00 0d|31 35 30 31 33 37   ........ ..150137
               |string    1|            | 1  5  0  1  3  7 
               |obj type   |str  len 10 |string content 
00000080  39 30 32 37 39 30 37|ff ff  ff ff |ff ff ff ff   9027907. .......
           9  0  2  7  9  0  8|req obj      |exception

--reply

0000008d00000000013100000000000000010000000853657276696365410000000873617948656c6c6f0000000000000000000000000000000000000000ffffffff0000000764656661756c74000000010000000873656e6454696d650000000300000000000000010000000d31353031333739303237393131000000010000000b68656c6c6f3a68656c6c6fffffffff

--reply hex


              0  1  2  3  4  5  6  6   8  9  a  b  c  d  e  f
   00000000  00 00 00 8d|00 00 00 00| 01|31|00 00 00 00|00 00   ........ .1......
               len 8d   |type     0 |len|id|isAsync    | msg
   00000010  00 01|00 00 00 08|53 65  72 76 69 63 65 41|00 00   ......Se rviceA..
          reply 01| str len   |servicename             |str len 
   00000020  00 08|73 61 79 48 65 6c  6c 6f|00 00 00 00 00 00   ..sayHel lo......
                  |operation name          |  0L   
   00000030  00 00|00 00 00 00 00 00  00 00|00 00 00 00|ff ff   ........ ........
                  |          0L            |     0d    |null -1 reply has in params
   00000040  ff ff|00 00 00 07|64 65  66 61 75 6c 74|00 00 00   ......de fault...
                  | str len  7| d  e   f  a  u  l  t|
                  |groupname                        |attachement map size  1
   00000050  01|00 00 00 08|73 65 6e  64 54 69 6d 65|00 00 00   .....sen dTime...
               |str len    |    key                 |obj type usfctxobj 03
   00000060  03 |00 00 00 00|00 00 00 01|00 00 00 0d|31 35 30   ........ .....150
                | local     |obj type string  len 0d|
   00000070  31 33 37 39 30 32 37 39  31 31|00 00 00 01|00 00   13790279 11......
            rsptime                        |resp obj   |
                                           |obj type 1 |string len 0x0b
   00000080  00 0b|68 65 6c 6c 6f 3a  68 65 6c 6c 6f|ff ff ff   ..hello: hello...
                  |                                 |Null exception 
                  |response   content               |
   00000090  ff                                              .

通过以上研究,可以在后期使用跨语言访问dsf,详细抓包文件请使用 tcp.port eq 50254 ,另外可能是gitea存在bug,无法正常查看部分表格。

Next: DSF zookeeper的Node 组织



结构:
DSFCtxObject
--type : int( LOCAL,REMOTE,LOCAL_MANUAL)
--Obj : protostaff bytes
-------- length: int
-------- ObjectCompressBytes :gziped bytes,用protostaff.GraphIOUtil.writeTo 方法产生ObjectPack 的bytes,然后gzip
---ObjectPack
--Object

DSFCtxObject 解码方法:

  1. read type
  2. read length
  3. read byte[length]
    4.unzip
    5.GraphIOUtil.mergeFrom
    6.gen DSFCtxObject

DSFCtxObject编码方法:
0.write byte 4
1.write DSFCtxObject.type
2.ObjectPack(DSFCtxObject.obj)
3.protostaff.GraphIOUtil.writeTo(objpack) 生成待压缩bytes
4.gzip compress
5.write length of compress bytes
6.write compressed bytes

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换...
    x360阅读 2,464评论 1 20
  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 10,836评论 0 24
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,066评论 0 62
  • 在曼城 牛津路的火車橋洞下,常常在放學的路途中我會遇到這樣一個乞討者。 大概六十的年紀,和所有乞丐的職業形象一樣,...
    笙如蚁阅读 272评论 0 0