Linux网络协议栈(五) -- 数据包的发送(based in 2.6.32)

2023-11-09

一、关键数据结构

对于输出封包,设备的数据结构主要包括两个:输出队列(queue)和输出队列规则(queue discipline)。我们首先来看输出队列(2.6.18内核中无该结构体):

struct netdev_queue {

structnet_device  *dev;

structQdisc          *qdisc;

unsigned long             state;

structQdisc          *qdisc_sleeping;

spinlock_t             _xmit_lock____cacheline_aligned_in_smp;


int                 xmit_lock_owner;

unsignedlong             trans_start;

unsignedlong             tx_bytes;

unsignedlong             tx_packets;

       unsigned long             tx_dropped;

} ____cacheline_aligned_in_smp;

该结构描述了一个输出队列,输出队列其实就是输出封包的缓存队列。每个设备(net_device)有一个或多个输出队列,从设备的定义中我们就可以看出:

struct net_device

{

    ...

    struct netdev_queue *_tx ____cacheline_aligned_in_smp;

   // struct list_head   qdisc_list; in 2.6.18在发包时获取发送队列方式有修改

    unsignedint        num_tx_queues;                                                                                              

    unsignedint        real_num_tx_queues;

    structQdisc        *qdisc; 

    unsignedlong       tx_queue_len;  

    spinlock_t      tx_global_lock;

    ....

}

该网络设备结构中,_tx表示了发送队列,num_tx_queues表示发送队列的个数,均在创建网络设备时进行初始化。real_num_tx_queues表示当前活动的发送队列个数,tx_queue_len表示发送队列的最大长度,也即发送队列中正在排队的最大帧个数。qdisc表示了队列规则,该规则用于输出流量控制。其定义如下:

struct Qdisc {

    int             (*enqueue)(structsk_buff *skb, struct Qdisc *dev);

    structsk_buff *    (*dequeue)(struct Qdisc *dev);

    unsigned        flags;


#defineTCQ_F_BUILTIN       1

#defineTCQ_F_INGRESS       2

#defineTCQ_F_CAN_BYPASS    4

#defineTCQ_F_MQROOT        8

#define TCQ_F_WARN_NONWC    (1<< 16)


    int         padded;

    structQdisc_ops    *ops;

    structqdisc_size_table __rcu *stab;

    structlist_head    list;

    u32         handle;

    u32         parent;

    atomic_t        refcnt;

    structgnet_stats_rate_est  rate_est;


    int         (*reshape_fail)(structsk_buff *skb,

                    structQdisc *q);

    void            *u32_node;

    structQdisc        *__parent;

    struct netdev_queue *dev_queue;

    structQdisc        *next_sched;

    structsk_buff      *gso_skb;

    unsigned long       state;

    struct sk_buff_head q;   

   //sk_buff_head结构体中声明了锁,可直接获得队列的锁(qdisc->q.lock),2.6.18中获得锁方式略有不同(qdisc->dev->queue_lock)

    structgnet_stats_basic_packed bstats;

    structgnet_stats_queue qstats;

};

该结构体中有enqueue、dequeue及ops函数集,用于操作队列。gso_skb表示分片帧,q表示输出封包。//2.6.18中qdisc结构体无state字段,用net_device结构体的state字段表征状态。


二、初始化输出队列

输出队列的初始化在注册网络设备时完成。用于向内核注册

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux网络协议栈(五) -- 数据包的发送(based in 2.6.32) 的相关文章

  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • 为什么同一个curl命令在windows和linux下输出不同的东西?

    为什么同样的curl o file https www link com 命令输出不同的东西 例如 如果我运行命令curl o source txt https www youtube com playlist list PLIx6Fwnp
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • 【PCL】得到一个点云中的最高值、最低值

    有一个点云 想得到它x y z三个轴上的最大值和最小值 可以用pcl getMinMax3D函数 在这儿 函数参数 1 点云 2 放最小值的容器 3 放最大值的容器 容器类型是点云中点的类型 正好有三个值 代码 Created by eth
  • 分布式事务-LCN

    2PC两阶段提交协议 分布式事务通常采用2PC协议 全称Two Phase Commitment Protocol 该协议主要为了解决在分布式数据库场景下 所有节点间数据一致性的问题 分布式事务通过2PC协议将提交分成两个阶段 阶段一为准备
  • 4. Redis高并发分布式锁实战---大厂生产级Redis高并发分布式锁实战

    分布式缓存技术Redis 1 手写分布式锁 2 Redis Lua 3 Redisson 4 redis分布式锁在集群中存在的问题 本文是按照自己的理解进行笔记总结 如有不正确的地方 还望大佬多多指点纠正 勿喷 课程内容 1 高并发场景秒杀
  • Elasticsearch 在kibana中对索引名称进行重命名

    问题 在实际的工作中 遇到已经将数据写入es 但是后边需要对这个索引进行重命名 如 test 20190122 test 20190121 需要重命名为test 2019 对于数据量比较少时 创建多个索引 需要创建多个分片 造成存储资源的浪
  • 正则表达式——Pattern.DOTALL

    项目测试过程中 测试发现短信内容无法正常解析成2个部分 代码如下 public static void main String args String testStr 13800000000 孔雀东南飞 五里一徘徊 n 十三能织素 十四学裁
  • 行式数据库与列式数据库的对比

    导语 随着大数据的发展 现在出现的列式存储和列式数据库 它与传统的行式数据库有很大区别的 正文 行式数据库是按照行存储的 行式数据库擅长随机读操作不适合用于大数据 像SQL server Oracle mysql等传统的是属于行式数据库范畴
  • C语言在控制台上实现鼠标操作的方法

    文章目录 了解windows库函数 了解句柄 实现思路与代码 在制作面向用户系统时 我们往往需要设置除输入参数外更为灵活的操作方式 例如鼠标点击 按键按下 无阻塞输入 等 同时 我们需要制作更为精美的 UI而不是简陋的黑白界面 然而 纯C语
  • 解决docker下nginx的多个站点互通问题

    系统为MAC 环境为docker mysql php nginx 问题描述 1 调试本地接口 方式为curl 请求 返回拒绝 业务上通过curl访问报错 Couldn t connect to server Failed to connec
  • git bash配置ssh 登录 Linux

    1 首先在 Linux 服务器上生成公钥和私钥文件 默认的存放目录在 ssh下 ssh keygen 可以将密码留空 这样之后就可以免密码登录 2 将私钥文件拷贝到本机 scp root 192 168 1 168 root ssh id
  • Ubuntu安装Protobuf,指定版本

    参考 https github com protocolbuffers protobuf readme https github com protocolbuffers protobuf blob v3 20 3 src README md
  • VirtualBox+WinDbg+Win7调试环境配置

    VirtualBox WinDbg Win7调试环境配置 火苗999 的博客 1 配置虚拟机串口如图 勾选启用串口 gt 端口选择COM1 gt 端口模式选择主机管道 gt 勾选创建管道 gt 端口文件位置输入 pipe com1 2 配置
  • 极简光线追踪入门

    阅读本文不需要任何图形学基础 这里抛砖引玉 希望勾起读者对光线追踪的兴趣 前言 光线追踪原理简单 并且可以抛开图形学的一堆理论 单独提出来讲 本文不需要任何图形学基础 看完本文后 将能够实现以下效果 图1 光线追踪效果 原理 光线追踪算法由
  • linux文件夹大小4096,Linux文件系统之文件、分区大小限制

    各种文件系统的限制 NTFS Windows 支持最大分区2TB 最大文件2TB FAT16 Windows 支持最大分区2GB 最大文件2GB FAT32 Windows 支持最大分区128GB 如果使用磁盘管理进行分区 最大为32GB
  • Docker自定义network搭建kafka

    昨天在搞spring cloud bus 想到用kafka实现消息总线 然后就用docker起了一个zookeeper和kafka 本人docker版本是17 06 采用机器是Ubuntu18版本 详细安装kafka的过程如下 1 dock
  • 反病毒工具-VirtualKD

    KD Kernel Debug 简介 它是一款 虚拟机辅助调试开源工具 版本支持情况 当前2 7版本支持Win8及以前系统 官网 http virtualkd sysprogs org 当你需要高效地调试一台虚拟机你需要它 双机调试的时候
  • VC中GDI绘图技术基础知识:hdc设备环境句柄,坐标系

    VC中GDI绘图技术 通过HDC设备环境句柄绘图有三种方式 标准客户区绘图 临时客户区绘图 非客户区绘图 1 标准客户区绘图 是在WM PAINT消息回调时执行 调用BeginPaint函数 EndPaint函数 2 临时客户区绘图 是在任
  • JSP+MVC开发模式 +EL表达式+ JSTL标签

    今日内容 1 JSP 1 指令 2 注释 3 内置对象 2 MVC开发模式 3 EL表达式 4 JSTL标签 5 三层架构 JSP 1 指令 作用 用于配置JSP页面 导入资源文件 格式 分类
  • ESP32 之 ESP-IDF 教学(十四)——虚拟文件系统(VFS)

    本文章 来自原创专栏 ESP32教学专栏 基于ESP IDF 讲解如何使用 ESP IDF 构建 ESP32 程序 发布文章并会持续为已发布文章添加新内容 每篇文章都经过了精打细磨 通过下方对话框进入专栏目录页 CSDN 请求进入目录 O
  • 安卓上基于透明代理抓包

    前言 在安卓上基于透明代理对特定APP抓包中使用的是redsocks2 本文演示如何使用clash实现同样的效果 你以为是Clash For Android 错 这里使用的是Core版本 就原理上来说 和前一篇文章并无区别 Clash的优势
  • Linux网络协议栈(五) -- 数据包的发送(based in 2.6.32)

    一 关键数据结构 对于输出封包 设备的数据结构主要包括两个 输出队列 queue 和输出队列规则 queue discipline 我们首先来看输出队列 2 6 18内核中无该结构体 struct netdev queue structne