Linux源码阅读-套接字缓冲区&net_device

套接字缓冲区数据管理

在内核分析(收到)网络分组时,底层协议的数据将传递到更高层。分送数据时顺序相反,各种协议产生的数据(首部和净荷)依次向更低层传递,直到最终发送。这些操作的速度对网络子系统的性能有决定性影响,因此内核使用一种特殊的结构,称为套接字缓冲区(socket buffer),具体源码如下:

套接字缓冲区的基本思想是"通过操作指针来增删协议首部"。head 和 end 指向数据在内存中的起始和结束位置。data 和 tail 指向协议数据区域的起始和结束位置。mac_header 指向 MAC 协议首部的起始,而 network_header 和 transport_header 分别指向网络层和传输层协议首部的起始。

在字长 32 位的系统上,数据类型 sk_buff_data_t 用来表示各种类型为简单指针的数据,具体结构 sk_buff_data_t 如下图所示:

从套接字缓冲区获得 TCP 首部:

管理套接字缓冲区数据

套接字缓冲区结构不仅包含上述指针,还包括用于处理相关的数据和管理套接字缓冲区自身的其他成员。下面是一些重要的成员:

  • tstamp 保存了分组到达时间;
  • dev 指定了处理分组的网络设备;
  • sk 是一个指针,指向用于处理该分组的套接字对应的 socket 实例;
  • dst 表示接下来该分组通过内核网络实现的路由;
  • next 和 prev 用于套接字缓冲区保存到一个双链表中。

使用一个表头来实现套接字缓冲区的等待队列,其结构类型定义如下:

使用双向链表管理套接字缓冲区如下:

Linux 内核提供用于操作套接字缓冲区的标准函数如下:

补充 net_device

net_device 结构体存储网络设备的所有信息,每个设备都有这种结构。所有设备的 net_device 结构放在一个全局变量 dev_base 所有全局列表中。和 sk_buff 一样,整体结构相庞大的。结构体中有一个 next 指针,用来连接系统中所有网络设备。内核吧这些连接起来的设备组成一个链表,并有全局变量 dev_base 指向链表的第一个元素。net_device 结构体源码如下:

参考资料:https://github.com/0voice

相关推荐
吴建旭 智宅焕15 小时前
智能家居全国交付中执行端能力跃迁的架构设计:从标准装调到交付专家的系统化路径
网络·网络协议·智能家居
lzx_00217 小时前
Linux 进程(三) 从进程状态到僵尸进程、孤儿进程
linux·服务器
Eyfcom18 小时前
〖全球化架构 05〗跨国网络专线优化:QUIC 协议与 SD-WAN 在跨境传输中的实战
网络·架构·跨境物流快递系统·全球化架构
FlightYe18 小时前
音视频修炼之容器与协议(四):RTSP详解
android·linux·ffmpeg·音视频·dash
Dream Cosmos19 小时前
传输层协议之UDP
网络·网络协议·udp
刘马想放假19 小时前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
kloc20 小时前
聊天室项目入口网关子服务的实现
linux·c++
GeW20 小时前
深圳APEC峰会倒计时:数据库与Linux运维的"隐形考场"
linux
梦到啥说啥21 小时前
Linux网络编程:UDP网络协议
linux·网络协议·udp
鸿蒙开发爱好者1 天前
下班后做的小工具和小游戏,我把它们整理成了 WyanHub
网络·人工智能·职场和发展·个人开发