LinuxPPP数据收发流程_第1页
LinuxPPP数据收发流程_第2页
LinuxPPP数据收发流程_第3页
LinuxPPP数据收发流程_第4页
LinuxPPP数据收发流程_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PPP(Point-to-Point)提供了一种标准的方法在点对点的连接上传输多种协议数据包,它最常见的用途可能是传统的拨号上网了(据说现在的宽带接入也有采用PPPOE方式的)。在LinuxMobilePhone上,网络应用程序使用PPP作为与GSM模组之间的通信协议,最近遇到了一点关于PPP的麻烦,所以花了点时间去研究它。PPP协议肯定不是最复杂的网络协议,不过pppd、chat、tty、socket、ccp、chap、pap、eap、ecp、ipcp和很多其它概念搅在一起之后,谁都会被搞得晕头转向。我关心的其实是PPP协议中各个实体之间的协作关系,而不是协议的状态转换或者服务的配置,由于没

2、有找到这方面的资料,只好去读RFC,内核、pppd和一些网络工具的代码。PPP协议提供两个实体之间的数据链路连接的建立、维持和释放,负责流量和差错控制等等功能,所以它应该是属于数据链路层协议的。PPP协议之下是以太网和串口等物理层,之上是IP协议等网络层。这里,对于下层,我们只讨论串口的情况,对于上层,我们只讨论TCP/IP的情况。发送时,TCP/IP数据包经过PPP打包之后经过串口发送。接收时,从串口上来的数据经PPP解包之后上报给TCP/IP协议层。网络协议是分层实现的,上层一般只需要知道其直接下层,只有在极少数据情况才使用间接下层的接口。比如,彩信、浏览器和邮件等应用程序使用socket

3、接口编程,它们只需要知道TCP/IP协议,而无需要知道PPP协议的存在。这种分层设计简化了协议的实现和应用程序的开发。问题来了:PPP协议不只是提供了简单的数据链路层功能,它还提供了诸如鉴权(如PAP/CHAP),数据压缩/解压(如CCP)和数据加密/解密(如ECP)等扩展功能。应用程序要求使用透明化,不关心这些扩展功能的存在,而反过来,PPP协议处理模块本身又无法处理这些策略性的东西,因为它不知道用户名/密码,不知道是否要进行压缩,不知道是否要进行加密。怎么办?如何在对应用程序透明的情况下使用扩展功能呢?上帝说,这个问题必须解决!于是pppd就出现了。pppd是一个后台服务进程(daemon

4、),是一个用户空间的进程,所以把策略性的内容从内核的PPP协议处理模块移到pppd中是很自然的事了。pppd实现了所有鉴权、压缩/解压和加密/解密等扩展功能的控制协议。pppd只是一个普通的用户进程,它如何扩展PPP协议呢?这就是pppd与内核中的PPP协议处理模块之间约定了,它们之间采用了最传统的内核空间与用户空间之间通信方式:设备文件。设备文件名是/dev/ppp。通过read系统调用,pppd可以读取PPP协议处理模块的数据包,当然,PPP协议处理模块只会把应该由pppd处理的数据包发给pppd。通过write系统调用,pppd可以把要发送的数据包传递给PPP协议处理模块。通过ioctr

5、l系统调用,pppd可以设置PPP协议的参数,可以建立/关闭连接。在pppd里,每种协议实现都在独立的C文件中,它们通常要实现protent接口,该接口主要用于处理数据包,和fsm_callbacks接口,该接口主要用于状态机的状态切换。数据包的接收是由main.c:get_input统一处理的,然后根据协议类型分发到具体的协议实现上。而数据包的发送则是协议实现者根据需要调用output函数完成的。chat是pppd所带一个辅助工具。呵,它和xchat不是一个类型的,xchat用来与人聊天,而chat用来与GSM模组建立会话。它的实现比较简单,它向串口发送AT命令,建立与GSM模组的会话,以便

6、让PPP协议可以在串口上传输数据包。应用程序通过socket接口发送TCP/IP数据包,这些TCP/IP数据包如何流经PPP协议处理模块,然后通过串口发送出去呢?pppd在make_ppp_unit函数中调用ioctrl(PPPIOCNEWUNIT)创建一个网络接口(如pppO),内核中的PPP协议模块在处理PPPIOCNEWUNIT时,调用register_netdev向内核注册ppp的网络接口,该网络接口的传输函数指向ppp_start_xmit。当应用程序发送数据时,内核根据IP地址和路由表,找到ppp网络接口,然后调用ppp_start_xmit函数,此时控制就转移到PPP协议处理模块

7、了。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函数调用t

8、ty-driver-write把数据发送串口。用户数据发送过程如下图所示:pppd的控制协议数据发送过程如下图所示:反过来,接收数据的情形又是如何的?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处理。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论