linux内核网络协议栈分层及各层之间的传递解析
我在linux内核中是如何实现网络数据的发送的(一)这两篇文章中较为细致的解析了一包网络数据如何从应用层到内核再到网口发送的。但这两篇文章属于对数据流动路程的梳理,虽较为详细,但无法清晰的看出Linux内核中网络协议栈中对数据分层处理的思想,所以本篇文章便是基于上两篇文章,从数据分层处理的角度,对Linux内核中网络数据传输处理进行解析,因这篇文章主要是解释各层之间的数据处理的,所以数据从各层之间的跳转便不再详细分析,有疑问的读者可参考《linux内核中是如何实现网络数据的发送的(一)》中的详细分析。我们仍然从应用层的sendto函数为起点,来分析用户要发送的一包数据是如何经过层层处理,最终发送到网口的。一:socket接口层首先sendto函数经系统调用,进入内核态,调用了内核中net\socket.c文件的sys_sendto函数,原型是SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len)在此处我们就进入了内核网络协议栈的socket接口层,这层主要是连接用户空间和内核空间的桥梁,用户空间的很多函数接口经系统调用,首先就是执行的这一层的函数。在这一层中函数的调用关系如下sys_sendto--sock_sendmsg--sock_sendmsg_nosec--sock-ops-sendmsg,这些函数主要是执行安全策略检测,数据的初步封装。二:传输层sock-ops-sendmsg便是传输层中的raw_sendmsg函数,此函数位于net\ipv4\raw.c文件中,至此我们便从socket层进入传输层,在这一层中,raw_sendmsg函数经历的调用关系如下:raw_sendmsg--raw_send_hdrinc--skb-dst-output在这一层中,实现了IP数据合法性检测,确认数据发送的源地址、目的地址、ip选项、路由路径、发送接口等关键数据的处理,并构建skb结构体,用于下一层函数的处理。三:网络层通过linux内核中是如何实现网络数据的发送的(一)中的分析,我们知道skb-dst-output指向了net\ipv4\ip_output.c文件中ip_output函数,到此处我们便进入了网络层的处理。在此层中,函数的调用关系如下:ip_output--ip_finish_output--ip_finish_output2--dst_neigh_output--neigh_hh_output--dev_queue_xmit(net\core\dev.c)--__dev_queue_xmit--__dev_xmit_skb--sch_direct_xmit(net\sched\sch_generic.c)--dev_hard_start_xmit(net\core\dev.c)--xmit_one-netdev_start_xmit-__netdev_start_xmit(include\linux\netdevice.h)--ops-ndo_start_xmit.上述调用路径较长,是决定前期构造的数据报文最终流向的一系列流程,经过上述流程的处理,数据流确定的最终调用哪个网口驱动接口进行网络数据的发送,也就是最终ops-ndo_start_xmit指向的函数。四:数据链路层在《linux内核中是如何实现网络数据的发送的(二)》这篇文章中我们以nxp公司的imx6q系列芯片为例子,可以确定出ops-ndo_start_xmit最终指向的是drivers\net\ethernet\freescale\fec_main.c文件中的fec_enet_start_xmit函数,至此我们便进入到了网络协议栈中的数据链路层或者说是网口驱动层,在此层面中的fec_enet_start_xmit函数,就会将我们的网络数据报文,通过控制芯片的网口控制器的寄存器,将数据转换为物理信号,发
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2573356.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!