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

    文章

    11522

    浏览量

    214288
  • 网络协议
    +关注

    关注

    3

    文章

    273

    浏览量

    22148
  • 协议栈
    +关注

    关注

    2

    文章

    145

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    NVMe协议研究扫盲

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

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

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

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

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

    Linux网络设置与基础服务

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

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

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

    网络协议与网关的关联

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

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

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

    hart协议协议结构分析

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

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

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

    RT-Thread USB协议-CherryUSB快速上手指南

    的是,CherryUSB已经成为RT-Thread的USB标准对接协议实现。这意味着在RT-Thread系统中,开发者可以方便地使用CherryUSB来实现USB相关功能,为项
    的头像 发表于 11-22 01:09 ?1571次阅读
    RT-Thread USB<b class='flag-5'>协议</b><b class='flag-5'>栈</b>-CherryUSB快速上手指南

    DoIP协议简介及主要功能

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

    CC256x TI蓝牙协议HIDDemo应用

    电子发烧友网站提供《CC256x TI蓝牙协议HIDDemo应用.pdf》资料免费下载
    发表于 11-11 15:21 ?3次下载
    CC256x TI蓝牙<b class='flag-5'>协议</b><b class='flag-5'>栈</b>HIDDemo应用

    CC256x TI蓝牙协议基础HFGAGDemo应用

    电子发烧友网站提供《CC256x TI蓝牙协议基础HFGAGDemo应用.pdf》资料免费下载
    发表于 11-11 15:18 ?3次下载
    CC256x TI蓝牙<b class='flag-5'>协议</b><b class='flag-5'>栈</b>基础HFGAGDemo应用

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

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