当前位置: 首页 > news >正文

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.jsqmd.com/news/734494/

相关文章:

  • 如何用FlyOOBE终极方案突破Windows 11硬件限制:完整系统定制指南
  • AutoSubs终极指南:3分钟掌握本地AI字幕生成,视频制作效率提升300%
  • Spring AI 代理模式 Spring AI Agentic Patterns —— Spring AI (Part 1): Agent Skills
  • B站缓存视频转换完整指南:3分钟学会m4s无损转MP4
  • BilibiliDown音频提取技术方案:专业级无损音乐下载与批量处理实战
  • 5分钟本地化视频字幕提取:87种语言支持,完全免费的专业级解决方案
  • YOLOv13涨点改进| AAAI 2026 | 独家创新首发、Conv卷积改进篇 |引入SAMC结构感知多上下文模块,通过结构和语义特征的融合、多尺度学习,助力目标检测,图像分割,图像增强,涨点通用
  • Inkscape光线追踪插件终极指南:5分钟学会专业光路图绘制
  • Laravel 12升级后AI中间件突然失效?——深度解析HTTP/3兼容性断点、PSR-18适配器陷阱及向后兼容迁移路线图
  • Jiayan古汉语NLP工具包:解锁文言文数字化的终极解决方案
  • 体验Taotoken多模型聚合在应对单一服务波动时的路由容灾效果
  • 手把手教你用Vector Davinci配置AutoSar NVM队列与回调(附代码示例)
  • 2-4 年到 4-6 年的跃迁动作清单——抓住数据人的窗口期
  • 3分钟搭建可视化数据库:NocoDB让数据管理像Excel一样简单
  • 如何高效获取网盘直链:LinkSwift开源工具深度解析
  • wechatapi iPad协议:私域API底层优化实录
  • ROS2 Humble下用Python写Action服务,比C++简单多少?一个完整案例带你避坑
  • YOLOv13涨点改进| TGRS 2026 | 全网独家首发、Neck特征融合改进篇 | 引入CAFM跨语义自适应滤波融合模块,有效挖掘浅层特征中的细粒度信息,增强红外小目标检测涨点、抑制背景噪声
  • 打卡信奥刷题(3195)用C++实现信奥题 P8102 「LCOI2022」 Cow Insertion
  • 通过Taotoken用量看板分析并优化大模型API调用策略
  • 【Ubuntu使用BUG】解决使用 Ubuntu to go 换机后 NVIDIA 驱动失效
  • 大语言模型评估新方法TrustJudge解析与应用
  • Fedora 43 通过DNF命令升级Fedora 44实战操作保姆级教程
  • 2026年3月透光石生产厂家推荐,树脂饰面板/防火树脂板/透光板/夹丝板/液态金属板/透光石/夹植物板,透光石厂商找哪家 - 品牌推荐师
  • Docker 27存储驱动“静默卡死”故障(无OOM无报错):从page cache锁竞争到blk-mq调度器瓶颈的全链路追踪
  • 终极系统优化指南:使用FlyOOBE全面掌控Windows性能
  • FPGA加速LLM推理:LUT技术实现低延迟与高能效
  • 3分钟掌握B站缓存视频永久保存技巧:m4s转MP4完整教程
  • 打卡信奥刷题(3196)用C++实现信奥题 P8103 「LCOI2022」 Cow Merger
  • EVK-IRIS-W101,集成Wi-Fi 6双频与蓝牙5.3的开CPU多无线电评估套件