目录
-
PPP协议
-
什么是PPP协议
PPP协议(Point-to-Point Protocol)是一种网络协议中最为基础的协议,工作于数据链路层,它是为在同等单元之间传输数据包这样的简单链路而设计的,这种链路提供了全双工操作,并按照顺序传递数据包。PPP为基于各种主机,网桥和路由器的简单连接提供一种共通的解决方法。
- 主要特点:
链路控制协议 LCP(Link Control Protocol);
网络控制协议 NCP(Network Control Protocol);
认证协议:口 令验证协议PAP(Password Authentication Protocol)和挑战握手验证协议CHAP(Challenge-Handshake Authentication Protocol)。
- PPP协议包括以下三个部分:
- 数据帧封装方法
- 链路控制协议LCP,(Link, Control Protocol):它用于对封装格式选项的自动协商,建立和终止连接。探测链路错误和配置错误。
- 针对不同网络层协议的一族网络控制协议NCP(Network Control Protocol): PPP协议规定了针对每一种网络层协议都有相应的网络控制协议,并用他们来管理各个协议不同的需求
-
PPP通信建立
1.LCP协商,协商内容包 括除RFC1661中所定义的选项之外,还要考虑PPPOA和PPPOE协议中规定的内容。
2.LCP协商过 后就到了Establish阶段,开始PAP或CHAP认证。PAP为两次握手认证,口令为明文。PAP认证过程如下:发送用户名同口令到认证方,认证方 查看是否有此用户,口令是否正确,然后发送相应的响应。CHAP为三次握手认证,口令为密文(密钥)CHAP认证由认证方发送一些随机产生的报文,交给被 认证,被认证方用自己的口令字用MD5算法进行加密,传回密文,认证方用自己保存的口令字及随机报文用MD5算法加密,比较二者的密文,根据比较结果返回 响应的响应。
3.认证成功即进 行Network阶段协商(NCP),在IP接入中主要是IPCP协商(如IP地址和DNS地址的协商等)。任何阶段的协商失败都将导致链路的拆除。
4.协商成功,则 链路建立成功,可以开始传输网络层数据报文。
-
PPP认证方式
- 口令验证协商(PAP)
PAP是一种简单的明文验证方法。NAS(网络接入服务器)要求用户提供用户名和口令,PAP一明文方式返回用户信息。
-
挑战-握手验证协议(CHAP)
CHAP是一种加密的验证方式,能够避免建立连接时传送用户的真是密码。NAS向远程用户发送一个挑战口令(challenge),其中包含会话ID和一个任意生成的挑战字符串(arbitrary challenge string)。远程用户必须使用MD5单向哈希算法返回用户名和加密的挑战口令,会话ID以及用户口令,称为Secret PASSword,其中用户名以非哈希方式发送。
-
ppp协议栈
主要负责PPP层数据的封装、压缩与解压缩.另外,它还对普通数据包和Ppp过程的数据包进行了分流,将普通数据包提交到TCP/IP协议栈,而将Ppp过程的数据包放到/dev/ppp设备队列中,等待Pppd去收取并处理。
-
pppd数据传输
应用程序通过socket 接口发送TCP/IP数据包,这些TCP/IP数据包流经PPP协议处理模块,然后通过串口发送出去。
- pppd在make_ppp_unit函数调用ioctrl(PPPIOCNEWUNIT)创建一个网络接口(如ppp0),内核中的PPP协议模块在处理PPPIOCNEWUNIT时,调用register_netdev向内核注册ppp的网络接口,该网络接口的传输函数指向ppp_start_xmit。
- 当应用程序发送数据时,内核根据IP地址和路由表,找到ppp网络接口,然后调用ppp_start_xmit函数,此时控制就转移到PPP协议处理模块了。ppp_start_xmit调用函数ppp_xmit_process去发送队列中的所有数据包,ppp_xmit_process又调用ppp_send_frame去发送单个数据包, ppp_send_frame根据设置,调用压缩等扩展处理之后,又经ppp_push调用pch->chan->ops->start_xmit发送数据包。
- pch->chan->ops->start_xmit是什么?它就是具体的传输方式了,比如说对于串口发送方式,则是ppp_async.c: ppp_asynctty_open中注册的ppp_async_send函数,ppp_async_send经ppp_async_push函数调用tty->driver->write把数据发送串口。
-
Pppd 控制协议数据流程
pppd是一个用户空间的后台服务进程(daemon。pppd实现了所有鉴权、压缩/解压和加密/解密等扩展功能的控制协议。pppd只是一个普通的用户进程,pppd与内核中的PPP协议处理模块之间通过设备文件(/dev/ppp)进行通信。pppd有一个辅助工具chat,用来与GSM模组建立会话。它向串口发送AT命令,建立与GSM模组的会话,以便让PPP协议可以在串口上传输数据包。
-
Linux中的PPP实现
-
Linux中的PPP架构
PPP协议工作在数据链路层,上有IP协议等网络层,下有以太网,串口等物理层,发送数据时,TCP/IP数据包经过PPP打包之后经过串口发送,接收时,从串口上来的数据经过PPP解包后上报TCP/IP协议层,Linux下PPP框架结构:
-
安装PPP
-
方法一:源码安装
- 下载源码:官网下载比较慢,大家可以去我的git仓库clone,地址:http://tjcshx.club:8808/tree/Linux_src.git
- 解压:
tar -xzvf ppp-2.4.7.tar.gz ppp-2.4.7/
- 编译安装
./configure
make
-
方法二: 直接安装
sudo apt-get install ppp
-
PPP拨号上网流程
- 硬件准备:测试系统:树莓派,测试硬件:EC20,电话卡:中国联通;
- 软件准备:
因为树莓派上已经支持了4G模块的驱动,插上之后能自动检测出来,需要准备的只有应用层的pppd程序,两种方式,网上下载源码到树莓派上编译安装,另一种 sudo apt-get install ppp都可,在安装好ppp相关驱动后,就可以开始写我们的拨号脚本啦!
-
拨号脚本脚本文件
- 编写rasppp脚本文件
sudo vim /etc/ppp/peers/rasppp
- 编写chat-rasppp-connect脚本文件
sudo vim peers/rasppp-chat-connect
- 编写chat-rasppp-disconnect脚本文件
sudo vim /etc/ppp/peers/rasppp-chat-disconnect
-
开始PPP拨号上网
sudo pppd call rasppp
可以使用ctrl+z放到后台运行,但是不能使用ctrl+c终止拨号。
拨号成功后,会返回两个DNS域名,如果拨号失败,要注意不同运营商的拨号方式是不一样的,比如电信需要填写用户名和密码,而。.移动和联通则不需要,拨号号码也不相同联通是 *99# ,电信是 #777。
-
使用ifconfig查看ppp0网卡是否存在
ifconfig
-
添加默认网关
sudo route add gw your_ipaddr
-
查看网关
route -n
-
上网测试
在我们自己的系统中可能会有多个网卡,如果我们想指定特定的网卡来上网,可以使用:
ping baidu.com -I ppp0 // -I xxx 指定特定的网卡来上网
这样我们的ppp拨号上网就配置好了。
-
各个运营商拨号上网设置:
运营商(ISP) | APN | 拨号号码 | 账号 | 密码 |
---|---|---|---|---|
中国联通WCDMA(China Unicom)) | 3GNET | *99# | 空 | 空 |
中国电信CDMA2000(China Telecom) | 空 | #777 | ctnet@mycdma.cn | vnet.mobi |
1X网络 | 空 | #777 | card(CARD) | card(CARD) |
中国移动 TD-SCDMA(China Mobile) | CMNET | *98*1# | 空 | 空 |
中国移动 CPRS(China Mobile) | CMNET | *99***1# | 空 | 空 |