PPP的基本概念
就第一层实体层而言,PPP必须建於全双工(full-duplex)的连结之上,但拨接线(dial-upline)或专线(dedicatedline)均可适用;此外,8bits没有同位检查的非同步或同步模式均可。PPP对於一般的DTE与DCE介面均有支援,如EIARS-232-C,EIARS-422,EIARS-423以及CCITTV.35;而对於DCE而言,PPP协定并不需要来自於DCE(如modem)的一些控制讯号,如RTS、CTS、DCD、DTR。但该协定也建议,如果用那些控制信号的话,可增强PPP双方的效能;换句话说,PPP协定是建议使用那些信号。
就PPP的layer2而言,它使用HDLC框架(一种源自於IBM的SNA网路架构中datalinklayer的SDLC框架),而HDLC中的FCS(FrameCheckSequence)可以把传输过程中的错误侦测出来。此外,流量控制的XON/XOFF信号在PPP协定中也可以穿透过连结,而使双方管制流量。为了去适应不同的第叁层网路层的环境与第一层实体层,第二层的PPP有如下的功能:
建立一条error-free的连结或结束连结。
侦测线上的情况,并做适当的处理。
协调网路层所需之参数,如封包大小、非同步控制讯号、密码验证通讯协定、协定栏压缩、线路回圈设定、品质协定等。这些都是透过LinkControlProtocol(LCP)来达成的。
就PPP在第叁层的功能而言,它可封装(encapsulation)不同型态的网路层的封包,它具有多重协定分封的功能,所以可适用於主机、桥接器、路由器之间的连结。NCP(NetworkControlProtocol)就是负责PPPlayer3的协定,比方说,动态分配IPAddress就是由NCP达成的。
PPP框架格式
它是用软体的方式去模拟HDLC框架,当然也是用软体的方式去计算出FCS(CRC-CCITT,即x^0+x^5+x^12+x^16),图一为其框架格式:
旗标Flag
它必须为二进码的01111110,代表框架起始或结束,如连续两个框架的话,中间只需插入一个Flag即可;而Inter-frameFill为框架两不连续框架间所要保持之信号,以非同步模式而言,它须全为*1*,而同步模式须为Flag,即不断送出01111110信号。
位址Address
它必须为二进码的11111111,即All-Stationsaddress才能被对方所接受。
控制Control
它必须为二进码的11111111,即UnnumberInformation(UI)才能被对方所接受。
协定Protocol
它为2个bytes,它表示之後Information的型态,如表一:PPP规定所有的协定须为奇数,且第一个byte须为偶数;而PPP协定范围也有不同的意义,如表二:
资讯Information
即上述协定(protocol)所指定的资料,内定最大长度为1,500bytes。
框架检查序FCS
为16个bits,方式为CRC-CCITT,CRC的计算包括Address、Control、Protocol、Information等栏位。
LCP封包格式
LCP与NCP的封包是架在Information栏内,比方说当PPP的协定(Protocol)栏为c021时,那麽在Information栏内的资料就属於LCP封包,而它的格式如图二:
码(Code)
1个位元组,它是用来分辨LCP封包的型态,可分为叁类:
识别字(Identifier)
1个位元组,它是用来识别我们的请求或回应。
长度(Length)
2个位元组,它表示Code、Identifier、Length与Data的总长度。
资料(Data)
0个或以上个位元组,它为封包所携的资料。
以上是PPP原理的简介,我们原则上可把LCP当做是建立、维护、终止连线的协定,同时它利用码(Code)来让做为封包的识别型态。有了PPP协定的基本观念後,且让我们亲自动手一下,看看要准备怎样的实验环境。
架好实验环境
首先您的Linux核心版本须大於1.1.14;同时您的核心也必须包含有原始程式,因为接下来的PPP应用程式会更新核心,核心得重新编译。最好您也有一台PC(笔记型电脑由佳)与简易交换机(COS),最後再接上两台数据机,如图叁,就完成基本的PPPServer硬体实验环境。
开始编译与装设程式
首先用gzip-d把ppp22b2.tgz给解开,它会产生ppp22b2.tar,然後再用tarxvfppp22b2.tar就可建立ppp-2.2b2的子目录,接着进入该子目录就可开始编译以及装设程式,读者可依照如下的步骤:
步骤一./configure
在ppp-2.2b2的目录下执行,此步骤先去辨视您所使用的作业系统,再去建立该作业系统所需的makefile,这些makefile之後的步骤会使用到。
步骤二makekernel
在ppp-2.2b2的目录下执行,它会去更新核心中有关PPP部份的原始码,这部份的核心原始码必须与步骤四的PPP应用程式相互配合才行。
步骤叁makezlilo
转换至Linux原始程式的目录之下,并且执行makezlilo来去编译步骤二所更新的原始码;同时若编译成功它就会去更新Linux核心的Image,这个动作也会使得LILO(LinuxLoader)在开机时自动从硬碟来载入新的核心。
步骤四make
在ppp-2.2b2的目录下执行,它会去编译PPPServer所需的PPP应用程式,如chat、pppd、pppstats等,这部份的程式是与步骤二的PPP核心程式配合。
步骤五makeinstall
把步骤四所编译好的PPP应用程式装设至/usr/lib/ppp目录下,同时也会安装说明档。
步骤六重新开机
步骤一至步骤五若能成功的执行,那麽PPPServer所需的核心与PPP应用程式都已备妥,也就是说您的PPPServer已经成功了一半。
接着让我们一步步来检视PPPServer的启动,好让我们在问题发生时能够逐步除错,以免自乱阵脚!
类别值意义
建立与架构连结1Configure-Request
2Configure-Ack
3Configure-Nak
4Configure-Reject
停止连结5Terminate-Request
6Terminate-Ack
线路维护与测试7Code-Reject
8Protocol-Reject
9Echo-Request
10Echo-Reply
11Discard-Request
12RESERVED
PPP启动
首先用gzip-dppplogin.tgz把ppplogin这支程式给解压缩,然後再用tarxvfppplogin.tar就可把ppplogin这个scriptfile给取出来,ppplogin是个很重要的档案,我们之後会用到。
/etc/inittab
这是开启拨接线给PPP使用者,例如:以下是把COM1设定为拨接专用的介面,它的服务程式为/sbin/agetty。
d1:45:respawn:/sbin/agetty-mt6019200,9600,2400
基本上Linux的/etc/inittab档都有如上的定义,您只要把#(comment)拿掉即可。另外您也须留意modem的内建设定,务必使得它能与agetty相容;例如:modem内定与DTE(如PC)的速率要能与agetty的设定相容,同时PPPServer所接modem的设定(如铃响几声後开始进入回应模式)也都必须留意,这些设定是不随modem关机而消失的。
/etc/passwd
这是用来设定使用者登录时所须敲入的帐号与密码,例如以下的指令:
ppp::501:101:ppp:/tmp:/sbin/ppplogin
就是开启一个使用者为ppp的帐号,不用密码,使用者ppp的识别码为501,群组识别码为101,使用者的根目录为/tmp,login正确後所执行的程式为/sbin/ppplogin。
请注意,这个ppplogin就是先前从ppplogin.tgz给解压缩出来,并且我们把它拷备至/sbin目录之下,别忘了它必须设定为可执行模式。
/sbin/ppplogin
它是一个由perl所写成的script档,当使用者成功的login之後,这个script会被叫用来做为使用者签入与PPP应用程式(如PPPD,由编译先前的ppp22b2.tgz所产生)间的桥梁,它的功用详述如下:
首先ppplogin会去了解该位使用者是谁(用/usr/bin/whoami)与他的终端机名称为何(用/usr/bin/tty),然後用此资讯去查阅/etc/slip.hosts确认使用者是否合法,以及/etc/slip.tty确认终端机名称是在许可的范围之内,如果设定都正确的话,ppplogin就会取得IPAddress,然後再去呼叫/usr/lib/ppp/pppd。
以下为笔者自己PPPServer中的slip.hosts与slip.tty的设定:
/etc/slip.hosts:
格式:loginlocal_addrremote_addrnetmaskopt1opt2
例子:ppp148.5.3.211DYNAMIC0xffff0000compressed
这个设定是把ppp这位使用者的设定为DYNAMICIPAddress模式,也就是他的IPAddress是根据他所登录的终端机名称以及/etc/slip.tty的设定所决定的,换句话说,每次登录至PPPServer的IPAddress都是不固定的。
如果读者不想把PPPServer设定在DYNAMICIPAddress模式而想把它设为固定IPAddress的话,那麽直接把DYNAMIC改为您想设定的IPAddress即可,同时ppplogin也不会再去查阅slip.tty了。
/etc/slip.tty:格式:/dev/tty??xxx.xxx.xxx.xxx
例子:/dev/ttys0148.5.3.213
例子:/dev/ttys1148.5.3.214
它是用来设定终端机名称与所对应的IPAddress;例如使用者从com1所连接的modem登录进来,那麽他的终端机名称为/dev/ttys0,同时他所分配到的IPAddress为148.5.3.213;同理,从com2进来则为/dev/ttys1,IPAddress为148.5.3.214。
/usr/lib/ppp/pppd
这个程式是由先前编译ppp22b2.tgz,然後install产生的,ppplogin在取得IPAddress(不管是固定IP或DYNAMICIP)後,就把执行权交给pppd,至此,连结的两端完全进入PPP模式,而pppd就是上述PPP原理的实作程式。
上线看看
以下是笔者用WIN95连上自己所架的PPPServer的过程,首先是架好如图叁的硬体,然後拨号上线之後,出现khhp83login:,接着笔者回应ppp来登录,如图四,等一会而我们就成功的上线啦!如图五所示。
PPP分析
读者可用ifconfig、netstat与先前编译好的PPP应用程式pppstates来去分析PPP;另外README.linux是个很不错的PPPServer说明,读者解开ppplogin.tgz後就可看到,同时该说明也提及一些不错的PPPServer的安全手则,蛮有意思的。PPP的基本的原理请参阅RFC1661与RFC1662,同时由於PPP协定较为烦琐,它还包含有很多的细目,如RFC1332的IPCP、RFC1333PPPLinkQualityMonitory、RFC1334PPPAuthenticationProtocols,有兴趣的读者可参阅上述的RFC;同时笔者认为,若各位对PPP协定有兴趣,不要光读那些RFC,最好自己也能装一次PPPServer与研读原始程式,这样才能真正了解PPP协定与PPPServer。
原作者:不详
来源:LINUX技术支持