GPRS实现pppd拨号

1.1 pppd拨号程序
1.1.1 系统说明

系统采用pppd拨号之后,建立ppp0设备,与eth0相当,对系统来说就是提供了另外一个网路接口。
系统中存在两个网路接口,而上层的网路通信接口几乎都不指定使用哪个接口进行通信,这样就必须将ppp0设置为系统的默认网关。结果就是:系统根据目标地址将不是本地(即指不在eth0子网范围内)的数据包发送到ppp0上。
1.1.2 拨号控制分层

Ppp链路层 

主要是pppd进程对ppp链路的维护;

网路层  

对应用程序来说是对sock的操作函数部分;

应用层 

 主要是对应用层链路的维护,即心跳,注册等;

这三部分是独立控制的。如建立网路通信通信时,并不考虑ppp链路是否存在。但在整个链路的维持上,它们是由依赖的。

下面介绍这3层是如何维持链路的。

Ppp链路层 

通过定时向服务器发送LCP数据包,检测链路状态

lcp-echo-failure = 10
lcp-echo-interval = 60s
意思是每60s进行lcp链路检测,查看modem与运营商基站之间网络链接情况,如果在lcp-echo-failure次没有正常应答,pppd就会取消ppp0网卡,应用程序通过检测ppp0网卡运行状态,来确定网络连接是否可用。
当用这种方法检测网络是否可用,很难验证。需要在拨号成功后切断猫和基站之间的连接,可以做的是拔掉天线,但即使这样,猫也可能在信号极其微弱的情况下,偶尔与基站之间通信正常,而很难达到连续失败10次而检测到网络断开!!!
测试发现在信号很弱的情况下,上述检测链路通断的方法并不可靠。可能出现的情况是上述检测方法显示网络连接正常,而发生数据包和建立tcp链路失败。所以需要更上层的协议来加强网络状态的检测和处理。

网路层 

通过系统提供的socket操作函数来对网路层的连接进行检查。

一般正常断开tcp连接可以检测到。当对于拔掉网线的情况,则无法检测,可依赖上层心跳机制来识别;为避免频繁建立连接,也限制了建立于主站服务器连接的时间。即第一次连接失败,则等待1s,第二次则等待2s后开始建立连接。。。若等待时间大于512s则等待512s,若连续32次失败,则重启ppp链路层,并重置等待时间为0。
另外它的状态也会影响应用层的注册和心跳。即若该层连接未建立,则上层的心跳和注册任务是不会运行的。这样避免了登录上主站发送1个心跳和1个注册的问题,并且也避免了上报帧序号不连续的问题。

应用层 

主要通过注册和心跳的回复是否正常来判断链路是否正常。心跳任务流程如下:

连接上应用服务器后,发送注册,若主站不回应,则每隔T(目前为1)分钟后重发,若重发次数大于了3(即发送了4个注册),则将网络层连接重连,并将间隔增加到2T分钟,依次类推,直到间隔大于32T。若连续失败5*4次,则将ppp链路重启,并将间隔置为1T,重新循环。

pppd拨号流程

GPRS实现pppd拨号_第1张图片

你可能感兴趣的:(ppp,gprs)