日前,上海市区的ADSL
用户开始了
端口绑定工作,这是应上海电信公司数据业务统一认证及一业一费要求而采取的必要措施。 统一认证就是宽带业务(ADSL、LAN、Home PNA)及窄带业务作统一认证,一业一费就是一种业务一种资费,这要求认证上能对用户业务作出正确判断及计费。而端口绑定就是针对宽带用户采取的戚察用户鉴别措施。 为什么要绑定? 举个例子,张三申请了ADSL全包月业务,账号是A,隔壁李四也申请了ADSL,但是50元/30小时有限包月,账号是B。张三和李四是好朋友,为减少支出,偷逃电信费用,他们想出了共用账号的“妙策”,于是张三和李四都用账号A上ADSL,而账号B则永远不会超出50元,因为在不作绑定的情况下,账号A到哪儿都能用。 鉴于这种情况,为了防止以上情况的出现,避免电信“大请客”,就必须对全包月用户作端口的绑定,防止该账号在他人线路使用。同时,为了防止有限包月账号被他人盗用,也要针对该账号作端口绑定。 那端口绑定是怎么实现的呢?这要从上海宽带接入网的网络架构和业务模式讲起。上海ADSL用户采用DSLAM接入,ATM传输汇聚,BAS端结的模式(以后会有DSLAM的架构,但原理相似)。 如:用户1和用户2的DSLAM上联为ATM,BAS下联为ATM,为连通DSLAM和BAS需通过ATM为其开设一条虚路径VP,其中DSLAM侧VP=1,BAS侧VP=2,而用户1的ADSL Modem PVC为8/35,通过DSLAM交换后为1/40,相应的在BAS侧要创建一条PVC为2/40与之相通,用户2至BAS的链路则是2/50。由于不同DSALM开至BAS同一端口的VP是不能重复的,所以在BAS侧一个VPI/VCI可以惟一标识一个用户。根据以上原则,BAS侧1/40可以确定是用户3的,3/50可以确定是用户4的。而由于我们对BAS的VP及DSLAM上的VC都做了规划,所以每个用户的PVC可作为一个用户的惟一标识(当然,在同一BAS上的不同端口,VP是可以重复使用的)。当用户用PPPOE拨号时,BAS会向RADIUS发送一串包,其中包含一个叫NAS-PORT的包,带丛扒有BAS标识地址、BAS端口号、PVC号等信息,这些信息能惟一认定一个用户。将用户名和这些信息绑定,就是端口绑定。还是以上为例,用户1账号A,用户2账号B,用户1用账号A拨号时,BAS向RADIUS发送的PVC是2/40,因为账号A绑定的PVC是2/40,所以认证通过。而当用户1用账号B时,虽然发送的PVC是2/40,但与账号B绑定的PVC 2/50不同,RADIUS认为B是非法用户,因而认证失败,这就起到了端口绑定的作用。 那么没有设PVC号的LAN用户及Home PAN是怎么绑定的呢?其实, LAN用户可以利用VLAN ID来作端口绑定,而Home PNA可对其MAC或VLAN ID作端口绑定。原理非常简单,用户接入交换机后会被打上802.1q的tag头(即VLAN ID)。该值是可以通过BAS发送到RADIUS的,通过正确细致的规划,我们可以为用户分配渗仔昌一个惟一的VLAN ID(当然,不同设备及槽位的VLAN ID可重复使用,因为RADIUS是可以识别不同设备及其槽位端口的),通过该VLAN ID和用户名的绑定来做到端口绑定。Home PNA设备由于可以发送MAC或VLAN ID,因此建议用MAC来作端口绑定。 虽然做了端口绑定,可以实现用户一业一费及防盗打等功能。但对用户安装和排障多了些麻烦,因为跳线的错误、PVC设置的错误、VLAN ID配置的错误、RADIUS绑定的错误等都能造成认证失败。而一旦查障,涉及的相关部门很多,检查也很麻烦,因此,为提高工作效率,避免失误,对于我们工作人员的要求也就更高了。希望这篇文章能为大家的工作带来帮助,使我们的用户得到更好的服务我们行与交警进行连网,由于对方安全限制(网闸设备)必须限定发起端(client)源端口。我还是头一看慧晌到非要限制源端口的设备,虽然我认为这样会造成连接的不稳定,比如网络中断引起重新连接一定会导致本地端口的占用,此时只有等待超时端口被回收。否则将一直是port or address in use错误。可能需要复杂的机制来管理连接,以下是一个简单的socket 测试程序。
#include<stdio.h#include<sys/types.h#include<sys/socket.h#include<netinet/in.h#include<netdb.hvoiderror(char*msg){perror(msg)exit(0)}intmain(intargc,
char*argv[]){intsockfd,portno,lportno,nstructsockaddr_inserv_addrstructsockaddr_inclient_addrstructhostent*servercharbuffer[256]if(argc<3){fprintf(stderr,
usage%shostnameportLocalPort
,argv[0])exit(0)}portno=atoi(argv[2])sockfd=socket(AF_INET,SOCK_STREAM,0)if(sockfd<0)error(
ERRORopeningsocket)bzero((char*)&client_addr,
sizeof(client_addr))lportno=atoi(argv[3])client_addr.sin_family=AF_INETclient_addr.sin_addr.s_addr=INADDR_ANY
client_addr.sin_port=htons(lportno)if(bind(sockfd,(
structsockaddr*)&client_addr,sizeof(client_addr))<0)error(
ERRORonbinding)server=gethostbyname(argv[1])if(server==NULL){fprintf(stderr,
ERROR,nosuchhost)exit(0)}bzero((char*)&serv_addr,
sizeof(serv_addr))
serv_addr.sin_family=AF_INETbcopy((char*)server-h_addr,(char*)&serv_addr.sin_addr.s_addr,
server-h_length)serv_addr.sin_port=htons(portno)if(connect(sockfd,
&serv_addr,
sizeof(serv_addr))<0)error(
ERRORconnecting)printf(
Pleaseenterthemessage:)bzero(buffer,
256)fgets(buffer,
255
,stdin)n=write(sockfd,buffer,strlen(buffer))if(n<0)error(
ERRORwritingtosocket)bzero(buffer,
256)n=read(sockfd,buffer,
255)if(n<0)error(
ERRORreadingfromsocket)printf(%s
,buffer)return0}只要是bind函数的使用,发现一些人总认为bind只能应用到server程序。这是不对的。在connect的时候如果不指定端口号,系统会自动分配空闲的。但前老锋是99.9的程序都不关心本地端口号。所以很少有这么使用的。
至于含衫java 就更简单了
下边是代码片段
评论列表(0条)