从网络设备驱动程序的结构分析可知,Linux网络子系统在发送数据包时,会调用驱动程序提供的hard_start_transmit()函数,该函数用于启动数据包的发送。在设备初始化的时候,这个函数指针需被初始化以指向设备的xxx_tx ()函数。
网络设备驱动完成数据包发送的流程如下。
1)网络设备驱动程序从上层协议传递过来的sk_buff参数获得数据包的有效数据和长度,将有效数据放入临时缓冲区。
2)对于以太网,如果有效数据的长度小于以太网冲突检测所要求数据帧的最小长度ETH ZLEN,则给临时缓冲区的末尾填充0。
3)设置硬件的寄存器,驱使网络设备进行数据发送 *** 作
这里特别要强调对netif_ stop_queue()的调用,当发送队列为满或因其他原因来不及发送当前上层传下来的数据包时,则调用此函数阻止上层继续向网络设备驱动传递数据包。当忙于发送的数据包被发送完成后,在以TX结束的中断处理中,应该调用netif_wake_queue ()唤醒被阻塞的上层,以启动它继续向网络设备驱动传送数据包。当数据传输超时时,意味着当前的发送 *** 作失败或硬件已陷入未知状态,此时,数据包发送超时处理函数xxx _tx _timeout ()将被调用。这个函数也需要调用由Linux内核提供的netif_wake _queue()函数以重新启动设备发送队列。
本文将介绍在Linux系统中, 数据包是如何一步一步从网卡传到进程手中的 以及 数据包是如何一步一步从应用程序到网卡并最终发送出去的 。
如果英文没有问题,强烈建议阅读后面参考里的文章,里面介绍的更详细。
本文只讨论以太网的物理网卡,不涉及虚拟设备,并且以一个UDP包的接收过程作为示例
网卡需要有驱动才能工作,驱动是加载到内核中的模块,负责衔接网卡和内核的网络模块,驱动在加载的时候将自己注册进网络模块,当相应的网卡收到数据包时,网络模块会调用相应的驱动程序处理数据。
下图展示了数据包(packet)如何进入内存,并被内核的网络模块开始处理:
软中断会触发内核网络模块中的软中断处理函数,后续流程如下
由于是UDP包,所以第一步会进入IP层,然后一级一级的函数往下调:
应用层一般有两种方式接收数据,一种是recvfrom函数阻塞在那里等着数据来,这种情况下当socket收到通知后,recvfrom就会被唤醒,然后读取接收队列的数据;另一种是通过epoll或者select监听相应的socket,当收到通知后,再调用recvfrom函数去读取接收队列的数据。两种情况都能正常的接收到相应的数据包。
了解数据包的接收流程有助于帮助我们搞清楚我们可以在哪些地方监控和修改数据包,哪些情况下数据包可能被丢弃,为我们处理网络问题提供了一些参考,同时了解netfilter中相应钩子的位置,对于了解iptables的用法有一定的帮助,同时也会帮助我们后续更好的理解Linux下的网络虚拟设备。
ndo_start_xmit会绑定到具体网卡驱动的相应函数,到这步之后,就归网卡驱动管了,不同的网卡驱动有不同的处理方式,这里不做详细介绍,其大概流程如下:
在网卡驱动发送数据包过程中,会有一些地方需要和netdevice子系统打交道,比如网卡的队列满了,需要告诉上层不要再发了,等队列有空闲的时候,再通知上层接着发数据。
linux下配置网络步骤方法:
配置动态IP
1、在终端命令窗口中输入setup,就会d出如下窗口。
[root@wgods ~]# setup
2、选择Network Configuration,点击enter进入下面界面。
3、选择Edit Devices选项进入下面界面
4、点击enter,选项进入下面界面,按Tab键在选项间切换,选择Use DHCP后,按下空格键,就会出现[],然后点击OK键。注意:有时候在Name或Device选项不小心,让eth0多了空格,就会造成配置出问题,此时要检查一下/etc/sysconfig/network-scripts/ifcfg-eth0配置文件,才能发现问题。否则这种细节问题会纠结很久的。
:
1、网卡上面装有处理器和存储器(包括RAM和ROM)。网卡和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的。而网卡和计算机之间的通信则是通过计算机主板上的I/O总线以并行传输方式进行。因此,网卡的一个重要功能就是要进行串行/并行转换。由于网络上的数据率和计算机总线上的数据率并不相同,因此在网卡中必须装有对数据进行缓存的存储芯片。
2、在安装网卡时必须将管理网卡的设备驱动程序安装在计算机的 *** 作系统中。这个驱动程序以后就会告诉网卡,应当从存储器的什么位置上将局域网传送过来的数据块存储下来。网卡还要能够实现以太网协议。
3、网卡并不是独立的自治单元,因为网卡本身不带电源而是必须使用所插入的计算机的电源,并受该计算机的控制。因此网卡可看成为一个半自治的单元。当网卡收到一个有差错的帧时,它就将这个帧丢弃而不必通知它所插入的计算机。当网卡收到一个正确的帧时,它就使用中断来通知该计算机并交付给协议栈中的网络层。当计算机要发送一个IP数据包时,它就由协议栈向下交给网卡组装成帧后发送到局域网。
4、随着集成度的不断提高,网卡上的芯片的个数不断的减少,虽然各个厂家生产的网卡种类繁多,但其功能大同小异。
参考资料:百度百科:网卡
你用SOCK_RAW的模式建立原始套接字然后接收包。
剩下的就全是分析内容的事情了。。。。最多再用一下多线程。
用到linux下socket编程的最基本知识, 以及对网络协议细节的了解。 前者随便找本socket编程的书就很详细了, 后者你因该懂。
——————
例如, 你需要include以下这些头:
stdioh,stdlibh, unistdh, sys/socketh, sys/typesh, netinet/if_etherh, netinet/inh,
然后建立socket的时候用
socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP)),这样就能用这个socket来监听以太网的包。
然后循环调用recvfrom函数来听这个socket的接受到的数据, 再分析就好了。
如果要嗅探别人机器的包, 就要用ARP欺骗了。。呵呵
linux关闭以太网才能连无线是你的网络设置有问题,与 *** 作系统没有关系
Linux,全称GNU/Linux,与Windows *** 作系统一样,是属于计算机 *** 作系统之一,
Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX *** 作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的 *** 作系统
所以,linux关闭以太网才能连无线,是你的网络设置有问题,与 *** 作系统没有关系
以上就是关于Linux 数据发送流程全部的内容,包括:Linux 数据发送流程、Linux网络 - 数据包在内核中接收和发送的过程(转)、如何配置Linux网卡等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)