深入理解linux网络学习一

understanding linux network internals about linux kernel network protocol implementation detail. 立即下载
 

Understanding Linux Network Internals

 

    这只是刚开始,下面的文字从整体上对linux进行了一个简单描述,接下来的日子我们将开始逐步深入进行学习,同时会穿插一些扩展的内容或自己的理解。

 

   该文大部分内容都是接受一些中网络代码中常见的编程模式和技巧。

 

内核描述:

       内核使用kmalloc和kfree来分配和释放内存。它们的使用方法与用户空间的函数malloc和free相同。若需要了解它们,可参考书籍: Linux Device Drivers (O’Reilly)

       如果一个内核组件的分配和释放频繁发生,则相关内核组件的初始化函数(如路由子系统中的fib_hash_init函数)通常会分配一个特殊的内存缓冲以加速内存分配。

       下面时一些需要内核维护内存缓冲的网络数据结构:

       插口哦缓冲描述符

该缓冲由net/core/sk_buff.c中的skb_init 分配sk_buff结构。Sk_buff结构可能时网络子系统中分配和释放频率最高的数据结构。

       邻居协议映射

              它使用内存缓冲来分配neighbour结构,该结构保存L3到L2的地址映射关系。

       路由表

              路由代码使用两个内存缓冲来分配两种数据结构,它们定义了路由表。

      

       下面时使用内存缓冲时会用到的一些函数:

              创建或销毁内存缓冲

              kmem_cache_create

              kmem_cache_destory

 

              从内存缓冲中分配或释放一个对象

              kmem_cache_alloc

              kmem_cache_free

       它们通常会在一个包装函数中被调用,该包装函数中更高的层次上处理分配和释放的请求。如:kfree_skb函数处理释放sk_buff的请求,但只有中所有对此结构的引用释放之后并且相关的子系统已执行了清除操作后,才调用kmem_cache_free释放这个sk_buff。具体的分配限制通常中kmem_cache_alloc的包装函数中知道,但有时也可通过/proc文件系统中的参数来调整。

 

       关于内存缓冲的实现和slab分配器接口的详细信息,请参考Understanding the Linux

 

缓冲和哈希表

       L3到L2映射的缓存(如IPV4中的ARP缓存),路由表缓存。

       缓存的查找函数通常由一个输入值来说明中查找没有命中的情况下,是否需要配置一个新元素并把它加入到缓存中。而其他类型的查找只会把没有命中的元素添加进去。

缓存通常使用哈希表实现。 单向和双向的链表

如果哈希表的查找时间时一个子系统的关键,则就需要实现一个机制,通过增加哈希表的大小来减少平均的冲突几率,这样可减少平均的查找时间。也可以中其他子系统中,如neighboring layer,看到通过给键值增加一个随机变量使得哈希值可以均匀的分布。这样可以减少DoS(Denial of Service)的危害,因为该类DoS都是通过特定参数使得哈希表的表项都集中中同一个哈希值上

 

引用计数

       大多数数据结构都会由一个引用计数,每访问一个数据结构,都会相应的增加或减少该数据的引用计数。相应的拥有这个数据结构的内核模块通常会导出两个增加和减少引用计数的函数。这些函数通常被命名为xxx_hold和xxx_release。

注:1.如果你释放了一个数据结构,但忘记调用xxx_release函数,内核就永远不会允许释放该数据结构,导致内存被逐步耗尽。

2.如果你引用来一个数据结构,但忘记调用xxx_hold函数,而刚好你是该数据结构的唯一引用者,这时的危害更大,如果你者后续操作中引用该结构,将可能导致其他数据被破坏或导致内核崩溃。

 

垃圾收集机制

       异步:与具体事件无关。它定时去检查一组数据结构并把可以释放的数据结构释放掉。判断释放可以释放的条件依赖于子系统的功能和内部逻辑,但前提是引用计数为0.

       同步:内存短缺时,可立即执行一个垃圾收集函数。

 

函数指针和虚拟函数表(VFTS)

       在定义数据结构时(对象),可以包含一组函数指针(方法)

       stuct sock {

              ……

              void  (*sk_state_change) (struct sock *sk);

              void  (*sk_data_ready) (struct sock *sk, int byte);

              ……

       };

       使用函数指针的好处是中初始化对象时,可根据对象的不同或对象作用的不同而把函数指针赋为不同的值。这样,同样是调用sk_state_change函数,就可以激活不同sock对象的不同函数。

       在网络代码中,函数指针被大量的使用:

              路由子系统,处理进入或发出包时,它会初始化sk_buff中两个函数指针。

       当一个包准备好往网络设备发送时,它会被传递给net_device结构中的hard_start_xmit函数指针。这个指针中网络设备驱动和网络设备绑定时被赋值。

       当L3的协议发送包时,它会调用一组函数指针中的一个。这些指针中L3的地址解析协议处理中被初始化。具体调用哪个函数要看它被初始化成哪个函数。

      

从上面得知,函数指针可以被用作不同内核组件间的接口;或是一个子系统中不同的条件下调用不同函数的机制;或是被用作允许不同的协议,驱动程序或功能可以使用各自不同的方法的机制。

       当一个设备驱动向内核注册一个网络设备后,内核会执行一些与设备类型无关的函数。在某些点上,它会调用net_device结构中的一些函数指针来让设备驱动做一些事情。设备驱动可把这些函数指针初始化为自己的函数,也可把它置为NULL,这表示内核执行缺省函数即可。

       中调用函数指针前,要先检查一下函数指针的值,以避免引用空指针。下面是一个简化后的例子:

       register_netdevice:

              if (dev->init && dev->init(dev) != 0) {

                    

}

       函数指针初始化与很多其他的因素相关:

如果函数指针的赋值与特定的数据有关,如协议标识或受到包的时某个特定的驱动程序。这种情况下较容易查找到真正的函数。如/drivers/net/3c59x.c驱动收到一个包,你可以中设备初始化函数中找到net_device结构中的函数指针被赋值为那些值。

如果函数指针的赋值与更复杂的逻辑有关,如L3到L2地址映射中的状态值。这种情况下,函数指针被赋为何值与外部事件相关,因而难以预测。

 

       一组函数指针放到一个数据结构中,通常叫做一个虚函数表(VFT)。当它被用做两个子系统间的接口,如L3和L4间的接口;或被导出作为某个内核组件的接口(一组对象)时,它里面可能包含很多不同的指针,它们中不同的协议或功能中使用。

 

数组定义

       struct abc {

              int age;

              char *name[20];

              ……

              char placeholder[0];

       }

       在某些情况下,一个数据结构会中末尾包含一个可选的数据块。placeholder被定义成长度为0的数组。这意味着中给bac分配空间时,同时也分配了一个可选块,placeholder就是块的指针。如果不需要可选块,那它就只是一个指向结构末尾的指针,它不占用任何空间。如果abc中不同的代码中被使用,每个代码都使用相同的基本定义,同时可以根据自己的需求来扩展abc。

 

互斥操作 

       互斥,锁机制和同步。

       中网络代码中常见的互斥机制:

       自旋锁

同一时刻只能由一个线程占有。该锁一般用作多处理器系统中,且开发者都希望线程占有锁时间不会太长,因此占有锁的进程,执行过程不能睡眠。

       读写自旋锁

如果一个锁的用户可明确分为只读和读写两类,推荐使用读写自旋锁。它与自旋锁的区别后者可由多个用户同时占有,但如果写者获得来锁,读者就不能获取这个锁。因为读者的优先级比写者高,因此这个锁适用于读者多,而写者少的情况。如果锁被读者得到,写者就不能获得;只有读者释放来锁,写者才能获得它。

       读-拷贝-更新(RCU)

              RCU是linux最新提供的一种互斥机制。它适合于:

                     读请求多而读写请求很少

                     获得锁的代码自动执行,且不会睡眠

                     被锁包含的数据结构通过指针访问

       路由子系统使用RCU。它的查找次数比更新次数要多,且路由查找代码不会中途中被阻塞。

       如果需要深入了解锁机制,可参考O’Reilly的Understanding the Linux Kernel 和 Linux Device Driver。

 

主机字节顺序和网络字节顺序的转换

       字节在内存中存储由两种格式:小端格式(把最低字节存储中最低地址中),而大端格式刚好相反。

       TCP/IP协议栈使用大端模型。

       每次内核读写ip头超过一个字节变量时,它都必须首先将网络字节序转换为主机字节序或是相反。该原则同样适用于TCP/IP协议栈中的其他协议。

       字节序转换函数:

              htons: 主机序到网络序(short)

              hton: 主机序到网络序(long)

              ntohs: 网络序到主机序(short)

              ntoh: 网络序到主机序(long)

       这些宏定义放在include/linux/byteorder/generic.h头文件。

 

一些备注信息:

在本书描述TCP/IP协议栈时,分别用L2,L3,L4来代表链路层,网络层和传输层。

术语vector和array通常可以互相替换。

BH  底半处理  IRQ 中断

       在文中,我们将了解到数据时怎样被协议栈带某一层带某个协议接收和发送的。在这种情况下,ingress和input时可以互相替换的。同样egress和output也适用。接收和发送数据两个动作可分别被简称为RX和TX。

 

understanding_linux_network_internals 深入理解linux网络(英文版),需要的朋友来下载吧,深入理解linux网络 立即下载

相关推荐

understanding-linux-network-internals.pdf

understanding-linux-network-internals understanding-linux-network-internals understanding-linux-network-internals 学习资料

Understanding Linux Network Internals

一 、简介 Table of Contents 1 基本术语 1.1 本书常用的缩写 2 引用计数 2.1 引用计数函数 3 垃圾回收 3.1 异步3.2 同步 4 函数指针 4.1 缺点 5 goto语句 5.1 使用环境 6 捕捉bug 基本术语 八个位的量通常称为八位组(octet), 本书使用最常见的术语字节(

Rain 1974

understanding linux network internals.pdf

understanding linux network internals 英文文字版,带书签。 详细讲解了linux内核网络子系统。

《深入理解Linux网络内幕》学习笔记一:内核通知链

大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间之间进行事件的通知。     通知链表是一个函数链表,链表上的每一个节点都注册了一个函数。当某个事情发生时,链表上所有节点对应的函数就会被执行。所以对于

newnewman 1038

深入理解Linux 内核网络内幕(Understanding Linux Network Internals)

深入理解Linux 内核网络内幕(Understanding Linux Network Internals)

深入理解LINUX网络技术内幕 原书名: Understanding Linux Network Internals

Linux如此流行正是得益于它的特性丰富并且有效的网络协议栈。如果你曾经惊叹于Linux能够实现如此复杂的工作,或是你只是想通过现实中的例子学习现代网络,《深入理解Linux网络技术内幕》将会给你指导。. 同其他O'Reilly的畅销书籍一样,《深入理解Linux网络技术内幕》清楚地阐述了网络的基本概念,并指导你如何用C语言实现。虽然早先的TCP/IP经验是有用的,初学者通过本书仍然可以学习到协议本身和大量的应用信息。一旦彻底掌握了这些网络工具,你就可以使用本书所附的代码,准确地指出Linux内核中最重要的部分如何工作。.. 网络功能的实现分布在不同的时间由不同的代码块完成,这正是理解网络和实现它的难点之一。本书的成功之一就是描述这些代码块如何集成,以及众多的函数和数据结构之间的关系。《深入理解Linux网络技术内幕》不仅描述了Linux网络的全貌,而且是理解Linux网络细节的有效指南。

tcpdump简单学习记录

tcpdump学习记录!

astrotycoon 422

Understanding linux network internals

最近自己在写linux network card driver,看过这本书,对linux network 一些内部数据结构和函数以及机制和使用讲的很详细。

C语言网络编程业内好书推荐

深入理解Linux网络内幕》:这本书从Linux内核的角度介绍了网络系统的组成和工作原理,包括网络协议栈、网络设备驱动、TCP/IP协议等,同时也介绍了如何优化网络性能和排查网络问题。《C语言网络编程指南》:这本书比较全面地介绍了C语言网络编程的相关知识,包括套接字编程、数据传输、协议实现等,同时也介绍了一些常见的网络协议和应用程序的实现。《Unix网络编程》:这本书详细介绍了Unix系统下的网络编程,包括套接字编程、进程间通信、服务器端编程等,同时也介绍了TCP/IP协议的细节和实现。

slty_123的博客 508

深入理解Linux网络内幕(Understanding Linux Network Internals)

英文版 Understanding Linux Network Internals

BLE蓝牙胎压监测

胎压监测系统新技术

qq_41851841的博客 1252

W. Richard Stevens Unix网络编程 作品集

W. Richard Stevens 写的那三卷书以怎样的顺序看是比较好的? 按我的经验来看先粗略的看一遍卷一,然后再结合卷一看卷二,卷二要看几遍,每遍都会有收获,然后卷三大概看看就行,之后就是看源码,看bsd-lite的,在最后就是看linux内核源码,结构体、函数名字等等会有不同,但是大的逻辑绝对是一样的,学习一两年后应该就差不多了,当你坐在那里能清楚的理清发一个文件到对方收到的完整过程每一个怎样函数调用、给网卡配ip地址后会发生什么、有路由器挂掉了会发生什么、tcp建立都经过怎样的函数调用和结构体.

scone5的博客 410

量子密钥分发系统设计与实现(一):系统基本架构讨论

本文主要对量子密钥分发系统中的基础架构和基于系统的量子密钥协商过程进行了初步讨论,为后期系列文章进行铺垫。

量子领域相关话题 3892

深入理解linux网络技术内幕笔记

Linux中skbuff的实现 本文是我尝试分析LINUX网络协议栈实现的一系列文章中的第一篇,主要分析LINUX网络协议栈中SKBUFF的实现。分析以LINUX2.2.x为基础,同时也包括了相同的描述对象在LINUX2.4.x中的新变化。本文引用的代码的版本分别是:LINUX2.2.25,LINUX2.4.20.  1 简介了解网络协议栈的人都知道,网络协议栈是一个有层次的软件结构,

SHK242673的专栏 1785

S905L3B机顶盒刷Armbian:从安卓Root到eMMC全攻略

在嵌入式开发与轻量级服务器搭建中,ARM架构设备因其低功耗和高性价比备受关注。晶晨S905L3B作为运营商机顶盒的主流芯片,通过刷写Armbian系统可将其改造为ARM小服务器。其原理是利用Amlogic芯片的uboot引导机制,将Linux系统写入eMMC存储,从而脱离原厂安卓限制。这一方案的技术价值在于以极低成本实现Docker容器、下载机、轻量数据库等服务的部署,应用场景涵盖家庭网络广告过滤、智能家居控制、复古游戏机等。本文以CM311-1S为例,详细拆解从安卓9 Root到Armbian写入eMMC

weixin_31476015的博客 340

银河飞腾FT-M6678 DSP开发初体验:从仿真器连接到第一个网络程序(CCS5.5+FT-EMU560实战)

本文详细介绍了银河飞腾FT-M6678 DSP开发环境的搭建过程,包括CCS5.5开发环境的配置、FT-EMU560仿真器的连接与设置,以及关键模块如网络驱动的国产化替换。通过实战案例,帮助开发者快速掌握国产DSP的开发流程,实现网络通信功能。

weixin_30919429的博客 554

深入理解Linux网络学习总结

深入理解Linux网络,修炼底层内功,掌握高性能原理。

追求幸福,探索未知的博客 3423

VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程

关于VSCode上搭建C/C++开发环境的内容,到这里就结束了,这里博主感叹一下,VSCode真的挺强大的,作为一个编辑器,可以通过和编译器链接成为开发环境,将环境配置好的话,在这上面写代码似乎也是个不错的选择。大家有任何疑问,欢迎在评论区中提出,本篇博客有任何问题和错误也欢迎来和博主讨论,真心希望能和大家一起进步。最后,如果本篇博客对你有帮助的话,能不能给博主一个三连啊!

2303_79329831的博客 8万+

【免费下载】 深入理解LINUX网络技术内幕 PDF 下载

深入理解LINUX网络技术内幕 PDF 下载 【下载地址】深入理解LINUX网络技术内幕PDF下载分享 深入理解LINUX网络技术内幕 PDF 下载 项目地址: https://gitcode.com/Open-source-do...

gitblog_06633的博客 1197

Office 365中的Assigned Access详细功能介绍

本文系统介绍了Office365中AssignedAccess功能的应用与管理。作为Windows系统的重要安全特性,AssignedAccess可将设备锁定为单应用模式,有效防范未授权访问。文章详细阐述了其核心功能、技术架构及配置方法,包括UWP/Win32应用支持、多用户配置、与AzureAD集成等。通过MicrosoftEndpointManager可实现批量部署和远程监控,适用于公共终端、零售设备等场景。该功能为企业数字化转型提供了安全、可控的终端管理方案,在保障数据安全的同时优化用户体验。

xueyunshengling的博客 226

基于 C# 实现 RTSP 摄像头监控分屏系统:从流媒体获取到多画面显示

通过本文的讲解,我们介绍了如何在 C# 中实现 RTSP 摄像头监控分屏系统。我们使用了FFmpeg和VLC两种不同的方法来获取和解码 RTSP 流,并通过PictureBox控件和控件实现了分屏布局。两种解码方案都非常强大,可以根据实际需求选择最适合的方案。通过这种方式,您可以轻松地在 C# 中集成 RTSP 流,并将多个摄像头的视频流实时显示在同一屏幕上,进行监控和分析。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2307

Linux之《深入理解Linux网络》读后感

RingBuffer指什么数据结构?动态分配还是静态初始化?为什么这里会出现丢包情况?RingBuffer(也称为循环缓冲区、环形缓冲区或循环队列)是一种数据结构,用于在缓冲区内以先进先出(FIFO)的方式存储数据。这种结构像一个环一样,缓冲区的末尾连接到缓冲区的开始处。RingBuffer 通常由一个固定大小的数组和两个指针(或索引)组成,分别用于追踪缓冲区的头部和尾部。头部指针指向数据将要被读取的地方,而尾部指针指向数据将要被写入的地方。动态分配。

梅花香自苦寒来,宝剑锋从磨砺出。 1827

YOLOv11-seg改进系列 | 引入CVPR2022 MetaFormer,零参数池化Token混合+StarReLU MLP,精度涨不掉速

本文提出了一种改进YOLOv11分割任务的C3k2_PoolingFormer模块,通过引入MetaFormer架构和Pooling Token Mixer,在保持模型轻量化的同时增强全局感受野建模能力。核心创新包括:1)使用零参数的AvgPool3×3差值作为Token Mixer,实现高效邻域信息聚合和局部对比增强;2)采用StarReLU MLP替代传统激活函数,提升非线性表达能力。改进后模型仅增加6.1%参数量,却能显著提升分割精度,特别适用于需要长程依赖建模的实例分割任务。该设计为轻量级视觉模型提

qq_44224801的博客 431

深入理解Linux网络——内核是如何接收到网络包的

数据到来后的处理: 1. 数据进入网卡Rx FIFO,通过DMA写入内存的RingBuffer,向CPU发起硬中断 2. CPU响应硬中断,调用网卡启动时注册的中断处理函数 3. 中断处理函数中将驱动传来的poll_list添加到CPU对应的softnet_data的poll_list,发起软中断 4. 内核线程ksoftirqd发现软中断请求,关闭硬中断 5. ksoftirqd线程根据软中断类型选择处理函数,调用驱动的poll函数收包 6. poll函数摘下RIngBuffer上的skb,发到协议栈

qq_25046827的博客 4730

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Linux:深入理解网络层

网络层在复杂的网络环境中确定一个合适的路径.传输到指定的网络中。

weixin_51142926的博客 6477

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

linuxkit
博客等级 码龄18年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值