精华内容
下载资源
问答
  • 习惯用 Json、XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json、XML 真的强!太!多! 由于 Google出品,我相信...

    前言

    • 习惯用 Json、XML 数据存储格式的你们,相信大多都没听过Protocol Buffer
    • Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json、XML 真的强!太!多!

    由于 Google出品,我相信Protocol Buffer已经具备足够的吸引力

    • 今天,我将讲解为什么Protocol Buffer的性能如此的好:
      a. 序列化速度 & 反序列化速度快
      b. 数据压缩效果好,即序列化后的数据量体积小

    阅读本文前请先阅读:

    1. 快来看看Google出品的Protocol Buffer,别只会用Json和XML了
    2. 手把手教你如何安装Protocol Buffer
    3. 这是一份很有诚意的 Protocol Buffer 语法详解

    目录

    目录


    1. 定义

    一种 结构化数据 的数据存储格式(类似于 XML、Json

    1. Google 出品 (开源)
    2. Protocol Buffer 目前有两个版本:proto2proto3
    3. 因为proto3 还是beta 版,所以本次讲解是 proto2

    2. 作用

    通过将 结构化的数据 进行 串行化(序列化),从而实现 数据存储 / RPC 数据交换的功能

    1. 序列化: 将 数据结构或对象 转换成 二进制串 的过程
    2. 反序列化:将在序列化过程中所生成的二进制串 转换成 数据结构或者对象 的过程

    3. 特点

    • 对比于 常见的 XML、Json 数据存储格式,Protocol Buffer有如下特点:

    Protocol Buffer 特点


    4. 应用场景

    传输数据量大 & 网络环境不稳定 的数据存储、RPC 数据交换 的需求场景

    如 即时IM (QQ、微信)的需求场景


    总结

    传输数据量较大的需求场景下,Protocol BufferXML、Json 更小、更快、使用 & 维护更简单!


    5. 使用流程

    关于 Protocol Buffer 的使用流程,具体请看我写的文章:快来看看Google出品的Protocol Buffer,别只会用Json和XML了


    6. 知识基础

    6.1 网络通信协议

    • 序列化 & 反序列化 属于通讯协议的一部分
    • 通讯协议采用分层模型:TCP/IP模型(四层) & OSI 模型 (七层)

    通信协议结构

    • 序列化 / 反序列化 属于 TCP/IP模型 应用层 和 OSI`模型 展示层的主要功能:

      1. (序列化)把 应用层的对象 转换成 二进制串
      2. (反序列化)把 二进制串 转换成 应用层的对象
    • 所以, Protocol Buffer属于 TCP/IP模型的应用层 & OSI模型的展示层

    6.2 数据结构、对象与二进制串

    不同的计算机语言中,数据结构,对象以及二进制串的表示方式并不相同。

    a. 对于数据结构和对象

    • 对于面向对象的语言(如Java):对象 = Object = 类的实例化;在Java中最接近数据结构 即 POJOPlain Old Java Object),或Javabean(只有 setter/getter 方法的类)

    • 对于半面向对象的语言(如C++),对象 = class,数据结构 = struct

    b. 二进制串

    • 对于C++,因为具有内存操作符,所以 二进制串 容易理解:C++的字符串可以直接被传输层使用,因为其本质上就是以 '\0' 结尾的存储在内存中的二进制串
    • 对于 Java,二进制串 = 字节数组 =byte[]
    1. byte 属于 Java 的八种基本数据类型
    2. 二进制串 容易和 String混淆:String 一种特殊对象(Object)。对于跨语言间的通讯,序列化后的数据当然不能是某种语言的特殊数据类型。

    6.3 T - L - V 的数据存储方式

    • 定义
      Tag - Length - Value标识 - 长度 - 字段值 存储方式

    • 作用
      标识 - 长度 - 字段值 表示单个数据,最终将所有数据拼接成一个 字节流,从而 实现 数据存储 的功能

    其中 Length可选存储,如 储存Varint编码数据就不需要存储Length

    • 示意图

    最终存储的字节流

    • 优点
      从上图可知,T - L - V 存储方式的优点是
      1. 不需要分隔符 就能 分隔开字段,减少了 分隔符 的使用
      2. 各字段 存储得非常紧凑,存储空间利用率非常高
      3. 若 字段没有被设置字段值,那么该字段在序列化时的数据中是完全不存在的,即不需要编码

    相应字段在解码时才会被设置为默认值


    7. 序列化原理解析

    请记住Protocol Buffer三个关于数据存储 的重要结论:

    • 结论1: Protocol Buffer将 消息里的每个字段 进行编码后,再利用T - L - V 存储方式 进行数据的存储,最终得到的是一个 二进制字节流

    序列化 = 对数据进行编码 + 存储

    • 结论2:Protocol Buffer对于不同数据类型 采用不同的 序列化方式(编码方式 & 数据存储方式),如下图:
      数据类型 对应的编码方式

    从上表可以看出:

    1. 对于存储Varint编码数据,就不需要存储字节长度 Length,所以实际上Protocol Buffer的存储方式是 T - V
    2. Protocol Buffer采用其他编码方式(如LENGTH_DELIMITED)则采用T - L - V
    • 结论3:因为 Protocol Buffer对于数据字段值的 独特编码方式 & T - L - V数据存储方式,使得 Protocol Buffer序列化后数据量体积如此小

    下面,我将对不同的编码方式 & 数据存储方式进行逐一讲解。


    7.1 Wire Type = 0时的编码 & 数据存储方式

    Wire Type = 0时的编码 & 数据存储方式

    7.1.1 编码方式: Varint & Zigzag

    A. Varint编码方式介绍

    i. 简介

    • 定义:一种变长的编码方式
    • 原理:用字节 表示 数字:值越小的数字,使用越少的字节数表示
    • 作用:通过减少 表示数字 的字节数 从而进行数据压缩

    如:

    • 对于 int32 类型的数字,一般需要 4个字节 表示;
    1. 若采用 Varint编码,对于很小的 int32 类型 数字,则可以用 1个字节 来表示
    2. 虽然大的数字会需要 5 个 字节 来表示,但大多数情况下,消息都不会有很大的数字,所以采用 Varint方法总是可以用更少的字节数来表示数字

    ii. 原理介绍

    • 源码分析
    private void writeVarint32(int n) {                                                                                    
      int idx = 0;  
      while (true) {  
        if ((n & ~0x7F) == 0) {  
          i32buf[idx++] = (byte)n;  
          break;  
        } else {  
          i32buf[idx++] = (byte)((n & 0x7F) | 0x80);  
          // 步骤1:取出字节串末7位
          // 对于上述取出的7位:在最高位添加1构成一个字节
          // 如果是最后一次取出,则在最高位添加0构成1个字节
    
          n >>>= 7;  
          // 步骤2:通过将字节串整体往右移7位,继续从字节串的末尾选取7位,直到取完为止。
        }  
      }  
      trans_.write(i32buf, 0, idx); 
          // 步骤3: 将上述形成的每个字节 按序拼接 成一个字节串
          // 即该字节串就是经过Varint编码后的字节
    }   
    
    

    从上面可看出:Varint 中每个 字节 的最高位 都有特殊含义:

    • 如果是 1,表示后续的 字节 也是该数字的一部分
    • 如果是 0,表示这是最后一个字节,且剩余 7位 都用来表示数字

    所以,当使用Varint解码时时,只要读取到最高位为0的字节时,就表示已经是Varint的最后一个字节

    因此:

    • 小于 128 的数字 都可以用 1个字节 表示;
    • 大于 128 的数字,比如 300,会用两个字节来表示:10101100 00000010

    下面,我将用两个个例子来说明Varint编码方式的使用

    • 目的:对 数据类型为Int32 的 字段值为296 和字段值为104 进行Varint编码
    • 以下是编码过程

    Varint编码过程

    从上面可以看出:

    • 对于 int32 类型的数字,一般需要 4 个字节 来表示;
    • 但采用 Varint 方法,对于很小的 Int32 类型 数字(小于256),则可以用 1个字节 来表示;

    以此类推,比如300也只需要2个字节

    • 虽然大的数字会需要 5 个字节 来表示,但大多数情况下,消息都不会有很大的数字
    • 所以采用 Varint 方法总是可以用更少的字节数来表示数字,从而更好地实现数据压缩

    下面继续看如何解析经过Varint 编码的字节

    Varint 编码方式的不足

    • 背景:在计算机内,负数一般会被表示为很大的整数

    因为计算机定义负数的符号位为数字的最高位

    • 问题:如果采用 Varint编码方式 表示一个负数,那么一定需要 5 个 byte(因为负数的最高位是1,会被当做很大的整数去处理)
    • 解决方案: Protocol Buffer 定义了 sint32 / sint64 类型表示负数,通过先采用 Zigzag 编码(将 有符号数 转换成 无符号数),再采用 Varint编码,从而用于减少编码后的字节数
      表示负数时采用Zigzag编码
    1. 对于int32 / int64 类型的字段值(正数),Protocol Buffer直接采用 Varint编码
    2. 对于sint32 / sint64 类型的字段值(负数),Protocol Buffer会先采用 Zigzag 编码,再采用 Varint编码
    • 总结:为了更好地减少 表示负数时 的字节数,Protocol BufferVarint编码上又增加了Zigzag 编码方式进行编码
    • 下面将详细介绍 Zigzag编码方式

    B. Zigzag编码方式详解

    i. 简介

    • 定义:一种变长的编码方式
    • 原理:使用 无符号数 来表示 有符号数字;
    • 作用:使得绝对值小的数字都可以采用较少 字节 来表示;

    特别是对 表示负数的数据 能更好地进行数据压缩

    b. 原理

    • 源码分析
    
    public int int_to_zigzag(int n)
    // 传入的参数n = 传入字段值的二进制表示(此处以负数为例)
    // 负数的二进制 = 符号位为1,剩余的位数为 该数绝对值的原码按位取反;然后整个二进制数+1
    {
            return (n <<1) ^ (n >>31);   
            // 对于sint 32 数据类型,使用Zigzag编码过程如下:
            // 1. 将二进制表示数 左移1位(左移 = 整个二进制左移,低位补0)
            // 2. 将二进制表示数 右移31位 
                  // 对于右移:
                  // 首位是1的二进制(有符号数),是算数右移,即右移后左边补1
                  // 首位是0的二进制(无符号数),是逻辑左移,即右移后左边补0
            // 3. 将上述二者进行异或
    
            // 对于sint 64 数据类型 则为: return  (n << 1> ^ (n >> 63) ;
    }
    
    
    // 附:将Zigzag值解码为整型值
    public int zigzag_to_int(int n) 
    {
            return(n >>> 1) ^ -(n & 1);
    // 右移时,需要用不带符号的移动,否则如果第一位数据位是1的话,就会补1
    }
     
    
    
    • 实例说明:将 -2进行 Zigzag编码:

    Zigzag编码

    • Zigzag 编码 是补充 Varint编码在 表示负数 的不足,从而更好的帮助 Protocol Buffer进行数据的压缩
    • 所以,如果提前预知字段值是可能取负数的时候,记得采用sint32 / sint64 数据类型

    总结

    Protocol Buffer 通过VarintZigzag编码后大大减少了字段值占用字节数。

    7.1.2 存储方式:T - V

    • 消息字段的标识号、数据类型 & 字段值经过 Protocol Buffer采用 Varint & Zigzag 编码后,以 T - V 方式进行数据存储

    对于 Varint & Zigzag 编码,省略了T - L - V中的字节长度Length

    Varint & Zigzag数据存储方式

    下面将详细介绍T - V 存储方式中的存储细节:Tag & Value

    1. Tag

    • 定义:经过 Protocol Buffer采用Varint & Zigzag编码后 的消息字段 标识号 & 数据类型 的值
    • 作用:标识 字段
    1. 存储了字段的标识号(field_number)和 数据类型(wire_type),即Tag = 字段数据类型(wire_type) + 标识号(field_number
    2. 占用 一个字节 的长度(如果标识号超过了16,则占用多一个字节的位置)
    3. 解包时,Protocol Buffer根据 TagValue 对应于消息中的 字段
    • 具体使用
    // Tag 的具体表达式如下
     Tag  = (field_number << 3) | wire_type
    // 参数说明:
    // field_number:对应于 .proto文件中消息字段的标识号,表示这是消息里的第几个字段
    // field_number << 3:表示 field_number = 将 Tag的二进制表示 右移三位 后的值 
    // field_num左移3位不会导致数据丢失,因为表示范围还是足够大地去表示消息里的字段数目
    
    //  wire_type:表示 字段 的数据类型
    //  wire_type = Tag的二进制表示 的最低三位值
    //   wire_type的取值
     enum WireType { 
          WIRETYPE_VARINT = 0, 
          WIRETYPE_FIXED64 = 1, 
          WIRETYPE_LENGTH_DELIMITED = 2, 
          WIRETYPE_START_GROUP = 3, 
          WIRETYPE_END_GROUP = 4, 
          WIRETYPE_FIXED32 = 5
       };
    
    // 从上面可以看出,`wire_type`最多占用 3位 的内存空间(因为 3位 足以表示 0-5 的二进制)
    
    //  以下是 wire_type 对应的 数据类型 表
    

    wire_type对应数据类型

    • 实例说明
    // 消息对象
     message person
     { 
        required int32     id = 1;  
        // wire type = 0,field_number =1 
        required string    name = 2;  
        // wire type = 2,field_number =2 
      }
    
    //  如果一个Tag的二进制 = 0001 0010
    标识号 = field_number = field_number  << 3 =右移3位 =  0000 0010 = 2
    数据类型 = wire_type = 最低三位表示 = 010 = 2
    

    2. Value

    经过 Protocol Buffer采用Varint & Zigzag编码后 的消息字段的值

    7.1.3 实例说明

    下面通过一个实例进行整个编码过程的说明:

    • 消息说明
    message Test
    {
    
    required int32 id1 = 1;
    
    required int32 id2 = 2;
    }
    
    // 在代码中给id1 附上1个字段值:296
    // 在代码中给id2 附上1个字段值:296
    Test.setId1(300);
    Test.setId2(296);
    
    // 编码结果为:二进制字节流 = [8,-84,2,16, -88, 2]
    
    • 整个编码过程如下

    编码过程


    7.2 Wire Type = 1& 5时的编码&数据存储方式

    Wire Type = 1& 5时的编码&数据存储方式

    • 64(32)-bit编码方式较简单:编码后的数据具备固定大小 = 64位(8字节) / 32位(4字节)

    两种情况下,都是高位在后,低位在前

    • 采用T - V方式进行数据存储,同上。

    7.3 Wire Type = 2时的 编码 & 数据存储方式

    Wire Type = 2时的编码&数据存储方式

    • 对于编码方式:

    编码方式

    • 数据存储方式: T - L - V

    数据存储示意图

    此处主要讲解三种数据类型:

    • String类型
    • 嵌套消息类型(Message
    • 通过packed修饰的 repeat 字段(即packed repeated fields

    1. String类型

    字段值(即V) 采用UTF-8编码

    编码 & 存储方式

    • 例子:
    message Test2
    {
        required string str = 2;
    }
    
    // 将str设置为:testing
    Test2.setStr(“testing”)
    
    // 经过protobuf编码序列化后的数据以二进制的方式输出
    // 输出为:18, 7, 116, 101, 115, 116, 105, 110, 103
    
    

    实例

    2. 嵌套消息类型(Message)

    • 存储方式:T - L - V
    1. 外部消息的 V即为 嵌套消息的字段
    2. T - L -V 里嵌套了一系列的 T - L -V
    • 编码方式:字段值(即V) 根据字段的数据类型采用不同编码方式

    编码 & 存储方式

    • 实例
      定义如下嵌套消息:
    message Test2
    {
        required string str = 1;
        required int32 id1 = 2;
    
        
    }
    
    message Test3 {
      required Test2 c = 1;
    }
    
    // 将Test2中的字段str设置为:testing
    // 将Test2中的字段id1设置为:296
    // 编码后的字节为:10 ,12 ,18,7,116, 101, 115, 116, 105, 110, 103,16,-88,2
    

    编码 & 存储方式如下

    编码 & 存储方式

    3. 通过packed修饰的 repeat 字段

    repeated 修饰的字段有两种表达方式:

    message Test
    {
        repeated int32 Car = 4 ;
        // 表达方式1:不带packed=true
    
        repeated int32 Car = 4 [packed=true];
        // 表达方式2:带packed=true
        // proto 2.1 开始可使用
    
    // 区别在于:是否连续存储repeated类型数据
    }
    
    
    // 在代码中给`repeated int32 Car`附上3个字段值:3、270、86942
    
    Test.setCar(3);
    Test.setCar(270);
    Test.setCar(86942);
    
    • 背景:对于同一个 repeated字段、多个字段值来说,他们的Tag都是相同的,即数据类型 & 标识号都相同

    repeated类型可以看成是数组

    • 问题:若以传统的多个 T - V对存储(不带packed=true),则会导致Tag的冗余,即相同的Tag存储多次;

    不带pack的存储方式

    • 解决方案:采用带packed=truerepeated 字段存储方式,即将相同的 Tag 只存储一次、添加 repeated 字段下所有字段值的长度Length、连续存储 repeated 字段值,组成一个大的Tag - Length - Value -Value -Value对,即T - L - V - V - V对。

    带pack的存储方式

    通过采用带packed=truerepeated 字段存储方式,从而更好地压缩序列化后的数据长度。

    特别注意

    • Protocol Bufferpacked修饰只用于repeated字段 或 基本类型的repeated字段
    • 用在其他字段,编译 .proto 文件时会报错

    8. 特别注意

    • 注意1:若 required字段没有被设置字段值,那么在IsInitialized()进行初始化检查会报错并提示失败

    所以 required字段必须要被设置字段值

    • 注意2:序列化顺序 是根据 Tag标识号 从小到大 进行编码

    .proto文件内 字段定义的数据无关

    • 注意3:T - V的数据存储方式保证了Protobuf的版本兼容:高<->低 或 低<->高都可以适配

    若新版本 增加了 required 字段, 旧版本 在数据解码时会认为IsInitialized() 失败,所以慎用 required字段


    9. 使用建议

    根据上面的序列化原理分析,我总结出以下Protocol Buffer的使用建议

    通过下面建议能有效降低序列化后数据量的大小

    • 建议1:多用 optionalrepeated修饰符
      因为若optionalrepeated 字段没有被设置字段值,那么该字段在序列化时的数据中是完全不存在的,即不需要进行编码

    相应的字段在解码时才会被设置为默认值

    • 建议2:字段标识号(Field_Number)尽量只使用 1-15,且不要跳动使用
      因为Tag里的Field_Number是需要占字节空间的。如果Field_Number>16时,Field_Number的编码就会占用2个字节,那么Tag在编码时也就会占用更多的字节;如果将字段标识号定义为连续递增的数值,将获得更好的编码和解码性能

    • 建议3:若需要使用的字段值出现负数,请使用 sint32 / sint64,不要使用int32 / int64
      因为采用sint32 / sint64数据类型表示负数时,会先采用Zigzag编码再采用Varint编码,从而更加有效压缩数据

    • 建议4:对于repeated字段,尽量增加packed=true修饰
      因为加了packed=true修饰repeated字段采用连续数据存储方式,即T - L - V - V -V方式


    10. 序列化 & 反序列化过程

    • Protocol Buffer除了序列化 & 反序列化后的数据体积小,序列化 & 反序列化的速度也非常快
    • 下面我将讲解序列化 & 反序列化的序列化过程

    10.1 Protocol Buffer的序列化 & 反序列化过程

    序列化过程如下:

    1. 判断每个字段是否有设置值,有值才进行编码
    2. 根据 字段标识号&数据类型 将 字段值 通过不同的编码方式进行编码

    由于:
    a. 编码方式简单(只需要简单的数学运算 = 位移等等)
    b. 采用 Protocol Buffer 自身的框架代码 和 编译器 共同完成

    所以Protocol Buffer的序列化速度非常快。

    反序列化过程如下:

    1. 调用 消息类的 parseFrom(input) 解析从输入流读入的二进制字节数据流

    从上面可知,Protocol Buffer解析过程只需要通过简单的解码方式即可完成,无需复杂的词法语法分析,因此 解析速度非常快。

    1. 将解析出来的数据 按照指定的格式读取到 JavaC++Phyton 对应的结构类型中

    由于:
    a. 解码方式简单(只需要简单的数学运算 = 位移等等)
    b. 采用 Protocol Buffer 自身的框架代码 和 编译器 共同完成

    所以Protocol Buffer的反序列化速度非常快。

    10.2 对比于XML 的序列化 & 反序列化过程

    XML的反序列化过程如下:

    1. 从文件中读取出字符串
    2. 将字符串转换为 XML 文档对象结构模型
    3. XML 文档对象结构模型中读取指定节点的字符串
    4. 将该字符串转换成指定类型的变量

    上述过程非常复杂,其中,将 XML 文件转换为文档对象结构模型的过程通常需要完成词法文法分析等大量消耗 CPU 的复杂计算。

    因为序列化 & 反序列化过程简单,所以序列化 & 反序列化过程速度非常快,这也是 Protocol Buffer效率高的原因


    11.总结

    • Protocol Buffer的序列化 & 反序列化简单 & 速度快的原因是:
      a. 编码 / 解码 方式简单(只需要简单的数学运算 = 位移等等)
      b. 采用 Protocol Buffer 自身的框架代码 和 编译器 共同完成

    • Protocol Buffer的数据压缩效果好(即序列化后的数据量体积小)的原因是:
      a. 采用了独特的编码方式,如VarintZigzag编码方式等等
      b. 采用T - L - V 的数据存储方式:减少了分隔符的使用 & 数据存储得紧凑


    接下来我会讲解Protocol Buffer的源码分析,感兴趣的同学可以继续关注carson_ho的微信公众号
    示意图
    示意图


    请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

    展开全文
  • 关于PLSQL连接远程库时报错:ORA-28040:No matching authentication protocol 解决方案 问题:ORA-28040: No matching authentication protocol 说明:在配置远程连接数据库时出现ORA-28040: No matching ...

    关于PLSQL连接远程库时报错:ORA-28040:No matching authentication protocol 解决方案

    问题:ORA-28040: No matching authentication protocol

    说明:在配置远程连接数据库时出现ORA-28040: No matching authentication protocol  错误;

    此错误表示客户端连接错误,

     

    原因分析:

    网上查了主要是说我电脑上orcale的客户端版本是11G的,而远程的是12C的,对应的版本不一致,所以会导致出现连接时报ORA-28040的没有匹配的认证协议错误,对此找了网上很多方法,都没用,最后在同事的帮助下完成连接,具体如下:

     

    此方案只对以下配置有用(其他环境下没有测试)说明:

    Windows7 64的系统,

    Oracle 11G 64的客户端,

    PLSQL Developer 12  64的管理工具

    解决方案:

    第一步:将instantclient_12_2 文件夹中拷贝到电脑上,记住存放的位置,然后在文件中找到tnsnames.ora  文件,用记事本打开,例如我的是在(D:\ instantclient_12_2\tnsnames.ora)

    在最后文件的最后面加上下面一段代码:

     

    数据库连接名=

     (DESCRIPTION =

       (ADDRESS = (PROTOCOL = TCP)(HOST = ip地址就是要连接数据库的地址)(PORT =端口号))

       (CONNECT_DATA =

         (SERVER = DEDICATED)

         (SERVICE_NAME = 数据库名)

        )

      )

    例如我的是:

    nontax =

     (DESCRIPTION =

       (ADDRESS = (PROTOCOL = TCP)(HOST = 47.**.**.94)(PORT = 1521))

       (CONNECT_DATA =

         (SERVER = DEDICATED)

         (SERVICE_NAME = orcl)

        )

      )

    第二步:打开PLSQL管理工具,此时应该是连接不上的直接跳过登陆,打开主面板,按下图代开首选项,在首选项面板上填写instantclient_12_2 文件存放的路劲,在下一栏目上填写instantclient_12_2 文件中的oci.dll文件路径,点击OK保存即可,重启PLSQL管理工具,就可以连接了。

     

    第三步:如果上述方式没有效果,则表示需要将instantclient_12_2 文件的路径配置到环境变量中,保存后重启PLSQL即可,方法如下:

    选择我的电脑,右键属性,高级系统设置,环境变量,在系统变量中新建一个,

    变量名:TNS_ADMIN

    值:instantclient_12_2 文件的路径

    列入:

    变量名:TNS_ADMIN

    值:E:\instantclient_12_2

     

     

    如果你是用的PLSQL的管理工具是32的就回报错:如下:

     

    展开全文
  • CAS protocol

    2018-06-17 00:32:43
    翻译自:CAS 官网CAS protocolThe CAS protocol is a simple and powerful ticket-based protocol developed exclusively for CAS. A complete protocol specification may be found here.It involves one or many ...

    翻译自:CAS 官网

    CAS protocol

    The CAS protocol is a simple and powerful ticket-based protocol developed exclusively for CAS. A complete protocol specification may be found here.

    It involves one or many clients and one server. Clients are embedded in CASified applications (called “CAS services”) whereas the CAS server is a standalone component:

    • The CAS server is responsible for authenticating users and granting accesses to applications
    • The CAS clients protect the CAS applications and retrieve the identity of the granted users from the CAS server.

    The key concepts are:

    • The TGT (Ticket Granting Ticket), stored in the CASTGC cookie, represents a SSO session for a user
    • The ST (Service Ticket), transmitted as a GET parameter in urls, stands for the access granted by the CAS server to the CASified application for a specific user.

    Specification versions

    The current CAS protocol specification is 3.x. The actual protocol specification is available at CAS-Protocol-Specification, which is hereby implemented by the Apereo CAS Server as the official reference implementation. It’s mainly a capture of the most common enhancements built on top of the CAS protocol revision 2.0. Among all features, the most noticeable update between versions 2.0 and 3.0 is the ability to return the authentication/user attributes through the new /p3/serviceValidate response (in addition to the /serviceValidate endpoint, already existing for CAS 2.0 protocol).

    Web flow diagram


    Proxy web flow diagram

    One of the most powerful feature of the CAS protocol is the ability for a CAS service to act as a proxy for another CAS service, transmitting the user identity.


    Other protocols

    Even if the primary goal of the CAS server is to implement the CAS protocol, other protocols are also supported as extensions:


    Delegated Authentication

    Using the CAS protocol, the CAS server can also be configured to delegate the authentication to another CAS server.


    展开全文
  • Protocol Buffers

    千次阅读 2016-06-05 22:27:04
    What are protocol buffers?Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your d

    What are protocol buffers?

    Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages. You can even update your data structure without breaking deployed programs that are compiled against the "old" format.

    How do they work?

    You specify how you want the information you're serializing to be structured by defining protocol buffer message types in .proto files. Each protocol buffer message is a small logical record of information, containing a series of name-value pairs. Here's a very basic example of a .proto file that defines a message containing information about a person:

    message Person {
      required string name = 1;
      required int32 id = 2;
      optional string email = 3;
    
      enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
      }
    
      message PhoneNumber {
        required string number = 1;
        optional PhoneType type = 2 [default = HOME];
      }
    
      repeated PhoneNumber phone = 4;
    }
    

    As you can see, the message format is simple – each message type has one or more uniquely numbered fields, and each field has a name and a value type, where value types can be numbers (integer or floating-point), booleans, strings, raw bytes, or even (as in the example above) other protocol buffer message types, allowing you to structure your data hierarchically. You can specify optional fields, required fields, and repeated fields. You can find more information about writing .proto files in the Protocol Buffer Language Guide.

    Once you've defined your messages, you run the protocol buffer compiler for your application's language on your .proto file to generate data access classes. These provide simple accessors for each field (like name() and set_name()) as well as methods to serialize/parse the whole structure to/from raw bytes – so, for instance, if your chosen language is C++, running the compiler on the above example will generate a class called Person. You can then use this class in your application to populate, serialize, and retrieve Person protocol buffer messages. You might then write some code like this:

    Person person;
    person.set_name("John Doe");
    person.set_id(1234);
    person.set_email("jdoe@example.com");
    fstream output("myfile", ios::out | ios::binary);
    person.SerializeToOstream(&output);

    Then, later on, you could read your message back in:

    fstream input("myfile", ios::in | ios::binary);
    Person person;
    person.ParseFromIstream(&input);
    cout << "Name: " << person.name() << endl;
    cout << "E-mail: " << person.email() << endl;

    You can add new fields to your message formats without breaking backwards-compatibility; old binaries simply ignore the new field when parsing. So if you have a communications protocol that uses protocol buffers as its data format, you can extend your protocol without having to worry about breaking existing code.

    You'll find a complete reference for using generated protocol buffer code in the API Reference section, and you can find out more about how protocol buffer messages are encoded in Protocol Buffer Encoding.

    Why not just use XML?

    Protocol buffers have many advantages over XML for serializing structured data. Protocol buffers:

    • are simpler
    • are 3 to 10 times smaller
    • are 20 to 100 times faster
    • are less ambiguous
    • generate data access classes that are easier to use programmatically

    For example, let's say you want to model a person with a name and an email. In XML, you need to do:

      <person>
        <name>John Doe</name>
        <email>jdoe@example.com</email>
      </person>

    while the corresponding protocol buffer message (in protocol buffer text format) is:

    # Textual representation of a protocol buffer.
    # This is *not* the binary format used on the wire.
    person {
      name: "John Doe"
      email: "jdoe@example.com"
    }
    

    When this message is encoded to the protocol buffer binary format (the text format above is just a convenient human-readable representation for debugging and editing), it would probably be 28 bytes long and take around 100-200 nanoseconds to parse. The XML version is at least 69 bytes if you remove whitespace, and would take around 5,000-10,000 nanoseconds to parse.

    Also, manipulating a protocol buffer is much easier:

      cout << "Name: " << person.name() << endl;
      cout << "E-mail: " << person.email() << endl;

    Whereas with XML you would have to do something like:

      cout << "Name: "
           << person.getElementsByTagName("name")->item(0)->innerText()
           << endl;
      cout << "E-mail: "
           << person.getElementsByTagName("email")->item(0)->innerText()
           << endl;

    However, protocol buffers are not always a better solution than XML – for instance, protocol buffers would not be a good way to model a text-based document with markup (e.g. HTML), since you cannot easily interleave structure with text. In addition, XML is human-readable and human-editable; protocol buffers, at least in their native format, are not. XML is also – to some extent – self-describing. A protocol buffer is only meaningful if you have the message definition (the .proto file).

    展开全文
  • 1.首先需要安装...报错,checkOut时提示No appropriate protocol 原因:如果连接地址是svn协议,则不会出现问题,我的连接地址是https://**** 由于是https协议,所以在配置中农应该勾选Enable interactive ..
  • Protocol Buffer 简介

    万次阅读 多人点赞 2018-06-27 11:08:44
    一、Protocol Buffer 与 XML、JSON 的区别 Protocol Buffer 和 XML、JSON一样都是结构数据序列化的工具,但它们的数据格式有比较大的区别: 首先,Protocol Buffer 序列化之后得到的数据不是可读的字符...
  • 一、问题产生 在centOS 通过docker pull mysql下载mysql镜像并成功启动mysql容器。...Client does not support authentication protocol requestedbyserver; consider upgrading MySQLclient ...
  • BOOT protocol

    2016-09-20 12:26:26
    Description Glossary RFCs Publications Obsolete RFCs Description: ...Protocol suite: ...Protocol type: ...Application layer configuration protocol. Related protocols: D
  • TWAMP protocol

    千次阅读 2018-11-23 11:10:44
    Tow-Way Active Measurement Pootocol (TWAMP) is an open protocol for measuring network performance between any tow devices in a network that supports the protocols in the TWAMP framew...
  • 今天安装了navicat 和 mysql,...Client does not support authentication protocol requested by server; consider upgrading MySQL client 网上找了如下方法: 其一: mysql&amp;gt; SET PASS...
  • Protocol Buffer简介02. Protocol Buffer优缺点03. Protocol Buffer安装04. Protocol Buffer测试05. 参考 01. Protocol Buffer简介 protobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,...
  • 使用的JDK版本是1.8,使用代码查看是支持tls1.2加密方式的,但是现在使用TLS_RSA_WITH_AES_256_CBC_SHA256就报No appropriate protocol而使用TLS_RSA_WITH_AES_256_CBC_SHA可以连接成功,想请教下大神问题出在哪里啊...
  • iOS Protocol 详解

    千次阅读 2018-08-10 14:52:31
    Protocol(协议)的声明看起来类似一个类的接口,不同的是Protocol没有父类也不能定义实例变量。Protocol是一种特殊的程序设计结构,用于声明专门被别的类实现的方法。因为OC是单继承的,由于不支持多继承,所以很多...
  • Protocol handler start failed

    千次阅读 2020-08-03 15:54:55
    Protocol handler start failed的问题解决
  • NEC Protocol

    千次阅读 2012-12-07 10:32:49
    To my knowledge the protocol I describe here was developed by NEC. I've seen very similar protocol descriptions on the internet, and there the protocol is called Japanese Format.  I do admit that I ...
  • No protocol specified

    千次阅读 2016-09-25 01:15:49
    protocol specified 这是因为Xserver默认情况下不允许别的用户的图形程序的图形显示在当前屏幕上. 如果需要别的用户的图形显示在当前屏幕上, 则应以当前登陆的用户, 也就是切换身份前的用户执行如下命令 ...
  • okHttp3 Protocol

    千次阅读 2018-10-18 23:15:13
    okHttp3 Protocol public enum Protocol { HTTP_1_0("http/1.0"), HTTP_1_1("http/1.1"), SPDY_3("spdy/3.1"), HTTP_2("h2"), H2_PRIOR_KNOWLEDGE("h2_...
  • MESI protocol

    千次阅读 2013-05-07 09:53:21
    http://en.wikipedia.org/wiki/MESI_protocol
  • Protocol Buffers C++ 入门教程

    万次阅读 多人点赞 2016-06-25 15:06:30
    1.protobuf简介protobuf(Protocol Buffers )是google的开源项目,官网见:click这里,源码见:github。更准确的官方描述是:protobuf是google的中立于语言,平台,可扩展的用于序列化结构化数据的解决方案。简单的...
  • Protocol Buffers下载地址

    千次阅读 2019-06-18 17:58:31
    Protocol Buffers地址: https://github.com/protocolbuffers/protobuf
  • unsupported pickle protocol

    千次阅读 2017-11-02 20:22:34
    我使用python3X很不习惯,于是换回到了python2.7,可是出现了unsupported pickle protocol问题。代码已经修改过。很是郁闷。于是上网查阅pickle protocol是什么协议。原来这是一种将数据转换成二进制流的文本协议。...
  • 将web项目部署为war包通过tomcat发布后,调用解析xml功能...unknown protocol: f Nested exception: unknown protocol: f   at org.dom4j.io.SAXReader.read(SAXReader.java:484)  at org.dom4j.io.SAXReader....
  • 今天在电脑上安装了Mysql 8.0.11,然后又屁颠屁颠地安装了Navicat for MySQL,打开Navicat准备链接数据库的时候出现了如下提示: 上网搜索解决方案,网上说出现这种情况的原因是:mysql8 之前的版本中加密规则是...
  • Protocol Buffer介绍

    千次阅读 2014-07-12 12:18:53
    Protocol Buffer是什么? Protocol Buffer为什么要用它? Protocol Buffer如何使用它?
  • protocol buffers简介

    千次阅读 2015-11-03 18:18:41
    protocol buffers 1.protocol buffers是什么? Protocol buffers是一个灵活、高效、可以序列化结构数据的自动化机制,这一点和XML很像,但是Protocol buffers体积更小,速度更快、使用更简单。一旦定义了你...
  • human36m protocol 说明

    2020-03-23 11:19:16
    human3.6m protocol 说明 不同论文中对于protocol的选取不一,具体情况在每个做human3.6m的论文中都会明确说明其使用的protocol的组成以及评测指标。不过大部分论文都会使用以下两种方式来解释protocol。 解释1 ...
  • 习惯用 Json、XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json、XML 真的强!太!多! 由于 Google出品,我相信...
  • protocol family unavailable

    千次阅读 2018-01-16 09:10:56
    周末两天没打开电脑,周一上班的时候打开电脑发现项目报错了,报的是protocol family unavailable,感觉莫名其妙,因为前两天还是好好的,一直也没什么错误了,于是就搜了一下这个报错内容,结果发现是防火墙没关闭...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 165,854
精华内容 66,341
热门标签
关键字:

protocol