Linux下Ping命令在内核中动态运行过程的跟踪与分析
董志超;王柄璇;倪光玉;鲁曈;荆琦
【摘 要】自由而开源的Linux日渐被人们所熟悉,而当今互联网产业飞速发展,使得Linux内核中网络部分源码被越来越多的人所关注.详细分析Linux新版本3.5.4内核的网络子系统的组织结构、功能和运行机制,通过建立ddd+ qemu+ busybox实验环境和Ping指令应用场景来追踪Ping指令在Linux内核中的动态运行过程,然后对ping指令的运行特点进行介绍和原因分析,揭示网络子系统在特定应用时的动态运行过程和静态分析调用流程的区别与联系.阐明网络子系统因应用而发展的特点,加深和拓宽对Linux网络子系统机制和发展的理解与思考.linux操作系统书籍
因为未正确注册jscript【期刊名称】《计算机应用与软件》
【年(卷),期】2015(032)007
【总页数】4页(P102-104,154)
【关键词】Linux内核;Linux网络;Ping指令;qemu
【作 者】int函数举例董志超;王柄璇;倪光玉;鲁曈;荆琦
【作者单位】北京大学软件与微电子学院 北京100871;北京大学软件与微电子学院 北京100871;北京大学软件与微电子学院 北京100871;北京大学软件与微电子学院 北京100871;北京大学软件与微电子学院 北京100871
【正文语种】中 文
【中图分类】TP393
0 引言
Linux 系统由于其自由而且源码开放的特点,日渐受到人们的认知和青睐,而当下互联网产业蓬勃发展,使得越来越多的人开始关注和学习Linux 内核网络部分的源码,并对其进行深入研究和优化。Linux 初学者可以通过阅读经典书籍来接触和学习经典内核版本中(如2.6 版本)Linux 网络子系统的整体结构和各个组成部分,同时也需要一些在内核中实际运行的案例和简单实用的实验环境以加深对内核网络子系统的理解。
以下首先对新版本Linux-3.5.4 内核网络子系统的整体架构、功能和运行机制进行详细介绍,然后搭建实验环境构造应用场景,跟踪和调试了Ping 指令在Linux 内核中的动态运行过程。通过和网络子系统静态的函数调用流程图进行对比,阐述了Ping 指令自身运行特点,解释说明了Ping 指令在Linux 内核动态运行过程的特点,加深对Linux 网络子系统的机制和应用的理解。
1 Linux 网络子系统简介
Linux 网络子系统的总体架构成功借鉴了OSI 七层网络协议栈架构和TCP/IP 协议四层结构[1-3],通过众多学者坚持不懈的研究和开发,适应了互联网的起步和发展过程中的应用需求,经历了一个从无到有,从简单到复杂的漫长过程。Linux 网络子系统的各种功能的实现分别在不同的时间,由不同的代码块完成。Linux-3.5.4 版本内核网络子系统的组织架构[4-8]可以自上而下表示为:系统调用接口层、协议无关接口层、网络协议层、网络接口层、设备驱动层,如图1 所示。
网络子系统被分成五层结构即五大模块,每个模块又可以细分为几个小模块,每个小模块中标注了一些实现功能的核心函数或数据结构。
广州校外培训机构停课其中,系统调用接口层给用户空间提供了正常访问内核的合法途径,用户可以提出网络应用需求,如接收或者发送数据等;协议无关接口层是由socket 来实现并提供一组通用函数来支持各种不同的协议,支持BSD socket 和INET socket 两种socket;网络协议层包含了Linux 所支持的多种网络协议,如TCP 协议、UDP协议和IP 协议等;网络接口层(网络设备接口层)将网络协议与具有很多各种不同功能的硬件设备连接在一起;网络设备驱动层是负责管理物理网络设备的设备驱动程序[5,6]。
Linux-3.5.4 版本内核的网络子系统中功能实现的核心函数及其静态函数调用流程如图2 所示。
图1 Linux-3.5.4 版本网络子系统分层结构图
图2 Linux-3.5.4 网络子系统核心函数调用流程图
网络子系统最基本、最重要的功能是发送和接收数据。由图2 中核心函数以及箭头表示的调用方向,以TCP 协议为例,网络子系统典型的发送和接收数据的工作过程可以描述如下[5-7]:
当网络子系统有TCP 操作响应,应用程序需要通过网络传输数据时,首先调用系统调用层sys_socketcall,开始创建一个socket,通过调用socket_create 等函数完成socket 创建,然后通过sys_connect,sys_bind,sys_listen 等实现socket 连接、绑定、监听等工作;进入到协议无关接口层,通过proto-->tcp_prot 创建和选定支持TCP 协议的通用函数接口;调用网络协议层的tcp_sendmsg-->ip_queue_xmit-->ip_output 进行数据包的TCP 封装、IP 封装;进入网络接口层,将数据包封装成帧类型,由dev_queue_xmit 交给下一层;网络设备驱动层通过数据结构net_device 和ndo_start_xmit 之间的指针操作管理网卡将数据帧发送出去。
当网络子系统接收数据包时,首先由硬件中断触发开始,网络设备驱动层通过net_device 和ndo_start_xmit 管理网卡将接收到的帧传递至网络接口层的netif_rev_skb,完成对帧数据的解析后,进入到网络协议层,经过IP 分组解析完毕数据,由ip_local_deliver 指向TCP 协议的接收队列tcp_v4_rcv,应用程序可以通过系统调用sys_sys_recfrom-->sys_recvmsg-->tcp_recvmsg流程从TCP 的接收队列里面接收数据。
2 实验环境和应用场景
Ping 指令是同时存在于Window 环境和Linux 环境,通常用于网络连接成功与否的测试,同时也可以帮助我们分析和研究网络故障。最简单的应用格式:ping IP 地址,该命令还可以加许多参数使用。
通过ddd+qemu+busybox 这个工具套件搭建实验环境,来跟踪和调试Ping 指令在Linux 内核中的运行过程:利用qemu 模拟Linux 内核的真实工作状态,使用busybox 集成的常见Linux命令,用ddd 进行程序调试。
c语言string什么意思在ddd+qemu+busybox 的实验环境中,在qemu 虚拟出来的内核环境中Ping 目标主机127.0.0.1,目的是首先通过Ping指令,贯穿了Linux 网络系统的整体架构,将信息发送到目标主机;同时qemu 又会收到目标主机的回复信息,接收回复信息的时候,又会贯穿整个Linux 整体架构,这样从发送数据和接收数据两条主线,可以将Linux 网络系统很好的贯穿起来,能够很好地体现验证环境的真实性和内核工作的动态性。
3 实验过程和结果
在ddd 调试窗口插入数个断点如下:
插入断点是为了更有效率地跟踪Ping 指令的运行过程,此外上述断点的设置目的也可以分为两种:一种断点是为了验证Ping 指令运行过程会经过此类断点——说明运行过程经历了该断点所处的某段分支,如sys_socketcall(),ip_push_pending _frames()等;一种断点是为了验证Ping 指令不会通过此类断点或者暂时不确定是否通过此类断点——说明运行过程未经历该段分支或者解答Ping 指令运行过程中的疑问,如tcp_transmit _skb(),udp_rcv(),e1000_xmit_frame(),e1000_intr()等。通过ddd 提供的continue、step、next、step instruction 和next instruction 等几种不同的单步调试方式来实时跟踪和调试Ping 指令在内核的实时运行。
实验环境搭建完毕后,首先连接ddd 和qemu:qemu 切换至控制台状态后输入“gdbserver tcp::1234”,gdb 的命令行中输入“target remote localhost:1234”。在qemu 中输入指令“ping–c 1 127.0.0.1 ”。-c 1 参数表示只给目标主机发送一个数据包。然后在ddd 窗口对Ping 指令的运行过程进行跟踪和调试,各个断点的通过情况和通过顺序如表1 所示(表中上下顺序代表断点通过的顺序)。
爱心代码java表1 断点通过顺序和解释说明
续表1
通过以上步骤,针对我们所感兴趣的范围,可以简略做出Ping 指令在Linux-3.5.4 版本内核中的动态运行过程简图,如图3 所示。
图3 Ping 指令运行过程简图
图3 是Ping 指令运行过程中比较重要的部分,其描述如下:
(1)创建socket 过程,创建成功后,socket 选项设置、socket绑定等过程;
(2)准备工作完成后,系统调用sys_sendto,开始发送数据包;
(3)从ip_push_pending_frames-->ip_output-->dev_queue_xmit-->……是数据包在网络子系统自顶向下的传递发送过程;从netif_rev_skb-->ip_rcv-->ip_local_deliver-->icmp_rcv 是数据包在网络子系统自下向上的传递接收过程;在本次实验中,这个过程循环了2 次,即:从ip_push_pending_frames-->……-->icmp_rcv 一次循环结束后马上进行第二次ip_push_pending_frames-->……-->icmp_rcv 循环;
(4)从icmp_rcv-->ping_rcv 只调用了一次;
(5)系统调用sys_recvfrom 从ping_rcv 中提取数据包,共调用了2 次。
4 实验结果分析
(1)在TCP 协议和UDP 协议的发送和接收的重要函数位置设置了断点,这些断点都没有被捕捉到,说明Ping 指令没有使用TCP 和UDP 协议,这点符合预测,因为Ping 使用的是ICMP 协议[9,10]。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论