PPP数据帧的编码与解码

一、摘要 

PPP协议是在ATM网络里常用的链路协议,基于PPP协议的PPPoA,PPPoE在xDSL调制解调器中不可或缺。本文简单描述PPP协议的帧封装格式,并给出了一个简单的PPP编码与解码算法,以期望能对需要者有所帮助。 

二、PPP协议简介

PPP数据帧的格式看上去很像ISO的HDLC(高层数据链路控制)标准。如图是PPP数据
帧的格式。


每一帧都以标志字符0x7e开始和结束。紧接着是一个地址字节,值始终是0xff,然后是一
个值为0x03的控制字节。

PPP frame

接下来是协议字段,类似于以太网中类型字段的功能。当它的值为0x0021时,表示信息
字段是一个IP数据报;值为0xc021时,表示信息字段是链路控制数据;值为0x8021时,表示
信息字段是网络控制数据。


CRC字段(或FCS,帧检验序列)是一个循环冗余检验码,以检测数据帧中的错误。
由于标志字符的值是0x7e,因此当该字符出现在信息字段中时, PPP需要对它进行转义。
在同步链路中,该过程是通过一种称作比特填充(bit stuffing )的硬件技术来完成的[ Tanenbaum
1989 ]。在异步链路中,特殊字符0x7d用作转义字符。当它出现在PPP数据帧中时,那么紧接
着的字符的第6个比特要取其补码,具体实现过程如下:


    1) 当遇到字符0x7e时,需连续传送两个字符: 0x7d和0x5e,以实现标志字符的转义。
    2) 当遇到转义字符0x7d时,需连续传送两个字符: 0x7d和0x5d,以实现转义字符的转义。
    3 ) 默认情况下,如果字符的值小于0x20(比如,一个ASCII控制字符),一般都要进行转
义。例如,遇到字符0x01时需连续传送0x7d和0x21两个字符(这时,第6个比特取补码后变为
1,而前面两种情况均把它变为0)。


这样做的原因是防止它们出现在双方主机的串行接口驱动程序或调制解调器中,因为有
时它们会把这些控制字符解释成特殊的含义。另一种可能是用链路控制协议来指定是否需要
对这32个字符中的某一些值进行转义。默认情况下是对所有的32个字符都进行转义。

--摘自《TCP/IP详解》卷1·协议 (W. Richard Stevens)

三、编码与解码

1。编码

编码就是按照前面所说的对需要转义的字符进行变换,下面是简单的实现代码:

     001   #define  PPP_FRAME_FLAG  0x7e /* 标志字符 */

    
002   #define  PPP_FRAME_ESC   0x7d /* 转义字符 */

    
003   #define  PPP_FRAME_ENC   0x20 /* 编码字符 */

    
004   #define  BUF_LEN 1500

    
005   /*  return: bytes encoded  */

    
006   int  pppEncode(unsigned  char   *  buf,  int  len) {
    
007
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值