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
    +关注

    关注

    87

    文章

    11302

    浏览量

    209432
  • 网络协议
    +关注

    关注

    3

    文章

    266

    浏览量

    21542
  • 协议栈
    +关注

    关注

    2

    文章

    141

    浏览量

    33629
收藏 人收藏

    评论

    相关推荐

    hart协议协议结构分析

    1. 引言 HART协议自1980年代末推出以来,已经成为工业自动化领域中广泛采用的一种通信协议。它允许在现有的模拟4-20mA信号上叠加数字信号,实现双向通信。这种协议的设计旨在提高
    的头像 发表于 12-02 09:43 215次阅读

    明达技术为您剖析软&硬协议

    在当今这个科技日新月异的时代,每一个细微之处都蕴含着无限可能。今天,让我们一同深入探索网络协议领域的两大核心实现方式——软协议
    的头像 发表于 11-23 16:28 110次阅读
    明达技术为您剖析软&amp;硬<b class='flag-5'>协议</b><b class='flag-5'>栈</b>

    DoIP协议简介及主要功能

    的修改,使用单对双绞线即可实现稳定的100Mb/s全双工通信。正是由于车载以太网的普及应用,对应的车辆诊断协议DoIP应运而生,本文将基于ISO13400、ISO14229和求远电子在DoCAN协议
    的头像 发表于 11-13 15:35 507次阅读
    DoIP<b class='flag-5'>协议</b><b class='flag-5'>栈</b>简介及主要功能

    串口服务器和TCP/IP协议是什么关系

    串口服务器与TCP/IP协议之间存在着紧密而复杂的关系。这种关系主要体现在串口服务器如何利用TCP/IP协议实现串口设备与
    的头像 发表于 08-25 17:35 1559次阅读

    是否能将libwebsokets移植到ESP8266上利用libwebsokets进行网络应用开发?

    的交叉编译工具来生成类似官方提供的 *.a 库 3. 如果是在linux下生成的libwebsokets.a拷贝至 lib 目录是否可以直接使用 4. 据官方文档说明,ESP8266和TCP/IP协议
    发表于 07-22 06:22

    TCP/IP协议的设计与实现_中文

    电子发烧友网站提供《TCP/IP协议的设计与实现_中文.pdf》资料免费下载
    发表于 07-03 11:28 4次下载

    LwIP协议源码详解—TCP/IP协议实现

    电子发烧友网站提供《LwIP协议源码详解—TCP/IP协议实现.pdf》资料免费下载
    发表于 07-03 11:22 3次下载

    基于MM32F5270的Ethernet实现LwIP协议移植

    LwIP是轻量化的TCP/IP协议,由瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议。LwIP具有高度可移植性、代码开源,提供了三种编程接口(API):RAW API、NETCON
    的头像 发表于 06-21 10:28 1185次阅读
    基于MM32F5270的Ethernet<b class='flag-5'>实现</b>LwIP<b class='flag-5'>协议</b><b class='flag-5'>栈</b>移植

    Microchip TCP/IP 协议应用笔记

    电子发烧友网站提供《Microchip TCP/IP 协议应用笔记.pdf》资料免费下载
    发表于 04-17 14:16 1次下载

    基于MM32G5330的FlexCAN实现CANopenNode协议移植

    本文将介绍如何基于灵动MM32G5330的FlexCAN实现CANopenNode协议的移植,并使用灵动官方提供的开发板Mini-G5333进行验证。
    发表于 04-12 09:15 1492次阅读
    基于MM32G5330的FlexCAN<b class='flag-5'>实现</b>CANopenNode<b class='flag-5'>协议</b><b class='flag-5'>栈</b>移植

    如何解决蓝牙协议被锁问题?

    如何解决蓝牙协议被锁问题
    发表于 03-21 08:21

    ethernetif_input和tcpip协议线程的作用

    tcpip协议线程是lwIP协议的核心线程,负责处理TCP/IP协议的各种功能,包括TCP
    的头像 发表于 03-20 10:01 1330次阅读

    PROFINET协议通信技术介绍

    PROFINET协议是PROFINET通信协议实现基础,它由多个层次组成,每个层次都有特定的功能和作用。
    的头像 发表于 02-03 16:22 2465次阅读

    使用LwIP协议浅析实战分析(i.MX RT)

    LWIP协议网络分层 LwIP(Light weight IP),是一种轻量化且开源的TCP/IP协议,它可以在有限的RAM和ROM条件下,实现
    的头像 发表于 02-02 17:05 1726次阅读
    使用LwIP<b class='flag-5'>协议</b><b class='flag-5'>栈</b>浅析实战分析(i.MX RT)

    通信网络协议之UDP协议技术解析

    在通常的网络协议中,TCP/IP协议是一个常见的示例,其中UDP和TCP都是传输层协议。传输
    发表于 02-01 11:00 982次阅读
    通信<b class='flag-5'>网络</b><b class='flag-5'>协议</b><b class='flag-5'>栈</b>之UDP<b class='flag-5'>协议</b>技术解析