标题：RADIUS
简介
RADIUS是一种C/S结构的协议，它的客户端最初就是NAS（Net Access Server）服务器，现在任何运行RADIUS客户端软件的计算机都可以成为RADIUS的客户端。RADIUS协议认证机制灵活，可以采用PAP、 CHAP或者Unix登录认证等多种方式。RADIUS是一种可扩展的协议，它进行的全部工作都是基于Attribute-Length-Value的向量进行的。RADIUS也支持厂商扩充厂家专有属性。
由于RADIUS协议简单明确，可扩充，因此得到了广泛应用，包括普通电话上网、ADSL上网、小区宽带上网、IP电话、VPDN（Virtual Private Dialup Networks，基于拨号用户的虚拟专用拨号网业务）、移动电话预付费等业务。最近IEEE提出了802.1x标准，这是一种基于端口的标准，用于对无线网络的接入认证，在认证时也采用RADIUS协议。
历史
RADIUS协议最初是由Livingston公司提出的，原先的目的是为拨号用户进行认证和计费。后来经过多次改进，形成了一项通用的认证计费协议。
创立于1966年的Merit Network, Inc.是密执安大学的一家非营利公司，其业务是运行维护该校的网络互联MichNet。1987年，Merit在美国NSF（国家科学基金会）的招标中胜出，赢得了NSFnet（即Internet前身）的运营合同。因为NSFnet是基于IP的网络，而MichNet却基于专有网络协议，Merit面对着如何将MichNet的专有网络协议演变为IP协议，同时也要把MichNet上的大量拨号业务以及其相关专有协议移植到IP网络上来。
1991年，Merit决定招标拨号服务器供应商，几个月后，一家叫Livingston的公司提出了建议，冠名为RADIUS，并为此获得了合同。
1992年秋天，IETF的NASREQ工作组成立,随之提交了RADIUS作为草案。很快，RADIUS成为事实上的网络接入标准，几乎所有的网络接入服务器厂商均实现了该协议。
1997年，RADIUS RFC2058发表，随后是RFC2138，最新的RADIUS RFC2865发表于2000年6月。
工作原理
用户接入NAS，NAS使用Access-Require数据包向RADIUS服务器提交用户信息，包括用户名、密码等相关信息，其中用户密码是经过MD5加密的，双方使用共享密钥，这个密钥不经过网络传播；RADIUS服务器对用户名和密码的合法性进行检验，必要时可以提出一个Challenge，要求进一步对用户认证，也可以对NAS进行类似的认证；如果合法，给NAS返回Access-Accept数据包，允许用户进行下一步工作，否则返回Access-Reject数据包，拒绝用户访问；如果允许访问，NAS向RADIUS服务器提出计费请求Account- Require，RADIUS服务器响应Account-Accept，对用户的计费开始，同时用户可以进行自己的相关操作。
RADIUS还支持代理和漫游功能。简单地说，代理就是一台服务器，可以作为其他RADIUS服务器的代理，负责转发RADIUS认证和计费数据包。所谓漫游功能，就是代理的一个具体实现，这样可以让用户通过本来和其无关的RADIUS服务器进行认证，用户到非归属运营商所在地也可以得到服务，也可以实现虚拟运营。
RADIUS服务器和NAS服务器通过UDP协议进行通信，RADIUS服务器的1812端口负责认证，1813端口负责计费工作。采用UDP的基本考虑是因为NAS和RADIUS服务器大多在同一个局域网中，使用UDP更加快捷方便，而且UDP是无连接的，会减轻RADIUS的压力，也更安全。
RADIUS协议还规定了重传机制。如果NAS向某个RADIUS服务器提交请求没有收到返回信息，那么可以要求备份RADIUS服务器重传。由于有多个备份RADIUS服务器，因此NAS进行重传的时候，可以采用轮询的方法。如果备份RADIUS服务器的密钥和以前RADIUS服务器的密钥不同，则需要重新进行认证。
协议结构
Code 域长度为1个字节，用于标明RADIUS报文的类型，如果Code域中的内容是无效值，报文将被丢弃,有效值如下：
1、请求访问（Access-Request）；
2、接收访问（Access-Accept）；
3、拒绝访问（Access-Reject）；
4、计费请求（Accounting-Request）；
5、计费响应（Accounting-Response）；
11、挑战访问（Access-Challenge）；
12、服务器状况（Status-Server — Experimental）；
13、客户机状况（Status-Client — Experimental）；
255、预留（Reserved） 
Identifier ― 匹配请求和响应的标识符。 
Length ― 信息大小，包括头部。 
Authenticator 域占用16个字节，用于Radius Client 和Server之间消息认证的有效性，和密码隐藏算法。访问请求Access-Request报文中的认证字的值是16字节随机数，认证字的值要不能被预测并且在一个共享密钥的生命期内唯一。
1.访问请求认证字
在Access-Request包中认证字的值是16字节随机数,认证字的值要不能被预测,并且在一个共享密钥的生命期内唯一；
2.访问回应认证字
Access-Accept Access-Reject 和Access-Challenge包中的认证字称为访问回应认证字，访问回应认证字的值定义为MD5(Code+ID+Length+RequestAuth+Attributes+Secret)；
3.计费请求认证字
在计费请求包中的认证字域称为计费请求认证字，它是一个16字节的MD5校验和，计费请求认证字的值定义为MD5(Code + Identifier + Length + 16 zero octets + request attributes +shared secret)；
4.计费回应认证字
在计费回应报文中的认证字域称为计费回应认证字，它的值定义为MD5(Accounting-Response Code + Identifier + Length + the RequestAuthenticator field from the Accounting-Request packet being replied to +the response attributes + shared secret)；
  
消息交互
radius 服务器对用户的认证过程通常需要利用nas 等设备的代理认证功能，radius 客户端和radius 服务器之间通过共享密钥认证相互间交互的消息，用户密码采用密文方式在网络上传输，增强了安全性。radius 协议合并了认证和授权过程，即响应报文中携带了授权信息。
基本交互步骤如下：
(1) 用户输入用户名和口令；
(2) radius 客户端根据获取的用户名和口令，向radius 服务器发送认证请求包（access-request）。
(3) radius 服务器将该用户信息与users 数据库信息进行对比分析，如果认证成功，则将用户的权限信息以认证响应包（access-accept）发送给radius 客户端；如果认证失败，则返回access-reject 响应包。
(4) radius 客户端根据接收到的认证结果接入/拒绝用户。如果可以接入用户，则radius 客户端向radius 服务器发送计费开始请求包（accounting-request），status-type 取值为start；
(5) radius 服务器返回计费开始响应包（accounting-response）；
(6) radius 客户端向radius 服务器发送计费停止请求包（accounting-request），status-type 取值为stop；
(7) radius 服务器返回计费结束响应包（accounting-response）。