当前位置: 首页 > 工具软件 > Diameter > 使用案例 >

Diameter数据类型

袁文景
2023-12-01

RFC3588_RFC2030(部分)

 

 loading...

support (百度翻译,有道翻译)

 

diameter 基本数据

OctetString   数据长度任意(0~)但是整个数据长度必须是4字节的整数倍,不够填充0.有Octet组成,其中octet
              八位字符串-一字节--C语言 char;eg.char c='1'  (ASCII   :49(十进制)   0x31(十六进制))   内存地址0x  00  对应存放 31
                                             char c=50   (ASCII   :50(十进制)   0x32(十六进制))   内存地址0x  00  对应存放 32
                                             char c=0x33 (ASCII   :51(十进制)   0x33(十六进制))   内存地址0x  00  对应存放 33

Integer32     四字节-C语言 int   存到发送的缓冲区buf中用大端模式(网络字节序) htonl();   eg.61712(十进制)     0xF110(十六进制)         内存地址0x  00  01  02   03  对应存放   00 00 F1  10

Integer64     八字节-C语言 long int 存到发送的缓冲区buf中用大端模式(网络字节序)

Unsigned32    四字节-C语言 unsigned int  存到发送的缓冲区buf中用大端模式(网络字节序)

Unsigned64    八字节-C语言 unsigned long int 存到发送的缓冲区buf中用大端模式(网络字节序)

Float32       四字节-C语言 float  存到发送的缓冲区buf中用大端模式(网络字节序)

Float64       八字节-C语言 double 存到发送的缓冲区buf中用大端模式(网络字节序)

Grouped       AVP组,文档中有定义以及样例,多样

派生类型

Address(ipv4 / ipv6 /...) 由OctetString(C语言 char)派生。但是整个数据长度必须是4字节的整数倍,不够填充0.
                          需要区分32/63位(4/8字节)地址;6字节/10字节
                          两字节:区分什么类型地址(使用IANAADFAM中的十进制值tag(C语言 char=0x0~0xFFFF) http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xhtml)
                          后面字节根据相应地址格式,其中ipv4占四字节,ipv6占八字节
                          eg.
                          ipv4: tag=1   address:128.0.0.1(点分十进制)   内存地址0x 00 01 02 03 04 05   对应存放 00 01 80 00 00 01
                          ipv6: tag=2   address:...                    内存地址0x 00 01 02 03 04 05   对应存放 00 02 ...
Time           四字节。由OctetString(C语言 char)派生。字节等于NTP的整数部分(相对秒钟RFC2030)
               必须支持SNTP。
               eg.
               0x80120420(十六进制)  第一个字节0x8=1000(二进制)   第0bit为1那么通过1900年1月0时整进行估算
               0x42004484(十六进制)  第一个字节0x4=0100(二进制)   第0bit为0那么SNTP通过UTC时间2036年2月7号6时28分16秒整估算
 
UTF8String     由OctetString(C语言 char)派生。整个数据长度必须是4字节的整数倍,不够填充0.
               传递的是UTF-8 octet sequence。根据 
               Note that the AVP Length field of an UTF8String is measured in octets, not characters. 
               需注意的是一个UTF8String的AVP长度用字节衡量而不是编了几个字码
               UCS-4 range (hex.)           UTF-8 octet sequence (binary)
               0000 0000-0000 007F   0xxxxxxx
               0000 0080-0000 07FF   110xxxxx 10xxxxxx
               0000 0800-0000 FFFF   1110xxxx 10xxxxxx 10xxxxxx
               0001 0000-001F FFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
               0020 0000-03FF FFFF   111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
               0400 0000-7FFF FFFF   1111110x 10xxxxxx ... 10xxxxxx
               RFC2279英文版https://tools.ietf.org/html/rfc2279
               RFC2279中文版http://www.chinaitlab.com/linux/manual/develop/rfc/RFC2279.txt
               由于标准10646不断在更新版本中增加附加编码点,实施必须能够处理0x00000001到0x7fffffff之间的任何编码点。
               字节顺序不符合UTF-8字符集中编码点的有效编码、或者超出该范围都是被禁止的。
               避免使用控制字符(ascii码=控制字符+打印字符)。
               但当需要另起一个新行时,可以使用控制字符CR LF。
               (CR的ascii码13(十进制)=0x0D(十六进制)、LF的ascii码10(十进制)=0x0A(十六进制))
               应避免使用前导或尾随空格字符--就是除数据内容外没有多余空格
               (“前导空格”指的就是变量或者常量值的有效内容前面的空格。“尾随空格”,指的就是变量或者常量值的有效内容后面的空格)

DiameterIdentity 由OctetString(C语言 char)派生。但是整个数据必须是4字节的整数倍,不够填充0.
                 DiameterIdentity  = FQDN 
                 --FQDN 正式域名Fully Qualified Host Name
                 --DiameterIdentity值唯一标识一个Diameter节点,用于重复连接和路由环路检测 
                 --若一个Diameter节点可以有多个FQDN标识,应在启动时挑选其中一个FQDN,作为该节点唯一DiameterIdentity
                 --若多个Diameter节点在同一台主机上运行,每个Diameter节点必须分配一个唯一的DiameterIdentity

DiameterURI     "aaa://" FQDN [ port ] [ transport ] [ protocol ]  //没有传输安全 
                "aaas://" FQDN [ port ] [ transport ] [ protocol ] //有传输安全 
                FQDN              = Fully Qualified Host Name 
                port              = ":" 1*DIGIT    //一个端口用来监听进来的连接。默认Diameter端口(3868)
                transport         = ";transport=" transport-protocol 
                                  // 传输层协议中用来监听外来的连接请求。默认为SCTP协议。如果aaa-protocol字段设置为Diameter,则不能使用UDP。
                transport-protocol = ( "tcp" / "sctp" / "udp" )
                protocol           = ";protocol=" aaa-protocol  //默认AAA协议是Diameter
                aaa-protocol       = ( "diameter" / "radius" / "tacacs+" )
            eg.
            aaa://host.example.com;transport=tcp
            aaa://host.example.com:6666;transport=tcp
            aaa://host.example.com;protocol=diameter
            aaa://host.example.com:6666;protocol=diameter
            aaa://host.example.com:6666;transport=tcp;protocol=diameter
            aaa://host.example.com:1813;transport=udp;protocol=radius

Enumerated     由Integer32(C语言 int)派生。类似C语言的int值+使用宏定义,int大端模式(网络字节序)
               对应的diameter应用会有相应的数值解释

IPFilterRule   由OctetString(C语言 char)派生。但是整个数据必须是4字节的整数倍,不够填充0.
               IP过滤规则,IPFW(8) -- IP防火墙和流量整形的控制程序 
               可能涉及到的过滤信息
               Direction
               Source and destination IP address
               Protocol
               Source and destination port
               TCP flags
               IP fragment flag
               IP options
               ICMP types
               用ascii码存放的格式:
                action  dir  proto from src to dst  [options]
               该字段(IPFilterRule)根据IP过滤器实现操作而构成传送的数据
               以RFC为主,部分内容涉及链接,有个别不同,有指出
               英文:https://www.freebsd.org/cgi/man.cgi?query=ipfw
               中文:http://blog.csdn.net/liuyu60305002/article/details/7675623
               action ="permit"|"deny"//permit – 允许匹配该规则的分组通过。 deny - 丢弃匹配该规则的分组。
               dir= "in"|"out" //"in"是来自终端的, "out"是到终端的。
               proto=通过数字定义的IP协议。关键字"ip"表示任何协议都可匹配
               src=<address/mask>[ports]
               dst=<address/mask>[ports]
               address/mask=(ipno)|(ipno/bits)
               option=[frag]//如果与tcpflags 或TCP/UDP 端口规范冲突,Frag可不使用(与ipfw不同点)
                      [ipoptins-spec] [tcpoptions-spec][established]
                      [setup][tcpflags-spec]
                      [icmptypes-types]//option:RFC3588支持范围(与ipfw不同点),多数据逗号隔开
               eg.
               IPFilterRule过滤器实现操作:所有其他地址匹配
               TPFilterRule传的"deny in ip! assigned"  (用的ascii码)
                 
         
QoSFilterRule  由OctetString(C语言 char)派生。但是整个数据必须是4字节的整数倍,不够填充0.
             服务质量过滤规则。
               action dir proto from src to dst [options]
            action ="permit"|"deny"//permit – 允许匹配该规则的分组通过。 deny - 丢弃匹配该规则的分组。
            dir= "in"|"out" //"in"是来自终端的, "out"是到终端的。
            proto=通过数字定义的IP协议。关键字"ip"表示任何协议都可匹配
            src=<address/mask>[ports]
            dst=<address/mask>[ports]
            address/mask=(ipno)|(ipno/bits)
            option=
                tag    - Mark packet with a specific DSCP
                         [DIFFSERV].  The DSCP option MUST be
                         included.使用一个特定的DSCP[RFC2474]标记分组。必须包括DSCP选项
                meter  - Meter traffic.  The metering options
                         MUST be included.Meter流量。必须包括metering选项

 

 

 

 

 

RFC2030
3. NTP Timestamp Format--NTP时间戳格式

   SNTP uses the standard NTP timestamp format described in RFC-1305 and
   SNTP使用在RFC1305或更早的文档版本中被描述的标准NTP时间戳
   previous versions of that document. In conformance with standard
                                       根据标准通信网络惯例,
   Internet practice, NTP data are specified as integer or fixed-point
                      NTP数据指定用指定的整型或固定小数点的数据,
   quantities, with bits numbered in big-endian fashion from 0 starting
               采用大端模式
   at the left, or high-order, position. Unless specified otherwise, all
                                         除非特别说明,       
   quantities are unsigned and may occupy the full field width with an
   否则所有的数据都采用无符号并且会用0填充
   implied 0 preceding bit 0.
   (比如528(十进制)=0x210(十六进制),那么(假设指定长度4字节)内存地址0x 00 01 02 03  对应存放 00 00 02 10)

   Since NTP timestamps are cherished data and, in fact, represent the
   虽然时间戳用来存数据,                          事实上,代表协议的主要辅助
   main product of the protocol, a special timestamp format has been
                                 指定的时间戳格式已经制定好了。
   established. NTP timestamps are represented as a 64-bit unsigned
                时间戳有64bit(指定8字节长度的无符号数且固定小数点的数值)
   fixed-point number, in seconds relative to 0h on 1 January 1900. The
                       时间是相对于1900 已阅0时0分0秒整的
   integer part is in the first 32 bits and the fraction part in the
   前4字节是整数部分(C语言int,需转大端模式htonl()),而小数部分是后面的4字节。
   last 32 bits. In the fraction part, the non-significant low order can
                 小数部分如果不重要可以置0。
   be set to 0.

      It is advisable to fill the non-significant low order bits of the
      恰当的随意填充不重要的低阶位
      timestamp with a random, unbiased bitstring, both to avoid
      systematic roundoff errors and as a means of loop detection and
      既可以避免系统舍入错误也可以作为循环和延迟的检测手段
      replay detection (see below). One way of doing this is to generate
                                    这样做能使8字节产生随机位串,
      a random bitstring in a 64-bit word, then perform an arithmetic
                                            通过算数右移(C语言操作符">>")
      right shift a number of bits equal to the number of significant
                  一定数量的位而获得所需要的时间戳
      bits of the timestamp, then add the result to the original
      timestamp.             在把这个结果假如原时间戳中



   This format allows convenient multiple-precision arithmetic and
   这个算法方便了高精度算法和转换到UDP/TIME
   conversion to UDP/TIME representation (seconds), but does complicate
   the conversion to ICMP Timestamp message representation, which is in
   但是也恶化了从毫秒转换到ICMP实践戳消息的表示。
   milliseconds. The maximum number that can be represented is
                 有代表性的最大的数值0xFFFFFFFF(十六进制)精度到200微微秒
   4,294,967,295 seconds with a precision of about 200 picoseconds,
   which should be adequate for even the most exotic requirements.
   对于更精密的需求将会被屏蔽掉

                        1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1/十进制
   |<-----0------->|<-----1------->|<-----2------->|<-----3------->|第/字节
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           Seconds(秒钟的整数部分)              |--4字节
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                  Seconds Fraction (0-padded)  (秒钟的小数 部分)|--4字节
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Note that, since some time in 1968 (second 2,147,483,648) the most
   注释:一些时间溢出,
   significant bit (bit 0 of the integer part) has been set and that the
   64-bit field will overflow some time in 2036 (second 4,294,967,296).
   Should NTP or SNTP be in use in 2036, some external means will be
   Should NTP 或者SNTP将会在2036年以后使用,一些其他衡量相对于1900年整或者2036
   necessary to qualify time relative to 1900 and time relative to 2036
   年整的方法是必须的,                            
   (and other multiples of 136 years). There will exist a 200-picosecond
   (甚至更多的其他136年)。             一些200微微秒的间隔将被忽略
   interval, henceforth ignored, every 136 years when the 64-bit field
                                 每136年的无效或无法读取的8字节段将被置为0。
   will be 0, which by convention is interpreted as an invalid or
   unavailable timestamp.

      As the NTP timestamp format has been in use for the last 17 years,
      这个时间戳格式已经用了17年
      it remains a possibility that it will be in use 40 years from now
      还能够继续使用40年才会发生数据溢出
      when the seconds field overflows. As it is probably inappropriate
                                        在1968年之前被设置为0的可能和存档的时间戳
      to archive NTP timestamps before bit 0 was set in 1968, a
      有偏差,
      convenient way to extend the useful life of NTP timestamps is the
      一个适当的方法去扩展有用的时间戳的生命期是:
      following convention: If bit 0 is set, the UTC time is in the
                            如果第0bit置1,那么UTC时间在1968到2036范围内,
      range 1968-2036 and UTC time is reckoned from 0h 0m 0s UTC on 1
                      并且时间可以通过1900年1月0时整进行估算。
      January 1900. If bit 0 is not set, the time is in the range 2036-
                    如果第0bit置0,时间范围为2036-2104,
      2104 and UTC time is reckoned from 6h 28m 16s UTC on 7 February
            并且时间可以通过UTC时间2036年2月7号6时28分16秒整估算。
      2036. Note that when calculating the correspondence, 2000 is not a
              请注意,在计算对应关系时,2000年不是一个闰年。
      leap year. Note also that leap seconds are not counted in the
                 请注意,闰秒不计算在估算里面。
      reckoning.

 

 

 

 

 

 

 

 类似资料: