
Linux网络内核协议栈
文章平均质量分 85
轮子学长
这个作者很懒,什么都没留下…
展开
-
深入理解Linux网络技术内幕——Notification内核通知表链
为什么要有内核通知表链: Linux由多个相互依赖的子系统组成。其中一些子系统可能需要对其他子系统的一些事件感兴趣。这样子系统之间需要一些通信机制来实现这一功能。 在接触Notification Chain之前,我们可能想到通过轮询来实现,事件发生时,子系统轮询所有其他的子系统,看看有没有对这一事件感兴趣的,有没有需要执行的子函数。If (subsystem_X原创 2015-01-29 14:26:57 · 1657 阅读 · 0 评论 -
中断详解(一)——基本概念
概述什么是中断 中断通常被定义为一个事件,该事件能够改变处理器执行指令的顺序。这样的事件与 CPU 芯片内外部硬件电路产生的电信号相对应。 中断分为同步中断和异步中断。 同步中断——同步中断是当指令执行时由 控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断 异步中断——异步中 断是由其他硬件设备依照原创 2015-03-24 10:30:32 · 27124 阅读 · 6 评论 -
中断详解(二)——中断描述符、任务门、中断门、陷阱门
什么是中断描述符表 中断描述符IDT表示一个系统表,它与中断或异常向量相联系。每一个中断或异常向量在这个系统表中有对应的中断或异常处理程序入口地址。中断描述符的每一项对应一个中断或异常向量,每个向量由8个字节组成。因此,最多需要256*8=2048字节来存放IDT。 在运行中断之前,必须初始化IDT(中断描述符表)。任务门、中断门、陷阱门 IDT包原创 2015-03-24 13:53:26 · 17276 阅读 · 0 评论 -
深入理解Linux网络技术内幕——IPv4 概念
我们可以大致看出数据在IPv4协议中的流向,接收报文 设备驱动处理完硬件介绍到的数据后,IPv4协议的ip_rcv函数(net_receive_skb调用)得到了属于IPv4的报文,接着调用ip_rcv_finish对报文进行分析。判断是该转发还是交付本地上层协议。 如果是本地报文,则传给ip_local_deliver处理,如果是转发,那就交付ip_forward进行转发处理。发送报文 对于接收到的属于转发的报文(来自ip_forward_finish)以及L4层传下来的报文,需要进行分析后传给原创 2015-05-13 15:51:38 · 1681 阅读 · 0 评论 -
深入理解Linux网络技术内幕——IPv4 报文的传输发送
报文传输,指的是报文离开本机,发往其他系统的过程。传输可以由L4层协议发起,也可以由报文转发发起。在深入理解Linux网络技术内幕——IPv4 报文的接收(转发与本地传递)一文中,我们可以看到,报文转发最后会调用dst_output与邻居子系统进行交互,然后传给设备驱动程序。 这里,我们从L4层协议发起的传输,最后也会经历这一过程(调用dst_output)。本文讨论的是L4层协议发起的传原创 2015-05-14 14:47:50 · 2432 阅读 · 0 评论 -
深入理解Linux网络技术内幕——IPv4 报文的接收(转发与本地传递)
我们知道,报文经过网卡驱动处理后,调用net_receive_skb传递给具体的协议处理函数,对于IPv4报文来说,其协议处理函数就是ip_rcv了,ip_rcv在进行一些健康检查等操作后,会调用ip_rcv_finish来处理报文。这也是IPv4协议对报文接收处理的开始。我们先看下ip_rcv_finish源代码:本地传递转发报文转发有下面几个步骤完成:1. 处理IP选项2. 确定封包可以被转发3.递减封包头部的TTL字段,如果TTL字段为0,则丢弃该封包4.根据路径相关MTU,在必要原创 2015-05-14 09:29:48 · 4974 阅读 · 0 评论 -
深入理解Linux网络技术内幕——L4层协议与Raw IP的处理
我们简单了解下L4层协议和Raw IP是如何与IP层进行交互的。L4层协议L4层协议可以通过静态编译和模块配置两种方式加入内核。比较重要的协议如TCP、UDP、ICMP通常是静态编译至内核。一些不常用的或者比较特殊的协议,则是通过内核配置加入内核。如IGMP,SCTP,IPIP等等。L4层协议的注册L4层协议有net_protocol结构定义:/* This is us原创 2015-05-18 14:19:27 · 9279 阅读 · 0 评论 -
深入理解Linux网络技术内幕——IPv4 分段与重组
封包的分段和重组是IP协议最重要的工作之一。IPv4报头中有一个len字段(用于表示报文的总长度,单位:字节)占16bit,因此,封包的最大尺寸定义为64K,(2^16/1024=64)。但是,在实际网络传输中,没有几个网络接口能够传输64K这么大的封包,而是有一个MTU表示其最大传输单元。这样,当要传输的封包大于MTU时,就需要对封包进行分段。 这里需要说明,我们指的MTU,不仅原创 2015-05-18 11:07:18 · 3348 阅读 · 0 评论 -
Iptables 指南 1.1.19
转载自:Iptables 指南 1.1.19Iptables 指南 1.1.19Oskar Andreasson oan@frozentux.net Copyright © 2001-2003 by Oskar Andreasson本文在符合 GNU Free Documentation 许可版本1.1的条件下,转载 2015-06-10 16:49:06 · 2084 阅读 · 0 评论 -
路由子系统——Scope
路由子系统——ScopeScope类似作用域的概念。路由和IP地址可以指定Scope,用来告诉内核它们在那些情况下是有意义的,是可以被使用的。Scope分为两种:路由的Scope 和 IP地址的Scope 路由的Scope:表示到目的网络的距离。 IP地址的Scope: 表示该IP地址到达本地主机有多远。常用的ScopeIP地址常用的Scope主机:表示该地址原创 2015-07-02 22:53:41 · 5529 阅读 · 0 评论 -
深入理解Linux网络技术内幕——IPv4选项的处理
IP选项介绍IP首部中有4bit用于表示首部长度,其单位是4个字节,所以,IP首部的最大长度是15*4=60字节(4bit最大可以表示到15),而IP固定首部的长度是20字节,所以一个IP首部最大允许有40字节长度的选项。IP选项有两种格式 单字节和多字节对于多字节选项,其长度有length字段标识,另外其Optiondata并不是从32bit的边界开始的。Length原创 2015-05-14 16:31:50 · 4628 阅读 · 0 评论 -
路由子系统——基本概念与高级路由
本文讨论IPv4的路由子系统。(IPv6对路由的处理不同)。基本概念路由子系统工作在三层,用来转发入口流量。路由子系统主要设计 路由器、路由、路由表等概念。路由器: 配备多个网络接口卡(NIC),并且能利用自身网络信息进行入口流量转发的设备。路由: 流量转发,决定目的地的过程路由表:转发信息库,该库中储存路由需要本地接收还是转发的信息, 以及转发流量时所需要的信息。(即原创 2015-06-11 16:24:34 · 2403 阅读 · 0 评论 -
路由子系统——路由查找(留坑)
留坑, 后面补充。原创 2015-09-16 14:01:59 · 1155 阅读 · 0 评论 -
路哟子系统——高级路由(留坑)
路哟子系统——高级路由(留坑)原创 2015-09-16 14:02:37 · 832 阅读 · 0 评论 -
中断详解(三)——中断和异常的硬件处理
假定内核已被初始化,CPU在保护模式下运行 当执行了一条指令后,CS和eip这对寄存器包含下一条将要执行的指令的逻辑地址.在处理那条指令之前,控制单元会检查在运行前一条指令时是否已经发生了一个中断或异常。如果发生了一个中断或异常,那么控制单元执行下列操作: 1)确定与中断或异常关联的向量i (0 ≤ i ≤ 255) 2)读由idtr寄存器指向的I原创 2015-03-24 14:44:44 · 3702 阅读 · 1 评论 -
中断详解(五)——中断处理程序
对于异常处理来说,内核只要给引起异常的进程发送一个Unix信号就能处理大多数异常。然后内核的工作就是延迟下一个动作,知道进程接收到该信号。关于异常处理,内核并没有执行多少任务,因而异常处理非常迅速。这种方怯并不适合中断,因为经常会出现一个进程(例如,一个请求数据传输的进程)被挂起好久后中断才到达的情况,因此,一个完全无关的进程可能正在运行。所以,给当前进程发送一个Unix信号是毫无意义的.原创 2015-03-24 17:03:38 · 5426 阅读 · 0 评论 -
中断详解(四) ——异常与异常处理
异常8Ox86微处理器发布了大约20种不同的异常,内核必须为每一种异常提供一个异常处理程序。对于某些异常,CPU控制单元在开始执行异常处理程序前会产生一个硬件出错码(hardwar eerror code) , 并且压入内核态堆钱。(见本文最后面的几张大图)异常处理CPU的大部分异常都被Linux解释为出错条件。当其中一个异常发生肘,内核就向引起异常的进程发送一个信号向色通原创 2015-03-24 16:31:07 · 5374 阅读 · 0 评论 -
深入理解Linux网络技术内幕——用户空间与内核空间交互
概述: 内核空间与用户空间经常需要进行交互。举个例子:当用户空间使用一些配置命令如ifconfig或route时,内核处理程序就要响应这些处理请求。 用户空间与内核有多种交互方式,最常用的有以下四种:通过/proc虚拟文件系统,通过/sys虚拟文件系统,通过ioctl系统调用,通过Netlink socket。 其中编写程序时最常使用ioctl,这四种方式中有两种是通过虚拟原创 2015-01-30 14:29:54 · 3378 阅读 · 0 评论 -
深入理解Linux网络技术内幕——网络设备初始化
概述 内核的初始化过程过程中,与网络相关的工作如下所示: 内核引导时执行start_kernel,start_kernel结束之前会调用rest_init,rest_init初始化内核线程init(在Linux3-12中为kernel_init)。asmlinkage void __init start_kernel(void){ ... parse原创 2015-02-03 14:25:42 · 6096 阅读 · 0 评论 -
深入理解Linux网络技术内幕——PCI层和网络接口卡
概述 内核的PCI子系统(即PCI层)提供了不同设备一些通用的功能,以便简化各种设备驱动程序。 PCI层重要结构体如下:pci_device_id 设备标识,根据PCI标志定义的ID,而不是Linux本地的。pci_dev 类似于网络设备的net_device。每个PCI会被分配一个net_dev实例。pci_driv原创 2015-02-05 14:17:41 · 5139 阅读 · 0 评论 -
深入理解Linux网络技术内幕——内核基础架构和组件初始化
引导期间的内核选项 Linux允许用户把内核配置选项传给引导记录,再有引导记录传给内核,以便对内核进行调整。 start_kernel中调用两次parse_args,用于引导期间配置用户输入数据。 parse_param是一个函数,用于解析输入的内核配置选项的参数字符串。字符串的格式为:name_variable=value。寻址特定关键字,并调用对应的函数。原创 2015-02-05 16:02:36 · 1659 阅读 · 0 评论 -
深入理解Linux网络技术内幕——设备的注册与初始化(二)
设备注册于设备除名 设备注册与设备除名一般有 register_netdev和unregister_netdev完成。这两个是包裹函数,负责上锁,真正起作用的是其调用的register_netdevice和unregister_netdevice。参见:net/core/dev.c。 下图描述了设备注册过程中的一些状态变化 状态的改变会用到原创 2015-02-08 11:00:38 · 11999 阅读 · 0 评论 -
深入理解Linux网络技术内幕——设备的注册与初始化(一)
副标题:设备注册相关的基本结构的原理框架设备注册与删除时间 设备在下列两种情况下进行注册:1)加载NIC驱动时2)插入热插拔设备时 这里NIC与热插拔设备有些不同。a.对于非热插拔NIC来说,NIC的注册是伴随着其驱动的发生的,而NIC可以内建到内核,也可以作为模块载入,如果内建入内核,则NIC设备和初始化均发生在引导时,如果NIC作为模块加载,则NIC的注册和原创 2015-02-06 11:38:08 · 3245 阅读 · 0 评论 -
Linux 2.6内核中新的锁机制--RCU
转载自:-------------------------------------------------------------------------SED单行脚本快速参考(Unix 流编辑器) 2005年12月29日英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream edit转载 2014-09-18 11:59:04 · 1340 阅读 · 0 评论 -
深入理解Linux网络技术内幕——虚拟设备初始化小结
概述 虚拟设备是建立在一个或者多个真实设备上的抽象。虚拟设备和真实设备的对应关系时多对多的,但是并不是所有的组合都能被定义,或者被内核所支持。初始化: 与真实设备一样,虚拟设备初始化时,被分配了net_device结构(注:别名设备是不需要分配net_device的)。通常,虚拟设备的net_device所包含的函数指针都是指向包裹函数,这些包裹函数都包含了相关的真实设备所使用的函数指针。原创 2015-02-11 10:11:24 · 2748 阅读 · 0 评论 -
中断详解(六)——do_IRQ函数
中断处理程序在完成一些堆栈和寄存器的处理后,调用do_IRQ函数。do_IRQ是中断在C语言的总入口。common_interrupt: addl $-0x80,(%esp) /* Adjust vector into the [-256,-1] range */ SAVE_ALL TRACE_IRQS_OFF movl %esp,%eax call原创 2015-03-25 11:16:15 · 10993 阅读 · 0 评论 -
中断详解(七)——软中断与微任务
我们知道,中断处理程序被分为上半部函数和下半部函数。而软中断、微任务、工作队列都是是下半部函数的机制。(至于工作队列的方式,她是以另一个线程的方式实现的,初始化时创建,调用时唤醒,其实request_thread_irq是将中断线程化,包括利用定时器实现延时处理,这都不是在中断上下文中) 软中断和微任务都是通过do_softirq执行的。 中断处理在do_IRQ中调用软中断原创 2015-03-25 15:28:05 · 3529 阅读 · 0 评论 -
深入理解Linux网络技术内幕——中断与网络驱动程序
接收到帧时通知驱动程序 在网络环境中,设备(网卡)接收到一个数据帧时,需要通知驱动程序进行处理。有一下几种通知机制:轮询: 内核不断检查设备是否有话要说。(比较耗资源,但在一些情况下却是最佳方法)中断: 特定事件发生时,设备驱动程序代表内核指示设备产生硬件中断,内核中断其它活动满足设备的需要。多数网络驱动程序使用中断。中断期原创 2015-03-19 14:12:23 · 6277 阅读 · 0 评论 -
深入理解Linux网络技术内幕——帧的接收与传输
帧的接收NAPI与netif_rx(非NAPI)Linux内核获取网络帧到达通知的方式有两中:中断和轮询。(中断值设备向内核发出中断,轮询指linux内核主动轮询设备)在早起的linux内核中,网络帧主要以中断的方式通知linux内核帧的到达。这是非NAPI方式。现在的操作系统中,linux内核使用NAPI方式, 获取帧到达的消息。NAPI混合使用了中断和轮询。netif_rx原创 2015-04-02 13:31:47 · 2409 阅读 · 0 评论 -
深入理解Linux网络技术内幕——协议处理函数
网络帧在进入网络层时,需要区分不同的网络协议进行处理,这就需要涉及协议处理函数。首先我们从驱动接收到一个数据帧,分析数据帧在协议栈中自下而上的传输流程。设备驱动程序在接收到一个数据帧时,会将其保存在一个sk_buff缓冲区数据结构,并对其进行初始化。struct sk_buff {...... __be16 protocol:16; ......} 在这个缓原创 2015-04-02 14:20:17 · 2039 阅读 · 0 评论 -
Linux虚拟网络接口 Bond详解
概述什么是Bond 简单的说,bonding就是把多个物理网络接口绑定到一起,使它们就像一个网络接口那样运行。 通过Bonding技术,可以实现网口冗余,负载均衡,从而达到高可用高可靠的目的Bond的七种策略模式 Bond的七种策略模式(mode),其实指的是在传输数据包的时候,如何从已经绑定的接口中选择数据包传输的接口。是所有的接口都传输数据包(如mode=3),还是说从中选择一个或多个原创 2015-11-02 14:27:38 · 10559 阅读 · 0 评论