linux网络内核
文章平均质量分 87
奔跑的路
这个作者很懒,什么都没留下…
展开
-
如何更方便的查看Linux内核代码的更新记录
Linux内核的更新非常的快,如何快速的了解这些更新呢?最一般的办法就是把新旧版本的内核源码下载下来,然后利用BCompare或别的什么工具进行源码对比,但这明显比较费力耗时,而本文将介绍一种更快捷简单的方法。在官方http://git.kernel.org/网站可以找到linux的各种git更新记录,比如virt/kvm/kvm.git,通过这个链接,可以看到kvm的各种更新。看我们重点转载 2015-03-16 11:08:39 · 9799 阅读 · 1 评论 -
了解linux网络协议栈(五)——协议栈实现
linux网络报文接收发送浅析作者: 七伤 对于linux内核来说,网络报文由网络设备来进行接收。设备驱动程序从网络设备中读取报文,通过内核提供的网络接口函数,将报文传递到内核中的网络协议栈。报文经过协议栈的处理,或转发、或丢弃、或被传送给某个进程。 网络报文的发送与之相反,进程通过系统调用将数据送入网络协议栈,或者由网络协议栈自己发起报文的发送,然后协议栈通过调用网络接口函数转载 2017-05-27 16:36:16 · 653 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(0)——前言
当决定开始写这个系列文章的时候,就意识到这可能会是个漫长的过程,也可能是个短暂的过程(如果自己中途放弃的话)。最近一段时间零零散散在了解内核网路协议栈相关的东西,有时候觉得好难,有时候觉得也就那么回事,这种感觉反反复复持续了一段时间,直到现在可以较为平静的面对这些问题的时候,决定对网络协议栈的学习做个梳理和记录,下面是阅读到的一些书籍:TCP IP详解卷1:协议 原书第2版原创 2017-07-03 17:46:12 · 3074 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(1.2)——协议栈的初始化(sk_buff)
sk_buff 是网络数据包的承载,是最关键的结构体之一/** * struct sk_buff - socket buffer * @next: Next buffer in list * @prev: Previous buffer in list * @tstamp: Time we arrived/left * @rb原创 2017-07-06 18:47:08 · 2320 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(1.3)——协议栈的初始化(sock_init)
static int __init sock_init(void){ int err; /* * Initialize the network sysctl infrastructure. */ err = net_sysctl_init(); if (err) goto out; /* *原创 2017-07-06 23:11:45 · 1645 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(1.4)——协议栈的初始化(proto_init)
这篇文章主要分析proto_init过程,它完成协议相关proc文件的创建3241 static __net_initdata struct pernet_operations proto_net_ops = {3242 .init = proto_init_net,3243 .exit = proto_exit_net,3244 };324原创 2017-07-09 10:42:28 · 1585 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(1.5)——协议栈的初始化(inet_init主要数据结构)
前面了解到网络初始化申请了两块skb高速缓存和创建了一个/proc/net/protocols文件,现在开始重头戏,网络协议栈的初始化。这篇文章主要介绍网络栈中使用到的主要数据结构。网络协议栈的内核实现和理论上的分层有些不一样,在代码里面的分层如下图:开始前,先回顾一下应用层socket函数的调用,它会创建一个socket并返回对应的描述符:int sock原创 2017-07-09 21:37:52 · 1847 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(1.7)——网络设备的初始化(struct net_device)
在linux的网络设备里,其中一个最关键的结构体应该要算net_device了,它由对应的网络设备驱动进行创建和初始化,服务于内核网络子系统。struct net_device这个结构体比较大,在了解它之前,我们先看一下它的注释:1433 /**1434 * struct net_device - The DEVICE structure.1435 * Actu原创 2017-07-16 19:21:19 · 8825 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(1.1)——系统的初始化(do_initcalls)
我们知道,不管在什么样的平台上启动linux,它的开始都是以start_kernel()进行系统的初始化,当然网络协议栈的初始化也是在这个过程中完成,下面从start_kernel()开始跟踪:start_kernel() --> rest_kernel() --> kernel_thread(kernel_init, NULL, CLONE_FS) --> kernel_init_freea原创 2017-07-03 17:42:34 · 2484 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(1.8)——网络设备驱动模块的加载
1.了解PCI总线说到网络设备驱动,就不得不说PCI总线,但是这个话题可深可浅,而且网上的资料也是一大堆(比如),但是对于我们来说,目前并不需要掌握很深,下面是网上找的两张最基本的PCI工作结构图,虽然PCI总线上可以挂接不同种类的设备,但我们这里只要了解网络设备就够了,所以我更偏好第二张图,它够简单,也够直观。 关于PCI总线,这里主要介绍两个结构体,一个是原创 2017-07-16 19:32:28 · 2458 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(1.6)——协议栈的初始化(inet_init实现过程)
这篇文章主要分析inet_init()函数的实现过程:1796 static int __init inet_init(void)1797 {1798 struct inet_protosw *q;1799 struct list_head *r;1800 int rc = -EINVAL;18011802 sock_skb_cb_check_siz原创 2017-07-14 14:57:03 · 1290 阅读 · 0 评论 -
了解linux网络协议栈(一)——内核模块初始化
linux驱动 之 module_init解析 (上)Linux内核很吊之 module_init解析 (下)linux驱动篇之 driver_register 过程分析(一)linux驱动篇之 driver_register 过程分析(二)bus_add_driverlist_for_each_entry宏函数解析原创 2017-04-29 11:02:48 · 2487 阅读 · 1 评论 -
学习Linux-4.12内核网路协议栈(3.2)——网路层的发包处理
上篇文章介绍了接口层将IP包传给网络层以后的处理过程,主要是包括传给上层,转发和丢包处理。这篇文章将介绍传输层怎么将包传递给网络层,以及传给网络层以后的处理过程。这里主要分两部分:TCP包的发送和UDP包的发送。在TCP中,将TCP段打包成IP数据报的方法根据TCP段类型的不同而有多种接口,最常用的就是ip_queue_xmit,而ip_build_and_send_pkt和ip_send原创 2017-09-03 21:12:07 · 2316 阅读 · 1 评论 -
学习Linux-4.12内核网路协议栈(2.1)——接口层加快传输速率的特性
前面花了好多篇幅,终于将网络协议栈的初始化相关的内容介绍完了,也就是说完成前面的那些步骤以后,网络协议栈具备了数据包的收发功能。在网络接口层,它只负责数据包的接收与发送,而不关注数据包在网络层的类型是什么,所以传输速率的快慢往往与接口层的处理有着密切的关系,下面我们来了解一下在提供传输速率上面,现在的内核都引进了哪些新的特性。数据包的接收: NAPI, RPS,RFS数据包的发送: TSO原创 2017-08-27 18:40:33 · 1122 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(2.2)——接口层数据包的接收(上半部)
前面写了这么多,终于可以开始分析数据报的传输过程了,那我们就愉快的开始吧!我们知道,一个中断处理函数主要分两个部分,上半部和下半部,这篇文章主要介绍上半部分。当一个数据包到达的时候,网卡驱动会完成接收并且触发中断,我们就从这个中断处理函数开始:当一个中断产生并发送给CPU的时候,对于NAPI和不支持NAPI的设备来说处理结果是不一样的,NAPI调用的函数是napi_schedule原创 2017-08-28 00:00:25 · 2324 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(2.4)——接口层数据包的发送
这篇文章主要介绍网络层的数据是怎么通过接口层将数据发送出去的,在开始之前我们还是再来看一下softnet_data这个很重要的结构体:struct softnet_data { struct list_head poll_list; struct sk_buff_head process_queue; /* stats */ unsigned int原创 2017-08-29 09:53:01 · 2848 阅读 · 0 评论 -
学习Linux-4.12内核网路协议栈(3.1)——网路层的收包处理
现在我们将进入传输层的分析:在前面我们知道,数据包到达接口层的时候,它会根据ptype_base来查询包的类型,并根据包的类型交给不同的网络层函数处理,比如ip_recv,icmp_recv等,现在我们就来看看网络层是怎么处理不同类型的包的:1. IP私有信息控制块 40 struct inet_skb_parm { 41 int iif;原创 2017-09-03 13:56:36 · 2289 阅读 · 0 评论 -
了解linux网络协议栈(四)——协议栈实现
Linux内核分析 - 网络[十七]:NetFilter之连接跟踪Linux内核分析 - 网络[十六]:TCP三次握手Linux内核分析 - 网络[十五]:陆由表[再议]Linux内核分析 - 网络[十四]:IP选项Linux内核分析 - 网络[八补]:IP协议补充转载 2017-05-06 10:23:33 · 946 阅读 · 0 评论 -
了解linux网络协议栈(三)——协议栈实现
【Linux4.1.12源码分析】virtio_net之NAPI机制【Linux4.1.12源码分析】virtio_net之中断注册【Linux4.1.12源码分析】收包软中断和NAPI【Linux4.1.12源码分析】VXLAN之remcsum实现分析【Linux4.1转载 2017-05-06 10:20:46 · 1279 阅读 · 0 评论 -
了解linux网络协议栈(二)——协议栈实现
第十六章PHY -基于Linux3.10第十五章 提升网络性能技术--基于Linux3.10第十四章 netlink机制--基于Linux3.10第十三章 网络命名空间(内核源码实现)--基于Linux3.10第十二章 trie路由--基于Linux3.10转载 2017-05-06 10:18:34 · 907 阅读 · 0 评论 -
sk_buff封装和解封装网络数据包的过程详解
点击打开链接可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体进行的,它的重要性和BSD的mbuf类似(看过《TCP/IP详解 卷2》的都知道),那么sk_buff是什么呢? sk_buff就是网络数据包本身以及针对它的操作元数据。 想要理解sk_buff,最简单的方式就是凭着自己对网络协议栈的理解转载 2015-03-12 09:11:33 · 2626 阅读 · 0 评论 -
PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理
原文地址:http://www.cnblogs.com/hoys/archive/2011/04/09/2010759.html相对于linux来说,udev还是一个新事物。然而,尽管它03年才出现,尽管它很低调(J),但它无疑已经成为linux下不可或缺的组件了。udev是什么?它是如何实现的?最近研究Linux设备管理时,花了一些时间去研究udev的实现。 udev是什么转载 2015-04-10 14:36:00 · 544 阅读 · 0 评论 -
用户空间和内核空间通讯之【Netlink 中】
今天我们来动手演练一下Netlink的用法,看看它到底是如何实现用户-内核空间的数据通信的。我们依旧是在2.6.21的内核环境下进行开发。 在文件里包含了Netlink协议簇已经定义好的一些预定义协议:点击(此处)折叠或打开#define NETLINK_ROUTE 0 /* Routing/device hook转载 2015-04-10 16:16:57 · 656 阅读 · 0 评论 -
揭开网络编程常见API的面纱【下】
Linux网络编程数据收发的API流程分析 只要把数据在协议栈中的流动线路和脉络弄清楚了,关于协议栈的实现部分,理解起来就轻松多了。在网络编程章节的数据接收过程中,我们主要介绍过read()、recv()、recvfrom()还有一个recvmsg()没介绍到,今天我们就来看一下这几个API函数到底有什么差别。数据接收 在接收数据的过程,主要分两个阶段:转载 2015-04-10 16:19:27 · 521 阅读 · 0 评论 -
linux 内核与用户空间通信之netlink使用方法
Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Named转载 2015-04-10 14:35:16 · 640 阅读 · 0 评论 -
用户空间和内核空间通讯之【Netlink 上】
引言 Alan Cox在内核1.3版本的开发阶段最先引入了Netlink,刚开始时Netlink是以字符驱动接口的方式提供内核与用户空间的双向数据通信;随后,在2.1内核开发过程中,Alexey Kuznetsov将Netlink改写成一个更加灵活、且易于扩展的基于消息通信接口,并将其应用到高级路由子系统的基础框架里。自那时起,Netlink就成了Linux内核子系统和用户态的转载 2015-04-10 16:15:41 · 522 阅读 · 0 评论 -
用户空间和内核空间通讯之【Netlink 下】
关于Netlink多播机制的用法 在上一篇博文中我们所遇到的情况都是用户空间作为消息进程的发起者,Netlink还支持内核作为消息的发送方的情况。这一般用于内核主动向用户空间报告一些内核状态,例如我们在用户空间看到的USB的热插拔事件的通告就是这样的应用。 先说一下我们的目标,内核线程每个一秒钟往一个多播组里发送一条消息,然后用户空间所以加入了该组的进程都会收到这转载 2015-04-10 16:17:42 · 578 阅读 · 0 评论 -
揭开网络编程常见API的面纱【上】
Linux网络编程API函数初步剖析 今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。 1、socket(family,type,protocol) 当我们在开发网络应用程序时,使用该系统调用来创建一个套接字。该API所做的工作如下所示: 该系转载 2015-04-10 16:18:55 · 528 阅读 · 0 评论 -
Linux Netlink通信机制详解(下)
这里我以路由中的netlink为例,看一下内核中的处理流程是怎么样的!在/kernel/net/core/rtnetlink.c文件中,有一个接收从用户空间过来的Netlink消息的函数。static void rtnetlink_rcv(struct sock*sk, int len){ unsigned int qlen = 0; do {转载 2015-04-08 16:37:24 · 3088 阅读 · 0 评论 -
Linux Netlink通信机制详解(上)
前面有一篇文章其实已经介绍过Netlink方面的知识,还有一个内核和用户空间之间的一个交互例子,这篇文章主要是更细节和基础的知识介绍!Netlink 是一种特殊的 socket,它是 Linux 所特有的,由于传送的消息是暂存在socket接收缓存中,并不被接收者立即处理,所以netlink是一种异步通信机制。 系统调用和 ioctl 则是同步通信机制。用户空间进程可以通过标准socket转载 2015-04-08 16:37:15 · 3161 阅读 · 0 评论 -
struct iphdr详解
/usr/src/linux-2.6.19/include/linux/ip.hstruct iphdr {#if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4;#elif defined (__BIG_ENDIAN_BITFIELD) __u8 versio转载 2015-04-09 10:39:09 · 1259 阅读 · 0 评论 -
struct tcphdr详解
sk_buff->tcphdr/usr/src/linux-2.6.19/include/linux/tcp.hstruct tcphdr { __be16 source; __be16 dest; __be32 seq; __be32 ack_seq;#if defined(__LITTLE_ENDIAN_BITFIELD)转载 2015-04-09 10:41:23 · 2067 阅读 · 0 评论 -
用户空间与内核的接口
Table of Contents1 概论1.1 procfs (/proc 文件系统)1.1.1 编程接口1.2 sysctl (/proc/sys目录)1.2.1 编程接口1.3 sysfs (/sys 文件系统)1.4 ioctl 系统调用1.5 netlink 套接字概论procfs (/proc 文件系统)转载 2015-10-10 15:17:23 · 2155 阅读 · 0 评论 -
linux 内核与用户空间通信之netlink使用方法
1 引言Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(转载 2015-10-10 15:26:33 · 1277 阅读 · 0 评论 -
内核中_init,_exit中的作用
__init, __initdata等属性标志,是要把这种属性的代码放入目标文件的.init.text节,数据放入.init.data节──这一过程是通过编译内核时为相关目标平台提供了xxx.lds链接脚本来指导ld完成的。 对编译成module的代码和数据来说,当模块加载时,__init属性的函数就被执行; 对静态编入内核的代码和数据来说,当内核引导时,do_basic_s转载 2017-03-25 21:32:06 · 602 阅读 · 0 评论 -
linux内核模块初始化
内核启动过程中需要完成各个部分的初始化,比如中端、页面管理、slab分配器、任务调度器、网络、PCI设备等等的初始化,这些初始化大概可以分为两种:一种是关键的,必须完成的而且必须以特定的顺序来完成的初始化,这部分的代码往往是直接便如内核的而且是直接调用的另一种是非关键的的子系统(或者说模块、功能)的初始化,这部分根据配置可以不加载,可以以built-in的方式编到内核的可执行文件中,也可以转载 2017-04-29 10:23:01 · 2357 阅读 · 0 评论 -
Linux 内核网络协议栈 ------sk_buff 结构体 以及 完全解释 (2.6.16)
在2.6.24之后这个结构体有了较大的变化,此处先说一说2.6.16版本的sk_buff,以及解释一些问题。一、先直观的看一下这个结构体~~~~~~~~~~~~~~~~~~~~~~在下面解释每个字段的意义~~~~~~~~~~~[cpp] view plain copy struct sk_buff { /* These two members must be first. */...转载 2018-04-08 10:32:47 · 1233 阅读 · 1 评论