linux下 ppp 4G模块拨号上网与解析

目录

一、ppp协议是什么?

二、linux下的ppp

2.1ppp安装

2.2ppp架构

三、4G模块拨号

3.1硬件准备

3.2软件准备

3.3编写拨号脚本

四、开始拨号


一、ppp协议是什么?

PPP(Point-to-Point Protocol点到点协议)是为在同等单元之间传输数据包这样的简单链路设计的数据链路层协议。这种链路提供全双工操作,并按照顺序传递数据包。其上有ip协议等网络层,下有串口等物理层。发送数据时, TCP/IP数据包经过PPP打包之后经过串口发送。接收数据时,从串口上来的数据经PPP解包之后上报给TCP/IP协议层。设计目的主要是用来通过拨号专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。

二、linux下的ppp

2.1ppp安装

①直接安装

sudo apt-get install ppp

②源码编译

ppp官网下载地址:https://download.samba.org/pub/ppp/

解压:(以ppp-2.4.7版本为例)

tar -xzvf ppp-2.4.7.tar.gz ppp-2.4.7/        

编译:

./configure
make

不推荐源码编译ppp,因为在ppp协议中有许多固定路径,如/etc/ppp/options(选项路径)、/etc/ppp/peers(拨号设置路径)等

注:执行pppd需要root权限

  

2.2ppp架构

2.2.1

应用层:pppd、网络应用程序、pppoe

①pppd(安装ppp后获取的程序)

PPP 协议不只是提供了简单的数据链路层功能,它还提供了诸如鉴权(如PAP/CHAP),数据压缩/解压(如CCP)和数据加密/解密(如ECP)等扩展功能。应用程序要求使用透明化,不关心这些扩展功能的存在,而反过来,PPP协议处理模块本身又无法处理这些策略性的东西,因为它不知道用户名/密码,不知道是否要进行压缩,不知道是否要进行加密。

于是pppd出现了,负责PPP协议的具体配置,如MTU、拨号模式、认证方式、认证所需用户名/密码等。它和pppoe两个用户态应用程序配合起来,可以完成ppp的拨号上网的链路协商及维护。pppd是一个后台服务进程(daemon),是一个用户空间的进程,所以把策略性的内容从内核的PPP协议处理模块移到pppd中是很自然的事了。pppd实现了所有鉴权、压缩/解压和加密/解密等扩展功能的控制协议。pppd只是一个普通的用户进程,它如何扩展PPP协议呢?这就是pppd与内核中的PPP协议处理模块之间约定了,它们之间采用了最传统的内核空间与用户空间之间通信方式:设备文件/dev/ppp%n(下文介绍该设备文件的工作)。

pppd中还有一个重要的辅助工具:chat,chat用来与GSM模组建立会话。它的实现比较简单,它向串口发送AT命令,建立与GSM模组的会话,以便让PPP协议可以在串口上传输数据包

②网络应用程序

比如上网、下载等。主要作用是描述普通数据包的行走路径

③PPPOE

PPPOE协议是基于PPP协议的协议,在PPPOE应用程序中并没有将PPP协议实现,PPP协议是由PPPD这个用户空间程序实现的,PPPOE程序只实现PPPOE协议部分代码,在适当的时候PPPD程序进行PPP协议。

首先,pppoe完成了PPPoE Discovery过程,这个过程很简单,只有PADI/PADO, PADR/PADS四个包.主要目的是相互告知MAC地址。

另外,这个程序负责接收和发送Pppoe链路的所有数据包,包括ppp协议过程的数据包,也包括正常网络应用通过网络接口ppp发送的TCP/IP数据包。

所以,我们可以将pppoe应用程序作为拨号链接进入主机的入口,所有的数据包都经由它进入主机。

2.2.2

内核层:/dev/ppp%n、TCP/IP协议栈、Socket、PPP协议栈、PTY设备、ETH1

①/dev/ppp%n

该设备文件通过read系统调用,pppd可以读取PPP协议处理模块的数据包,当然,PPP协议处理模块只会把应该由pppd处理的数据包发给pppd。通过 write系统调用,pppd可以把要发送的数据包传递给PPP协议处理模块。通过ioctrl系统调用,pppd可以设置PPP协议的参数,可以建立/ 关闭连接。

②TCP/IP协议栈

普通TCP/IP协议栈

③Socket

pppoe Sessiopn和Discovery数据包对应的以太网类型分别为0x8863/0x8864,因为这两种类型的数据包是由Pppoe应用程序通过Socket来收发的,所以内核中需要定义这两种类型的Socket。这两个Socket内核处理非常简单,只做了最基本的检查便由Pppoe收取上来。

④PPP协议栈

主要负责PPP层数据的封装、压缩与解压缩等。另外,它还对普通数据包和ppp过程的数据包进行了分流,将普通数据包提交到TCP/IP协议栈,而将Ppp过程的数据包放到/dev/ppp设备队列中,等待pppd去收取并处理。

⑤PTY设备

串行设备,PPP内核协议栈与pppoe应用程序的中转站。因为ppp协议早多运行在串行链路上,所以在Linux内核中PPP协议栈与串行设备结合紧密。

⑥ETH1

指连接以太网的出口,用来表示数据包路径而引入。

2.2.3

物理层:以太网口

三、4G模块拨号

3.1硬件准备

树莓派、EC20 4G模块、电话卡

3.2软件准备

安装好ppp相关驱动,pppd

3.3编写拨号脚本

已知pppd位于 /usr/sbin  , chat 位于 /usr/sbin  , options 位于 /etc/ppp 。

要编写脚本,就要切换目录到 /etc/ppp/peers,若没有peers目录则自行创建。因为是在/etc目录之下,需要使用sudo或者进入root模式才能创建或者编辑。安装ppp时,pppd就已经被固定到系统路径 /etc/ppp 找options, 到 /etc/ppp/peers 找脚本文件。可到ppp源码 ppp-2.4.7/pppd 下找pathnames.h 修改,如图:

 ①rasppp

sudo vim rasppp
# /etc/ppp/peers/rasppp

# Usage: sudo pppd call rasppp

# 连接调试时隐藏密码
hide-password

# 该手机不需要身份验证
noauth

# 用于呼叫控制脚本
connect '/usr/sbin/chat -s -v -f /etc/ppp/peers/rasppp-chat-connect'

# 断开连接脚本
disconnect '/usr/sbin/chat -s -v -f /etc/ppp/peers/rasppp-chat-disconnect'

# 调试信息
debug

# 4G模块
/dev/ttyUSB4

# 串口波特率
115200

# 使用默认路由
defaultroute

# 不使用默认IP
noipdefault

# 不使用PPP压缩
novj
novjccomp
noccp
ipcp-accept-local
ipcp-accept-remote
local

# 最好锁定串行总线,创建一个锁定文件,其他程序在发现存在这个文件后,就能得知相应的串口已经被使用。
lock
dump

# 保持pppd连接到终端
nodetach

# 用户名 密码
user ctnet@mycdma.cn
password vnet.mobi
#电信需要用户名和密码,移动、联通拨号不需要,下文给出不同运营商的配置

# 硬件控制流
crtscts
remotename 3gppp
ipparam 3gppp

# 使用服务器端协商的DNS就可以设置参数usepeerdns
usepeerdns


更多拨号设置可移步pppd命令使用详解 - 百度文库 (baidu.com)

②rasppp-chat-connect

sudo vim rasppp-chat-connect
# 连续15秒,收到以下字符,则退出执行
# 进行超时控制,增加对特殊情况的处理,加入下面字段
TIMEOUT 15  
ABORT   "BUSY"
ABORT   "ERROR"
ABORT   "NO ANSWER"
ABORT   "NO CARRTER"
ABORT   "NO DIALTONE"

#一个chat脚本都是由字符串对来组成的。前面的字符串都是期望获取的串,紧跟的是发送的字符串
# 例如 ""AT,不管收到什么字符串,先发出字符串AT
#      OK \rATZ,发送ATZ,希望收到的是OK
""AT
OK \rATZ

# 建立连接,电信为空,下文给出各运营商配置
OK \rAT+CGDCONT=1,"IP",""

# 拨号,#777是电信的拨号号码
OK-AT-OK ATDT#777
CONNECT \d\c

③rasppp-chat-disconnect

sudo vim rasppp-chat-disconnect
ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "\NSending break to the modem\n"

""\k"

#挂断电话
""+++ATH"
SAY "\nGood bye !\n"

④各运营商拨号上网相关设置

四、开始拨号

sudo pppd call rasppp

此时可以使用ctrl+z放到后台运行,但是不能使用ctrl+c终止拨号。也可以切换到其他窗口继续其他操作。

以上流程成功后,会由电信或移动或联通的基站分配一个IP地址作为自己的客户端地址,接下来按照如下流程建立客户端与服务端的连接。(相当于把当前客户端变成一个远端服务器的主机)

(1)socket(int domain,int type,int protocol);

该函数建立新的socket,以建立一个新的通信端口并获得文件描述符。

(2)connect(int sockfd,struct sockaddr *address,size_t address_len);

当调用socket建立传输端口后,调用connect函数建立与远程服务器相连的连接线路。

(3)recv(int sockfd,void *buf,int len,unsigned int flags);

该函数用于接收从套接口传来的信息,socket用connect连接的套接口

(4)Base64_Code();

对登陆信息或附件内容进行加密

(5)send(int sockfd,const void *msg,int len,unsigned int flags);

该函数是用来通过套接口向其它程序传递数据的。

查看网卡

ifconfig

可以看到此时多了一个ppp0网卡,这其实是pppd模拟出来的一个虚拟网卡。

 查看路由表

route

 ppp0还不是默认路由

添加默认路由

sudo route add gw ip(ppp0的ip)

指定网卡上网

 ping -I 网卡 域名

ppp 4G模块拨号上网配置完成,ctrl+c 结束进程或者重启树莓派ppp0网卡就会消失。

博客参考:

linux pppd脚本配置(转载)_wsclinux的博客-CSDN博客_linux pppd命令

​​​​​​实现4G模块EC20在树莓派系统下的PPP拨号上网_XiaoCheng'Blog的博客-CSDN博客

  • 8
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值