资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
1ppp/pppd/chat 关系及数据收发流程参考: http:/blog.csdn.net/absurd 李先静一、 协议相关介绍 PPP(Point-to-Point Protocol 点到点协议)是为在同等单元之间传输数据包这样的简单链路 设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据包。设计目的主要是 用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之 间简单连接的一种共通的解决方案。链路控制协议 LCP(Link Control Protocol) ; 网络控制协议 NCP(Network Control Protocol) ; 认证协议:口令验证协议 PAP(Password Authentication Protocol)和挑战握手验证协议 CHAP(Challenge-Handshake Authentication Protocol) 。 2LCP 协商,协商内容包括除 RFC1661 中所定义的选项之外,还要考虑 PPPOA 和 PPPOE 协议中规定的内容。 LCP 协商过后就到了 Establish 阶段,开始 PAP 或 CHAP 认证。PAP 为两次握手认证,口 令为明文。PAP 认证过程如下:发送用户名同口令到认证方,认证方查看是否有此用户, 口令是否正确,然后发送相应的响应。CHAP 为三次握手认证,口令为密文(密钥) CHAP 认证由认证方发送一些随机产生的报文,交给被认证,被认证方用自己的口令字用 MD5 算法进行加密,传回密文,认证方用自己保存的口令字及随机报文用 MD5 算法加密, 比较二者的密文,根据比较结果返回响应的响应。 认证成功即进行 Network 阶段协商(NCP) ,在 IP 接入中主要是 IPCP 协商(如 IP 地址和 DNS 地址的协商等) 。任何阶段的协商失败都将导致链路的拆除。 协商成功,则链路建立成功,可以开始传输网络层数据报文。 PPPoE(PPP over Ethernet) ,PPPoA(PPP over ATM)二、应用关系 IP 协议等网络层 TCP/IP PPP 协议(PPPD 协助) PPP 以太网和串口等物理层 串口pppd 是一个后台服务进程(daemon),是一个用户空间的进程,所以把策略性的内容从内核 的 PPP 协议处理模块移到 pppd 中是很自然的事了。pppd 实现了所有鉴权、压缩/解压和加 密/解密等扩展功能的控制协议。pppd 是一个普通的用户进程,pppd 与内核中的 PPP 协议处理模块之间采用最传统的内核 空间与用户空间之间通信方式:设备文件;设备文件名是/dev /ppp。通过 read 系统调用, pppd 可以读取 PPP 协议处理模块的数据包,当然,PPP 协议处理模块只会把应该由 pppd 处理的数据包发给 pppd。通过 write 系统调用,pppd 可以把要发送的数据包传递给 PPP 协 议处理模块。通过 ioctrl 系统调用,pppd 可以设置 PPP 协议的参数,可以建立/关闭连接。在 pppd 里,每种协议实现都在独立的 C 文件中,它们通常要实现 protent 接口,该接口主 要用于处理数据包,和 fsm_callbacks 接口,该接口主要用于状态机的状态切换。数据包的 接收是由 main.c: get_input 统一处理的,然后根据协议类型分发到具体的协议实现上。而数 据包的发送则是协议实现者根据需要调用 output 函数完成的。chat 是 pppd 所带一个辅助工具。chat 用来与 GSM 模组建立会话。它的实现比较简单,它 向串口发送 AT 命令,建立与 GSM 模组的会话,以便让 PPP 协议可以在串口上传输数据 包。3三、数据收发流程 应用程序通过 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 把数据发送串口。1.用户数据发送过程如下所示:应用程序 pppd| | |socket /dev/ppp| | |PPP 协议模块4|tty|GSM 模组2.pppd 的控制协议数据发送过程: pppd -Pap/chap/eap(etc) /dev/ppp PPP 协议模块 tty GSM 模组3.接收数据流程: ppp_async.c 在初始化时(ppp_async_init),调用 tty_register_ldisc 向 tty 注册了行规程处理接 口,也就是一组回调函数,当串口 tty 收到数据时,它就会回调 ppp_ldisc 的 ppp_asynctty_receive 函数接收数据。ppp_asynctty_receive 调用 ppp_async_input 把数据 buffer 转换成 sk_buff,并放入接收队列 ap-rqueue 中。ppp_async 另外有一个 tasklet(ppp_async_process)专门处理接收队列 ap-rqueue 中的数据包, ppp_async_process 一直挂在接收队列 ap-rqueue 上,一旦被唤醒,它就调用 ppp_input 函 数让 PPP 协议处理模块处理该数据包。在 ppp_input 函数中,数据被分成两路,一路是控制协议数据包,放入 pch-file.rqb 队列, 交给 pppd 处理。另外一路是用户数据包,经 ppp_do_recv/ppp_receive_frame 进行 PPP 处理 之后,再由 netif_rx 提交给上层协议处理,最后经 socket 传递到应用程序。应用程序 pppd| |5| |socket /dev/ppp| | |PPP 协议模块|tty|GSM 模组
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号