锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / wireshark相关PPP认证协议
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品开源心得,转载请注明出处:锐英源,www.wisestudy.cn,孙老师作品,联系电话13803810136。


RFC1334——PPP Authentication Protocols中文版


组织:中国互动出版网(http://www.china-pub.com/
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm
E-mail:ouyang@china-pub.com
译者:王奎(pywang  wangtianzhi@263.net)
译文发布时间:2001-12-28
版权:本翻译文档可以用于非商业用途自由转载,但必须保留本文档的翻译及组织信息。

 

Network Working Group                                           B. Lloyd
Request for Comments: 1334                                          L&A
                                                                  W. Simpson
                                                                 Daydreamer
                                                               October 1992

PPP 身份验证协议
(RFC1334——PPP Authentication Protocols )

备忘录状态
   此RFC 为internet community详细说明了 IAB 标准跟踪协议,并且请求讨论和建议以便改进。请参考IAB Official Protocol Standards 的当前版本,确保这个协议陈述和状态的标准化。此备忘录的分发不受限制。

摘要
点到点协议(the Point-to-Point Protocol)提供了一种在点到点链路上封装网络层协议信息的标准方法。PPP 也定义了可扩展的链路控制协议(Link Control Protocol),它(Link Control Protocol)使用验证协议磋商在链路上传输网络层协议前验证链路的对端。
这个文档定义了两种验证协议:密码验证协议(the Password Authentication Protocol)和挑战-握手验证协议(the Challenge-Handshake Authentication Protocol)。此RFC是IETF(the Internet Engineering Task Force)的PPP协议工作组的成果。关于这个备忘录的建议请提交给:ietf-ppp@ucdavis.edu邮件列表。

目录
1. 介绍
1.1要求说明书
1.2术语
2. 密码验证协议
2.1 配置选项格式
2.2 包格式
3.1配置选项格式
3.2包格式
安全考虑
参考文献
致谢
主席地址
作者地址
完整版权说明
致谢


1. 介绍

       PPP 有三个主要的组成部分:
1.在串行链路上封装数据报(datagrams)的方法。
2.建立,配置和测试数据链路链接(the data-link connection)的LCP协议(Link Control Protocol)。
3.建立和配置不同网络层协议的一组NCP协议(Network Control Protocol)。
为了在点到点链路(point-to-point link)上建立通信,PPP链路的一端必须在建立阶段(Establishment phase)首先发送LCP包(packets)配置数据链路。在链路建立后,在进入到网络层协议阶段前,PPP提供一个可选择的验证阶段。
默认的,身份验证不是强制的。如果希望进行链路的身份验证,则实现者必须在建立阶段指明身份验证-协议配置选项。
这些协议主要是为通过交换网(switched circuits)或者拨号线(dial-up lines)连接到PPP网络服务器的主机和路由器服务的,但是也可以被用到专用链路(dedicated links)中。服务器在为网络层磋商选择选项时可以对连接的主机或路由器进行身份验证。
此文档定义了PPP身份验证协议。链路建立和验证阶段,和验证协议配置选项定义在PPP协议中[1]。

1.1要求说明书


在本文档中,用以下几个词来表示说明书的要求,这些词一般以大写字体书写。
MUST
这个词表示在此说明书中是绝对要求的。
MUST NOT
这个词组表示在此说明书中是绝对禁止的。
SHOULD
此词表示在此说明书中是推荐的。
MAY
此词表示在此说明书中是可选的。

1.2术语


本文档中,频繁使用以下术语:
authenticator――验证者:
       要求验证的链路端点。验证者说明了在链路建立阶段使用的验证协议。
Peer――点到点链路的另一端:
       正在被验证者验证的一端。
Silently discard――静静地丢弃
       丢弃packet而不进行进一步的处理。执行(这个动作)应该提供记录错误,包括丢弃packet的内容,的容量,并且应该在一个统计计数器中记录这一事件。

2. 密码验证协议


       密码验证协议(PAP)提供了一种简单的方法,可以使对端(peer)使用2次握手建立身份验证。这个方法仅仅在链路初始化时使用。
       链路建立阶段完成后,对端不停地发送Id/Password对给验证者,一直到验证被响应或者连接终止为止。
       PAP不是一个健壮的身份验证方法。密码在电路上是明文发送的,并且对回送或者重复验证和错误攻击没有保护措施。对端控制着尝试的频率和时间。
       包含健壮验证方法(例如CHAP,下面描述)的任何实现者必须提供商议优先于PAP的方法。
       这个验证方法最适合用在使用有效的明文密码在远程主机上模拟登陆的地方了。通过这种用法,这个方法向普通用户要登陆远程主机提供了一种安全的类似级别。
       实现注意:要限制暴露在PPP链路上传输明文密码和避免在整个网络上发送明文密码是可能的。如果远程主机密码是以单向转换值保存的,并且转换函数的算法是在当地主机上完成的,则明文密码应该在和远程主机的转换密码比较前在本地转换。

2.1 配置选项格式


下面是关于PAP的验证-协议配置选项格式的总结。各个域由左到右传输。

    0                   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |    Length     |     Authentication-Protocol   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

类型
3
长度
4
验证-协议
c023(对于PAP)
数据
没有数据域

2.2包格式


       一个PAP包是完全封装在PPP数据链路层帧(协议域是c023代表PAP)的信息域中的。下面是PAP包格式的总结。各个域由左到右传输。
       
    0                   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Code      |  Identifier   |            Length             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    Data ...
   +-+-+-+-+

       代码
       代码域是一个字节,代表PAP包的类型。PAP代码分配如下:
       1            Authenticate-Request
2            Authenticate-Ack
3            Authenticate-Nak

标识符
标识符是一个字节,用于匹配请求和响应。
长度
长度域是两个字节,代表PAP包的长度,包括代码域,标识符和数据域。超出长度域指定的字节被认为是数据链路层的填料,在接收端应该忽略掉。
数据
数据域是零个或多个字节。数据域的格式由代码域决定。

2.2.1 Authenticate-Request


       描述
       Authenticate-Request包用来启动PAP。在验证阶段链路的一端必须传输代码域为1(验证-请求)的PAP包。直到接收到一个有效的响应包或者可选的重试计数器超时,验证-请求包必须不停地发送。
       验证者应该期待对端发送一个Authenticate-Request包。一旦接收到Authenticate-Request包,必须返回某种验证响应(下面描述)。
       实现注意:因为Authenticate-Request包可能会丢失,所以在完成验证阶段后验证者必须允许重复的Authenticate-Request包。在验证阶段完成(部分信息可能不同)后,在协议阶段必须返回相同的响应代码。在另外的阶段接到的任何Authenticate-Request包必须被静静地处理掉。
       如果Authenticate-Nak包丢失,和验证者终止链路,则LCP Terminate-Request 包和Terminate-Ack包提供一个可选择的方法表示验证失败。
       下面是Authenticate-Request包格式的总结。各个域由左到右传输。

    0                   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Code      |  Identifier   |            Length             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | Peer-ID Length|  Peer-Id ...
   +-+-+-+-+-+-+-+-+-+-+-+-+
   | Passwd-Length |  Password  ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+

       代码
1           Authenticate-Request。
标识符
标识符是一个字节,用于匹配请求和回应。每次发送一个Authenticate-Request包,标识符域必须改变。
Peer-ID-Length
Peer-ID-Length域是一个字节,代表Peer-ID域的长度。
Peer-ID
Peer-ID域是零个或多个字节,代表被验证端的名字。
Passwd-Length
Passwd-Length域一个字节,代表Password域的长度。
Password
Password域是零个或者多个字节,是用来验证的密码。

2.2.2 Authenticate-Ack and Authenticate-Nak


       描述
       如果在接收的Authenticate-Request包中的Peer-ID/Password对是可识别的和可接受的,则验证者必须发送一个代码域是2(Authenticate-Ack)的PAP包。
       如果在接收的Authenticate-Request包中的Peer-ID/Password对是不可识别的和不可接受的,则验证者必须发送一个代码域是3(Authenticate-Nak)的PAP包,并且应该终止链路。
       下面是Authenticate-Ack包和Authenticate-Nak包格式的总结。各个域由左到右传输。

    0                   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Code      |  Identifier   |            Length             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Msg-Length   |  Message  ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-

       代码
2           Authenticate-Ack;
3           Authenticate-Nak
标识符
标识符域是一个字节,用于匹配请求和回应。此域必须从引起这次回应的Authenticate-Request包标识符域复制过来的。
Msg-Length
Msg-Length域是一个字节,代表Message域的长度。
Message
Message域是零个或者多个字节,并且它的内容依靠于实现者。它是可读的,不得影响协议的操作。建议在Message中包含可显示的ASCII字符(32-126)。扩展字符集的机制是进一步研究的主题。

3.Challenge-Handshake Authentication Protocol


       CHAP 用于使用3次握手周期性的验证对端。在链路建立初始化时这样做,也可以在链路建立后任何时间重复验证。
       在链路建立完成后,验证者向对端发送一个“challenge”信息。对端使用一个“one-way-hash”函数计算出的值响应这个信息。验证者使用自己计算的hash值校验响应值。如果两个值匹配,则验证是承认得,否则连接应该终止。
       CHAP通过使用递增的标识符和可变得挑战值提供了防止回送攻击的保护。使用重复挑战目的是任一个攻击的暴露时间。验证者控制着挑战的频率和时间。这种验证方法依靠只有验证者和对端知道的秘密(secret)。这个秘密(secret)不在链路上传播。这种方法最可能用的地方是相同的秘密容易访问链路的两端。
       实现注意:CHAP要求秘密是明文形式的。为了避免在网络的其他链路上发送秘密,建议在中心服务器上检查challenge 和respone值,而不是在每一个网络访问服务器上检查。另外,秘密应该以可逆转的加密形式发送到服务器上。
       CHAP算法要求秘密的长度必须至少一个字节。秘密至少应该和选择好的密码一样大小和不可猜。比较好的是秘密应该至少是选择的哈希算法的哈希值的长度(对于MD5是16个字节)。这样保证了足够大的范围使得秘密提供了防止穷尽搜索攻击的保护措施。
       选择one-way哈希算法使得要想从已知的challenge 和response值得出秘密的计算是不可行的。
       Challenge值应该符合两个标准:唯一性和不可预测性。每一个challenge值应该是唯一的,因为使用与相同秘密联系的challenge执的副本可以让攻击者利用前一个截获得响应包响应。由于希望可以使用相同的秘密在不同区域中验证服务器,challenge 应该具有全局和暂时的唯一性。每一个challenge值也应该是不可预测的,否则攻击者欺骗对端响应一个可预测的未来challenge,然后用这个响应伪装成对端欺骗验证者。尽管象CHAP这样的协议不能够防止实时的窃听攻击,但是使用唯一的和不可预测的challenge可以防止一定范围的能动攻击。
       关于唯一性来源和产生分歧概率的讨论包含在Magic-Number配置选项中。

3.1配置选项格式


下面是Challenge-Handshake 验证协议使用的Authentication-Protocol 配置选项格式的总结。各个域由左到右传输。

    0                   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |    Length     |     Authentication-Protocol   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Algorithm   |
   +-+-+-+-+-+-+-+-+

类型
3
长度
5
Authentication-Protocol
c223 Challenge-Protocol Authentication Protocol
算法
算法域是一个字节,代表所使用的one-way 哈希算法。CHAP算法域的最新值在最近的“Assigned Numbers”RFC[2]中有详细说明。当前的值分配如下:
0-4     unused(保留)
5         MD5[3]

3.2包格式


CHAP包封装在PPP数据联络层帧的信息域中,它的协议域是c223。下面是CHAP包格式的总结。各个域由左到右传输。

    0                   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Code      |  Identifier   |            Length             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    Data ...
   +-+-+-+-+

代码
代码域是一个字节,代表CHAP包的类型。CHAP代码分配如下:
1     Challenge
2     esponse
3     Success
4           Failure

标识符
标识符是一个字节,用于匹配challenge,response和replies。
长度
长度域是两个字节,代表CHAP包的长度,包括Code,Identifier,Length和Data。超出这个长度的字节应该被认为是链路层的填料,在接收端应该被忽略。
数据
数据域是零个或者多个字节。它的格式由code域决定。

3.2.1 Challenge 和 Response


       描述
       Challenge包用来启动CHAP。验证者必须发送一个代码域是1的CHAP包。一直到接收到有效的响应包或者重试计数器超时,必须不停发送Challenge包。
       在网络层协议阶段的任一个时间也可以发送Challenge包确保连接没有改变。
       在验证阶段和网络层协议阶段对端应该期待Challenge包。无论何时接到Challenge包,对端必须发送一个代码域是2的CHAP包。
       无论何时验证者接到一个Response包,则它比较Response值和自己计算的期待值是否相同。在比较的基础上,验证者必须发送一个Success 或者Failure包。
       实现注意:因为Success包有可能丢失,验证者必须在完成验证阶段后允许重复的Response包。为了防止名字和秘密的泄漏,在验证阶段后,任何具有当前Challenge标识符的Response包必须返回相同的响应代码。在其他阶段接到的任何Response包必须被静静地丢掉。
       如果Failure包丢失和验证者终止链路,则LCP的Terminate-Request包和Terminate-Ack包提供了另一种代表验证失败的方法。
       下面是Challenge 和Response包格式的总结。各个域由左到右传输。

    0                   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Code      |  Identifier   |            Length             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Value-Size   |  Value ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Name ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

       代码
       1     Challenge
2     Response

       标识符
       标识符是一个字节,每发送一个Challenge包标识符必须改变。Response包的标识符必须从引起这个响应的Challenge包的标识符复制过来的。
       Value-Size
       此域是一个字节,代表Value域的长度。
       Value
       Value域是一个或多个字节。最重要的字节先传输。
       Challenge Value是一个可变的字节流。上面讲述了Challenge Value唯一性的重要性以及它和秘密的关系。每次发送Challenge 包必须改变Challenge Value。Challenge Value的长度依靠于产生字节所使用的方法,独立于所用的哈希算法。
       Response Value是在字节流上用单向哈希算法计算得出的,字节流包含Identifier,后面是secret,再后面是Challenge Value。Response Value的长度依靠于所用的哈希算法(对于MD5是16个字节)。
       名字
       名字域是一个或多个字节,代表发送包的系统的标识。对这个域的内容没有限制。例如,它可以是ASCII字符串或者是ASN.1语法中的全局唯一标识。名字不应该是以NULL 或者CR/LF结尾的。大小由长度域决定。
       因为CHAP可以验证许多不同的系统,所以名字域的内容可以用作在秘密数据库查询秘密的关键字。这也可以在每个系统上支持更多的Name/Secret对。

3.2.2 Success 和 Failure


       描述
       如果在Response包中的Value等于期待的值,则验证者必须发送一个代码域是3(Success)的CHAP包。
       如果在Response包中的Value不等于期待的值,则验证者必须发送一个代码域是4(Failure)的CHAP包,并且应该终止链路。
       下面是Success和Failure包格式的总结。各个域由左到右传输。

    0                   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Code      |  Identifier   |            Length             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Message  ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-

       代码
       3     Success
       4     Failure
      
       标识符
标识符是一个字节,用于匹配request和replies。标识符必须从引起这个响应的Response包的标识符复制过来的。
Message
Message域是零个或者多个字节,它的内容依靠实现者。它被设计成可读的,不得影响协议操作。建议在Message中包含可显示的ASCII字符(32-126)。扩展字符集的机制是进一步研究的主题。大小由长度域决定。

 

安全考虑
       安全问题是此备忘录的主要话题。
       PPP中的验证协议的交互操作很大程度上依靠于实现者。在文档中通篇使用SHOULD表明了这点。
       例如,一旦验证失败,有些实现者并不终止链路。相反,实现者限制网络层的通信量的类型构造子网,这样反过来允许用户有机会更新秘密或者发邮件给网络管理员说明问题。
       对于验证失败没有重试机制。然而,LCP状态机可以在任何时候重新磋商验证协议,这样就允许了一个新的重试。建议任何用来为验证失败的计数器在成功验证前或者终止失败的链路前不要重置。
       不要求验证是双向的或者在两个方向使用相同的协议。在任一个方向上使用不同的协议是完全可以接受的。当然,这依靠于在磋商时指定的协议。
       在实践中,在每个PPP服务器上有一个数据库,它联合验证信息的用户名字。不期望使用多个方法验证特殊的命名用户。这样使用户容易受到攻击。作为代替的,对于每一个命名用户有一个准确的方法用来验证用户名。如果一个用户在不同的环境下需要使用不同的验证方法,那么应该采用截然不同的用户名,每一个准确代表一个验证方法。
       密码和其他的秘密应该保存在各自的端点以至于对它们的访问尽可能的受到限制。理想的,只能是为了完成验证而需要访问的过程可以访问秘密。
       应该使用一种机制分发秘密,这种机制能够限制处理秘密实体的数目。理想的,没有通过验证的人不会再得到秘密的内容。使用SNMP安全协议[4]可以实现这个目标,但是这样的机制不在这个规范的范围内。
       目前正在研究和试验其他的分发机制。SNMP安全文档很好的概括了对网络的威胁。

参考文献

   [1] Simpson, W., "The Point-to-Point Protocol (PPP)", RFC 1331,
       Daydreamer, May 1992.

   [2] Reynolds, J., and J. Postel, "Assigned Numbers", RFC 1340,
       USC/Information Sciences Institute, July 1992.

   [3] Rivest, R., and S. Dusse, "The MD5 Message-Digest Algorithm", MIT
       Laboratory for Computer Science and RSA Data Security, Inc. RFC
       1321, April 1992.

   [4] Galvin, J., McCloghrie, K., and J. Davin, "SNMP Security
       Protocols", Trusted Information Systems, Inc., Hughes LAN
       Systems, Inc., MIT Laboratory for Computer Science, RFC 1352,
       July 1992.

致谢
       此文档的一些内容来自RFC1172,它是由 Drew Perkins of Carnegie Mellon University和Russ Hobby of the University of California at Davis共同制定的。
       特别感谢Dave Balenson, Steve Crocker and, James Galvin,和Steve Kent,感谢他们的广泛的解释和建议。
主席地址
       可以通过现任主席联系工作组。
        Brian Lloyd
      Lloyd & Associates
      3420 Sudbury Road
      Cameron Park, California 95682

      Phone: (916) 676-1147

      EMail: brian@lloyd.com

 

作者地址
       关于此备忘录的问题可以直接联系:

      William Allen Simpson
      Daydreamer
      Computer Systems Consulting Services
      P O Box 6205
      East Lansing, MI  48826-6205

      EMail: Bill.Simpson@um.cc.umich.edu

完整版权说明
   Copyright (C) The Internet Society (2001).  All Rights Reserved.

   只要在所有复本与推导性工作中包含上面的版权声明和这段文字,就可以全部地或者部分地且没有任何限制地复制这篇文档与其译本以及把它提供给其它文档,同样也可以准备、复制、出版与发行推导性工作,而且需要评述此推导性工作否则就得解释它,或者辅助此推导性工作的实现。然而,此文档本身不可以做任何修改,诸如删除版权声明或者因特网社区或其它因特网组织的涉及,除了当需要开发因特网标准的目的时之外且在此种情况下必须遵循在因特网标准过程中定义的版权程序,或者除了当要求把它译成其它语言(即不是英文)的目的时之外。
在上面准予的有限的许可是永久性的,而且因特网社区或者它的继承者或指派者都将不会废除它。
在此包含的这篇文档与信息是基于“AS IS”而提供的,并且因特网社区与因特网工程任务组织声明了所有的授权、表达或含义,且包含对任何授权的限制,比如这里信息的使用不会违反任何授权或者出于特殊目的的商品性或适切性的任何含蓄授权。
致谢
感谢因特网社区当前为RFC编辑提供了功能基金。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内