- 点对点协议PPP(Point-to-Point Protocol) 是目前使用最广泛的点对点数据链路层协议。
- PPP协议是因特网工程任务组IETF在1992年制定的。经过1993和1994年的修订,现在PPP协议已经成为因特网的正式标准。
- PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法:
- 对各种协议数据包的封装方法(封装成帧)
- 链路控制协议LCP 用于建立、配置以及测试数据链路的连接
- 一套网络控制协议NCPs 其中的每一个协议支持不同的网络层协议
帧格式
帧首部由四个字段构成,帧尾部由两个字段构成
- 标志字段(Flag):PPP帧的界定符,取值0x7E
- 地址字段(Address):取值为0xFF,预留(目前没什么用)
- 控制字段(Control):取值为0x03,预留,(目前没什么用)
- 协议字段(Protocol):致命帧的数据部分送交哪个协议处理
- 取值0x0021表示:帧的数据部分为IP数据报
- 取值0xC021表示:帧的数据部分为LCP分组
- 取值0x8021表示:帧的数据部分为NCP分组
- 帧检验序列(Frame Check Sequence)字段:CRC计算出的校验位(CRC:循环冗余校验)
如何解决透明传输
如果帧的数据部分出现帧首和帧尾的标志字段(0x7E 即01111110)时,如果不处理会造成误判
面向字节的异步链路:字节填充法
插入转义字符的字节填充法:
发送方的处理:
- 出现一个7E(PPP帧的定界符)字节转变为二字节序列(7D,5E)。
- 出现的每一个7D(转义字符)字节转变成二字节序列(7D,5D)。
- 出现的每一个ASCII码控制字符(数值小于0x20的字符),则在该字符前面插入一个7D字节,同时将该字符的编码加上0x20.
接收方的处理:进行反变换
面向比特的同步链路:比特填充法
插入比特0的比特填充法
发送方的处理:对帧的数据部分进行扫描(一般由硬件实现)。只要发现5个连续的比特1,则立即填充1个比特0。
接收方的处理:对帧的数据部分进行扫描(一般由硬件实现)。只要发现5个连续的比特1,就删去后面的一个比特0.
差错检测
CRC算法计算FCS字段的取值,生成多项式:
RFC 1662的附录部分给出了FCS的计算方法的C语言实现(查表法,减少CPU占用)
接收方每受到一个PPP帧,就进行CRC检验,若正确,就收下,反之丢弃。使用PPP帧的数据链路层向上不提供可靠传输服务.
工作状态
- PPP链路的开始和结束都是“静止”状态,这时并不存在物理层的的连接。当检测到调制解调器的载波信号并建立物理层连接后,PPP就进入链路的“建立”状态。
- LCP配置协商成功,进入鉴别“状态”。协商失败退回到“静止”状态。
- 不使用鉴别或者鉴别成功,进入“网络状态”,鉴别失败,进入“终止”状态
- 进入“网络”状态后,进行NCP配置,配置完成后,进入“打开”状态,进入“打开”状态就可以进行数据通信
- 出现故障或发出终止请求时,就进入“终止”状态。
- 载波停止后,就由“终止”进入“静止状态”。