Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1299716
  • 博文数量: 436
  • 博客积分: 7854
  • 博客等级: 少将
  • 技术积分: 3225
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-18 16:30
文章分类

全部博文(436)

文章存档

2013年(2)

2012年(56)

2011年(70)

2010年(308)

分类:

2011-01-26 17:21:22

freeradius server进行计费,协议里是这么描述的,
1.NAS客户端发送accounting-request计费请求到服务器,请求中携带计费开始时间,计费开始标识等信息;
2.计费服务器响应accounting-response,告诉客户端计费开始已经成功;
3.NAS客户端断开连接后,向服务器发送计费结束请求,请求携带了会话时间,延迟时间,流量等,服务器记录相关的信息,计费完成。

这样的话,问题来了,当计费端想要实时对费用进行监控,当用户的流量超过了指定的数目,就必须实时的停止NAS客户端接入网络,这个样的需求,RADIUS协议有支持吗?
 
--------------------------------------------------
freeradius的实现机制,都是NAS客户端发送请求,服务端做出响应,并没有服务端主动通知NAS
 
--------------------------------------------------
RADIUS协议不支持实时流量监控,而且楼主也说对了,通讯过程由客户端发起,服务端响应,因此标准协议下不支持服务端主动通知。

但是RADIUS协议有个属性叫做Session-Timeout,它的意思就是本次会话的总时长,你可以利用它来间接实现剩余费用限制(按时间计费前提下)。流量计费也可以参考这个思路,把总流量通过扩展RADIUS属性下发,协议中保留了这种扩展性,你只需要实现Vendor-Specific即可。
 
--------------------------------------------------
非常感谢你的回复,这下子我就更加确定RADIUS协议不能支持服务器主动通知,只能在Session-Timeout做文章了。现在想到的方法是:
1.服务器收到NAS发起的account-request请求时,进行响应,并携带属性Session-Timeout值,告诉客户端接入网络的总时长;
2.NAS客户端收到服务器的account-response后,取出Session-Timeout值,并开辟线程,当超过这个时间时,断开客户连接,并发送计费结束请求道服务端。
相当于NAS自己控制实时计费,现在只能想到这样做了,有何更好的方法,请告知,谢谢!
 
--------------------------------------------------
一般的做法是在认证阶段下发这个属性,协议原文是:

This Attribute is available to be sent by the server to the client in an Access-Accept or Access-Challenge.

实际上RADIUS协议的断开连接,也是客户端发起的,所以即便是你服务端进行检测,最后还是要让客户端发起计费结束请求。当然也可以扩展RADIUS协议,由NAS定时发送一个包含计费信息(流量、时长)的Access-Request报文,服务端收到后更新计费信息并判断是否需要断开,不过这样的做法貌似并不比Session-Timeout更好,而且开发难度要大一些。
 
 
阅读(4902) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~