PPP (Point-to-Point)提供了一种标准的方法在点对点的连接上传输多种协议数据包,它最常见的用途可能是传统的拨号上网了(据说现在的宽带接入 也有采用PPPOE方式的)。在Linux Mobile Phone上,网络应用程序使用PPP作为与GSM模组之间的通信协议,最近遇到了一点关于PPP的麻烦,所以花了点时间去研究它。
PPP 协议肯定不是最复杂的网络协议,不过pppd、chat、tty、socket、ccp、chap、pap、eap、ecp、ipcp和很多其它概念搅在 一起之后,谁都会被搞得晕头转向。我关心的其实是PPP协议中各个实体之间的协作关系,而不是协议的状态转换或者服务的配置,由于没有找到这方面的资料, 只好去读RFC,内核、pppd和一些网络工具的代码。
PPP协议提供两个实体之间的数据链路连接的建立、维持和释放,负责流量和差错控制等等功能,所以它应该是属于数据链路层协议的。
PPP 协议之下是以太网和串口等物理层,之上是IP协议等网络层。这里,对于下层,我们只讨论串口的情况,对于上层,我们只讨论TCP/IP的情况。发送时, TCP/IP数据包经过PPP打包之后经过串口发送。接收时,从串口上来的数据经PPP解包之后上报给TCP/IP协议层。
网络协议是分层实现的,上层一般只需要知道其直接下层,只有在极少数据情况才使用间接下层的接口。比如,彩信、浏览器和邮件等应用程序使用socket接口编程,它们只需要知道TCP/IP协议,而无需要知道PPP协议的存在。这种分层设计简化了协议的实现和应用程序的开发。
问题来了:PPP 协议不只是提供了简单的数据链路层功能,它还提供了诸如鉴权(如P