请教大神,在一般二进制协议设计时候,为什么设计一个魔数的字段? 他的作用是啥? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
NUT
V2EX    Java

请教大神,在一般二进制协议设计时候,为什么设计一个魔数的字段? 他的作用是啥?

  •  
  •   NUT Jun 8, 2017 5199 views
    This topic created in 3245 days ago, the information mentioned may be changed or developed.

    最近在看 RPC 框架中,经常会看到 在协议的开头或者结尾 都有一个Magic Code字段,这个设计目的是啥? 是为了 校验数据包完整性或是 区分数据包吗? 类似

    谢谢大家。

    17 replies    2017-06-08 18:13:58 +08:00
    bp0
        2
    bp0  
       Jun 8, 2017   1
    MAGIC 正确,则数据包可能有效。

    MAGIC 不正确,那么即使数据包“正确(可通过 CRC 校验等)”,也是不无效的。
    am241
        3
    am241  
       Jun 8, 2017 via Android   1
    遇到魔数就可以开始检包逻辑了,显式的起始标志
    owenliang
        4
    owenliang  
       Jun 8, 2017
    随便校验一下。
    senghoo
        5
    senghoo  
       Jun 8, 2017
    常见的情况是表示包头的起始点。
    mengzhuo
        6
    mengzhuo  
       Jun 8, 2017   1
    而且二进制协议最好是定长的头部,最好是 8byte 的倍数~
    jiangzhuo
        7
    jiangzhuo  
       Jun 8, 2017
    据说中国程序员用的最多的魔数是 9527
    NUT
        8
    NUT  
    OP
       Jun 8, 2017
    @jiangzhuo #7 有啥内涵? ;-)
    LancerXin
        9
    LancerXin  
       Jun 8, 2017   1
    个人理解:
    就是起始的标志,这样的好处是就算流中间某段缺失了也可以在后续的某个关键字地址恢复到正常的解析.
    其实主要是为了做到最大容错.

    当然如果是 tcp,你很难在上层碰到流缺失的情况,因为 tcp 本身就有机制保证网络包的顺序性和完整性.

    不怕一万就怕万一..
    Phariel
        10
    Phariel  
       Jun 8, 2017
    @NUT #8 星爷梗
    qiayue
        11
    qiayue  
    PRO
       Jun 8, 2017
    流源源不断的来,你需要在万一出现问题的情况下,也能从中找出正确的数据包
    pippo
        12
    pippo  
       Jun 8, 2017
    比如 Spring Boot 可以把工程打包成可执行文件。
    就是利用了 zip 文件从魔数开始识别,魔数前面的作为 shell script 好像。
    pubby
        13
    pubby  
       Jun 8, 2017 via Android
    可以理解成协议特征的一部分,否则就要按端口之类的识别。

    也方便开发抓包分析工具的插件之类
    pimin
        14
    pimin  
       Jun 8, 2017 via Android
    一般是识别用的,告诉对方我是 2B,按照对待 2B 的方式对待我就阔以咯
    laoyur
        15
    laoyur  
       Jun 8, 2017
    @NUT #8 这。。。9527 都不知道啊
    Cbdy
        16
    Cbdy  
       Jun 8, 2017   3
    上周刚看完深入理解 Java 虚拟机,摘一段话:

    “使用魔数而不是扩展名来进行识别主要是基于安全方面的考虑,因为文件扩展名可以随意地改动。文件格式的制定者可以自由地选择魔数值,只要这个魔数值还没有被广泛采用过同时又不会引起混淆即可。Class 文件的魔数的获得很有“浪漫气息”,值为:0xCAFEBABE (咖啡宝贝?),这个魔数值在 Java 还称做“ Oak ”语言的时候(大约是 1991 年前后)就已经确定下来了。它还有一段很有趣的历史,据 Java 开发小组最初的关键成员 Patrick Naughton 所说:“我们一直在寻找一些好玩的、容易记忆的东西,选择 0xCAFEBABE 是因为它象征着著名咖啡品牌 Peet ’ s Coffee 中深受欢迎的 Baristas 咖啡”,这个魔数似乎也预示着日后“ Java ”这个商标名称的出现。”

    要我说,魔数也是程序员的浪漫吧,蛤蛤
    NUT
        17
    NUT  
    OP
       Jun 8, 2017
    @pimin #14 2333
    About     Help     Advertise     Blog     API     FAQ     Solana     3789 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 135ms UTC 05:04 PVG 13:04 LAX 22:04 JFK 01:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86