0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux网络协议栈的实现

望获Linux 来源:jf_20082045 作者:jf_20082045 2024-09-10 09:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

网络协议栈是操作系统核心的一个重要组成部分,负责管理网络通信中的数据包处理。在 Linux 操作系统中,网络协议栈(Network Stack)负责实现 TCP/IP 协议簇,处理应用程序发起的网络请求并与底层的网络硬件进行交互。本文将深入探讨 Linux 网络协议栈的架构与实现,涵盖数据包处理流程、关键模块、协议栈层次以及性能优化等方面。


网络协议栈架构

Linux 网络协议栈采用分层架构,与 OSI(Open Systems Interconnection)模型类似,分为以下几个主要层次:

应用层:应用程序通过系统调用访问网络,如 send() 和 recv()。有些应用层协议,例如NFS,就在内核直接处理了。
传输层:处理端到端的通信,如 TCP 和 UDP 协议以及ICMP协议。
网络层:负责路由和数据包转发,主要协议是 IP。
数据链路层:负责局域网内的数据传输,如 Ethernet 协议。
物理层:最终数据通过网络接口卡(NIC)发送到物理介质上。

Linux 的网络协议栈通过内核的多层模块化设计,实现了对不同网络协议的支持。这种模块化设计不仅提升了系统的灵活性和扩展性,也方便了内核开发者对协议栈进行维护与扩展。


网络协议栈的分层实现

Linux 内核通过各个子模块和协议栈层之间的相互协作,完成网络通信任务:

Socket 层:Socket 是用户态与内核通信的接口,应用程序通过 Socket API 与网络协议栈交互。Socket 实际上是一个抽象层,它将不同协议的实现封装起来,向用户提供统一的接口。

传输层(Transport Layer):处理端到端的数据传输协议,如 TCP 和 UDP。TCP 协议提供可靠的字节流传输,而 UDP 则提供无连接的报文传输。Linux 通过 net/ipv4目录下的tcp_ipv4.c和udp.c等文件实现这些协议。

网络层(Network Layer):负责 IP 地址的路由和转发,核心实现位于 net/ipv4目录下的ip_input.c 和 ip_output.c 文件中。IP 层还实现了路由表、ARP 协议等功能。

数据链路层(Link Layer):这一层处理硬件接口的通信,负责将数据包从网络协议层传递到物理网络设备(如以太网卡)。核心文件包括 net/core/dev.c(用于网络设备管理和网络设备的抽象和操作)。以及具体的网卡驱动的文件,例如drivers/net/ethernet/intel/e1000/e1000_main.c。

wKgaombfpT-AeVQcAACjr17dpiQ190.png图1 Linux网络协议栈的分层实现

图1中,Berkeley Socket Interface就是Socket层即套接字层。Protocal Layer即网络协议层,包括了传输层和网络层。图1自Network Device Driver Interface/Queuing Discipline以下属于数据链路层。这里Queuing Discipline的意思是Linux为了实现网络带宽管理和控制,对网络数据包按照策略进行排队处理。


Linux 网络协议栈的数据包处理流程

网络数据包是网络通讯的载体。数据包处理分为入站和出站两个方向。


入站数据包处理

当一个数据包从外部网络接收到达时,Linux 的网络协议栈会按以下流程处理:

网络接口接收:物理层通过 NIC 硬件设备接收到数据包,并通过驱动程序将数据包传递给 Linux 内核。Linux 使用中断或轮询机制处理网络设备的输入。

数据链路层处理:数据包进入数据链路层(例如以太网层),协议栈会解析以太网帧的头部,判断数据包的类型(如 IPv4、IPv6 等)。数据链路层还会对数据包进行错误检测(如 CRC 校验)等操作。

网络层处理:数据包进入 IP 层,内核解析 IP 头部,判断数据包是否属于本机或是否需要转发。如果数据包属于本机,IP 层会检查协议类型(如 TCP、UDP 等),然后将数据包传递到对应的传输层协议处理模块。

传输层处理:如果数据包使用 TCP 协议,内核会检查 TCP 头部信息,确认数据包是否属于已建立的连接,并进行流控、重传等操作。如果是 UDP 数据包,则直接传递给上层的应用程序。

应用层交付:最终,经过传输层处理的数据被传递到应用层。应用程序通过 recv() 等系统调用接收数据。

wKgZombfpVCAY6VYAAS5FnV15EE506.png图2 内核调试器下观察入站数据包处理

图2是利用内核调试器观察的入站数据包处理流程,图2中,没有数据链路层的信息,这是因为Linux采用了NAPI机制对网络数据包处理进行了优化。在 Linux 网络协议栈中,NAPI引入了一种混合中断和轮询的方式来处理高负载下的网络数据包。NAPI 数据包队列是该机制的核心部分之一,它用于存储接收到的网络数据包并等待后续处理。

出站数据包处理

当应用程序需要发送数据时,Linux 网络协议栈会按以下流程处理:

应用程序请求:应用程序通过 Socket API 发送数据,操作系统通过系统调用(如 send())进入内核。

传输层封装:传输层协议(如 TCP/UDP)对数据进行封装,添加相应的协议头部,如 TCP 的源端口、目的端口、序列号等信息。对于 TCP,可能还会进行数据的分段与流控。

网络层路由:封装好的数据传递给 IP 层,IP 层会为数据包选择最佳的路由,添加 IP 头部(如源 IP 地址、目的 IP 地址等),并将数据包发送到合适的网络接口。

数据链路层封装:数据链路层将 IP 数据包封装成适合硬件传输的帧(如以太网帧),并根据 ARP 协议找到目标 MAC 地址。

硬件发送:最终,封装好的数据包通过网络接口卡发出,数据传递到物理网络。

wKgZombfpVyAFWcmAAUZsAm_glg719.png图3 内核调试器下观察出站数据包处理

图3是利用内核调试器观察的出站数据包处理流程。tcp开头的函数属于传输层协议处理流程,包含ip的函数属于网络层协议处理流程,包含neigh的函数也属于网络层处理流程的ARP处理子流程(为了和ipv6统一,Linux使用了network neighbor的概念处理ARP协议)。包含e1000的函数属于数据链路层协议处理流程。


核心数据结构


sock 结构体

wKgaombfpWqAVzHRAAGH3AoMhS0467.png

sock 结构体是 Linux 网络协议栈中的核心数据结构之一,它代表了内核中每个 Socket 对象,并包含有关网络连接的状态信息。sock 结构体不仅用于管理应用层的 Socket,还用于管理协议层的状态。


sk_buff 结构体

wKgZombfpXGAO5qIAAFuvevEmLU238.png

sk_buff(Socket Buffer)是 Linux 中用于存储和处理网络数据包的关键结构体。每个 sk_buff 都包含一个完整的网络数据包,从链路层到应用层的数据都可以在其中进行存取。
总结

Linux 网络协议栈通过分层的架构实现对网络通信的高效管理。其各层次分别负责处理不同的网络协议与功能,从应用层的 Socket 接口到物理层的实际数据传输。关键的传输层协议如 TCP 和 UDP 在内核中实现,确保数据的可靠传输与高效分发。Linux在事实上已经成为TCP/IP网络协议最完美的参考实现!

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11854

    浏览量

    219828
  • 网络协议
    +关注

    关注

    3

    文章

    276

    浏览量

    22875
  • 协议栈
    +关注

    关注

    2

    文章

    147

    浏览量

    34720
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    DPE5500/W5500—SPI 接口以太网协议芯片

    DPE5500是一款SPI接口的以太网协议芯片,适用于单片机系统实现以太网通讯。DPE5500集成了全硬件TCP/IP协议,10/100
    发表于 05-21 17:46

    Linux内核参数sysctl.conf的工作原理和正确用法

    Linux 内核参数(kernel parameters)是操作系统运行时行为的控制开关,覆盖了内存管理、进程调度、网络协议、文件系统、虚拟内存、安全策略等方方面面。这些参数在系统安
    的头像 发表于 05-18 16:21 94次阅读

    OCA认证只认整机——为什么OCPP协议放在哪里不重要?

    认证是对“某个部件”(如通信主控板、协议模块)的认可。实际上,OCA认证的核心规则非常明确——证书只颁发给整机,至于OCPP协议具体跑在主控板上、独立通信模组
    的头像 发表于 04-10 15:38 4093次阅读
    OCA认证只认整机——为什么OCPP<b class='flag-5'>协议</b><b class='flag-5'>栈</b>放在哪里不重要?

    WiMi-net五层协议深度拆解:有中心自组网的落地实践

    从OSI七层到WiMi-net五层,经典理论如何落地?本文深度拆解WiMi-net有中心自组网协议的五层架构:物理层(Sub-GHz射频)、链路层(TDMA时隙)、网络层(动态路由)、传输层
    的头像 发表于 04-02 17:40 1872次阅读
    WiMi-net五层<b class='flag-5'>协议</b><b class='flag-5'>栈</b>深度拆解:有中心自组网的落地实践

    极海APM32F427 MCU在RT-Thread系统上使用LwIP网络功能

    下面是基于RT-Thread的ENV命令行开发环境,在APM32F427上使用LwIP网络协议实现网络通信功能的。
    的头像 发表于 04-02 15:19 9297次阅读
    极海APM32F427 MCU在RT-Thread系统上使用LwIP<b class='flag-5'>网络</b>功能

    车载以太网通信协议如何测?UT和SP联手!

    引言在汽车以太网的通信测试中,面对复杂的协议分层与交互,一个核心挑战在于:如何高效、直接地对ECU内部的网络层、传输层等协议实现进行验证?
    的头像 发表于 01-21 10:04 1917次阅读
    车载以太网通信<b class='flag-5'>协议</b><b class='flag-5'>栈</b>如何测?UT和SP联手!

    RDMA设计12:融合以太网协议设计1

    RDMA 队列并实现 RDMA 指令提交与完成机制。在 RoCE v2 高速数据传输系统中,用户通过配置系统控制模块中的寄存器或寄存器组来实现队列管理和数据 DMA 请求。融合以太网协议
    发表于 12-25 11:39

    IPv6 Only 进入倒计时 ,单替代双网络演进必然选择

    2025年末,中国工程院院士邬贺铨在“2026ICT行业趋势年会”上强调“双是过去的妥协,IPv6Only才是未来的必然”,这一判断精准点出了全球网络协议演进的核心方向。随着技术兼容方案成熟、政策
    的头像 发表于 12-23 09:59 1824次阅读
    IPv6 Only 进入倒计时 ,单<b class='flag-5'>栈</b>替代双<b class='flag-5'>栈</b>成<b class='flag-5'>网络</b>演进必然选择

    EtherCAT主站协议EC-Master在ROS(机器人操作系统)中的应用

    EtherCAT主站协议EC-Master在ROS(机器人操作系统)中的应用
    的头像 发表于 12-10 14:46 739次阅读
    EtherCAT主站<b class='flag-5'>协议</b><b class='flag-5'>栈</b>EC-Master在ROS(机器人操作系统)中的应用

    使用TFTP实现IAP的方法

    使用 TFTP 实现 IAP 的方法广泛应用于需要具有固件升级功能的嵌入式应用中(例如,嵌入式 Linux bootloader 中)。TFTP 是一种在 UDP 传输层上执行的简单文件传输协议。此
    发表于 12-10 07:21

    飞凌嵌入式ElfBoard-Linux系统基础入门-网络相关shell命令之网络基础知识

    。 1.OSI七层模型 OSI模型即网络结构的标准模型,是由国际互联网标准化组织定义的网络分层模型,虽然由于模型的实现太复杂,并没有实际的七层网络
    发表于 10-09 09:30

    Linux系统中网络配置详解

    网络配置是Linux系统运维中的核心技能之一。正确理解和配置子网掩码、网关等网络参数,直接影响系统的网络连通性和性能。本文将深入探讨Linux
    的头像 发表于 07-17 11:01 1514次阅读

    Linux网络管理的关键技术和最佳实践

    在大型互联网企业中,Linux网络管理是运维工程师的核心技能之一。面对海量服务器、复杂网络拓扑、高并发流量,运维人员需要掌握从基础网络配置到高级网络
    的头像 发表于 07-09 09:53 1191次阅读

    NVMe协议研究扫盲

    内部的并行性实现可扩展性、高吞吐量和低延迟的目标。相较于SATA协议,NVMe协议具有以下几点优势:管理更高效、功能性更强、I/O效率更高、读写延迟和功耗更低。由于NVMe SSD与HDD和SATA
    发表于 06-02 23:28

    物联网工程师为什么要学Linux

    Linux生态中已集成MQTT、TCP/IP、ZigBee等物联网常用协议,开发者可直接调用或移植,避免从零实现协议的复杂性。此外,庞
    发表于 05-26 10:32