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

    文章

    11628

    浏览量

    217973
  • 网络协议
    +关注

    关注

    3

    文章

    274

    浏览量

    22551
  • 协议栈
    +关注

    关注

    2

    文章

    146

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    Linux系统中网络配置详解

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

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

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

    NVMe协议研究扫盲

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

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

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

    Linux主要的性能有哪些?

    都有确定的用途。它支持32位和64位硬件,能运行主要的unix工具软件、应用程序和网络协议linux继承了unix以网络为核心的设计思想,是一个性能稳定的多用户
    的头像 发表于 04-30 18:09 490次阅读
    <b class='flag-5'>Linux</b>主要的性能有哪些?

    51+单片机TCP-IP+协议ZLIP源码

    概述 单片机上网技术,是当前的一个热门技术。单片机上网技术中的一个重要部分是在单片上实现 TCP/IP 协议。现在可获得的 TCP/IP 源代码一般并不为 51 单片机设计,而 51 单片机
    发表于 04-22 15:11

    深入浅出解析低功耗蓝牙协议

    实现代码称为协议(protocol stack),Bluetooth LE协议就是实现低功
    的头像 发表于 04-09 14:49 1008次阅读
    深入浅出解析低功耗蓝牙<b class='flag-5'>协议</b><b class='flag-5'>栈</b>

    Linux网络设置与基础服务

    Linux网络设置与基础服务
    的头像 发表于 04-09 11:51 3139次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>网络</b>设置与基础服务

    三种蓝牙架构实现方案(蓝牙协议方案)

    蓝牙架构实现方案有哪几种?我们一般把整个蓝牙实现方案叫做蓝牙协议,因此这个问题也可以这么阐述:蓝牙协议
    的头像 发表于 04-08 15:35 1189次阅读
    三种蓝牙架构<b class='flag-5'>实现</b>方案(蓝牙<b class='flag-5'>协议</b><b class='flag-5'>栈</b>方案)

    HPM_SDK V1.8.0支持Ethernet/IP工业以太网协议

    1、概述Ethernet/IP是工业以太网中经常使用的协议,OpENer是ethernet/IP的一种开源实现。HPM_SDKV1.8.0中增加了对OpEner的支持,并提供了三个
    的头像 发表于 02-08 13:38 745次阅读
    HPM_SDK V1.8.0支持Ethernet/IP工业以太网<b class='flag-5'>协议</b><b class='flag-5'>栈</b>

    井芯微电子WENOS-PROTO协议簇软件详解

    WENOS-PROTO协议簇软件是井芯微自研的以太二、三层商用网络交换及路由协议解决方案。
    的头像 发表于 01-23 16:01 2540次阅读
    井芯微电子WENOS-PROTO<b class='flag-5'>协议</b>簇软件详解

    网络协议与网关的关联

    在现代通信网络中,数据的传输和接收依赖于一套复杂的规则和标准,这些规则和标准统称为网络协议网络协议定义了数据如何在
    的头像 发表于 01-02 18:07 963次阅读

    Model系列:基于RT-Thread freemodbus主从协议

    ,因而文本将详细介绍Model系列芯片基于RT-Threadfreemodbus主从协议的配置与应用,涵盖主机和从机测试的详细步骤,希望通过本文能够帮助各位开发者快
    的头像 发表于 12-30 17:32 1025次阅读
    Model系列:基于RT-Thread freemodbus主从<b class='flag-5'>协议</b><b class='flag-5'>栈</b>

    AUTOSAR通信协议解析 如何实现AUTOSAR通信

    通信协议是一个复杂的系统,它涵盖了多种通信方式和模块,以实现车内ECU之间的高效、可靠的数据交换。以下是对AUTOSAR通信协议的解析及实现
    的头像 发表于 12-17 14:54 3951次阅读