深入理解LINUX网络技术内幕
文章平均质量分 60
以深入理解LINUX网络技术内幕这本书为主线配合Linux 4.2内核代码研究Linux内核协议栈相关内容。
未羊_z
这个作者很懒,什么都没留下…
展开
-
深入理解Linux网络技术内幕 第32章 路由-Linux的实现
主要数据结构路由代码定义和使用的主要数据结构中的rt代表路由(route),fib转发信息库(Forwarding Informations Base),fn功能(function)。struct ip_rt_acct该结构被路由表的分类器使用,用于跟踪和一个标签(tag)关联的路由上的流量统计信息,统计信息包括报文个数和字节数。这个结构初始化为长度256的数组。因为路由标签的取值范围是0~255。struct ip_rt_acct { __u32 o_bytes; __u32 o_p原创 2020-11-29 21:59:06 · 467 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第30章 路由-概念
路由与路由表决定一个入口报文送给本地主机还是转发所需要的信息,以及转发时正确转发所需要的的信息,都存储转发信息库中FIB(Forwarding Information Base),也简称为路由表。路由表是由许多路由的集合,一条路由是一组参数,这些参数存储了到一个给定目的地转发流量的所有信息。一条路由所需要的最少参数集合:目的网络出口设备:与路由匹配项从该设备发送出去。下一跳网关:当目的网络和本地主机不是直接相连时,需要其他路由器转发。下一跳网关就是指该路由器的地址。路由的基本元素对称路由和非原创 2020-11-26 22:31:54 · 420 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第31章 路由-高级路由
策略路由策略路由背后的思想是允许用户除了根据目的IP地址配置路由外,还可以根据其他多个参数配置路由。比如出于安全或计费考虑分开流量。实现策略路由有两种方法单路由表法查找路由不只是基于目的地址,还需要检查多个条件选择一条唯一路由。此处检查入口设备和目的地址。多路由表方法主机维护多张独立的路由表,根据特定条件选择正确的路由表。这样内核路由查找之前需要先选择正确的路由表。Linux只维护一张路由缓存,该缓存由所有的路由表共享。策略路由查找根据配置策略选择要用的路由表。从选择的路由表查找路原创 2020-11-08 21:47:31 · 262 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第28章 邻居子系统-ARP协议
邻居子系统-ARP协议原创 2020-07-03 22:19:10 · 525 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第27章 邻居子系统-通用基础结构
邻居子系统-通用基础结构数据结构L3协议和邻居通用接口neigh->ops初始化neigh->output和neigh->nud_state初始化邻居信息更新-neigh_update数据结构struct neigh_table 描述邻居协议参数和所用函数。struct neighbour 存储邻居相关信息。该结构描述主机的L3地址,主机有多个L3地址也就有多个该结构。L3协议和邻居通用接口Linux内核通过虚拟函数表将L3协议和L2传输函数链接起来。邻居系统的虚拟函数表由str原创 2020-06-30 23:24:09 · 906 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第26章 邻居子系统-概念
邻居子系统-概念概念邻居协议作用Solicitation请求和应答Linux实现概念连接在同一LAN上的主机具有相同的L3网络配置互为邻居。另一种定义邻居的方式是主机到其邻居有且只有一个L3跃点。并且它的路由表必须提供可以直接和其邻居通信的路径。不是邻居的主机通信必须经过网管或者路由器。物理子网(LAN)和逻辑子网(IP子网)不总是一对一的。在同一个LAN上可以存在多个IP子网,或者多个LAN位于同一个IP子网内。邻居协议作用L3地址转换成L2地址,根据硬件不同存在多种L2协议,而L3协议不用关原创 2020-06-27 17:09:57 · 624 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第16章 桥接-Linux实现
桥接-Linux实现网桥设备抽象桥接程序的初始化网桥设备抽象网桥对Linux来说是虚拟设备,我们需要把一个或者多个真实设备绑定到网桥设备上,否则无法接收和传输报文。当创建一个网桥时,必须告诉内核这个网桥绑定了那些接口。比如建立一个网桥br0,然后把eth0和eth1指派给br0,。此时eth0和eth1是网桥接口,它们不需要配置IP地址,可以把IP信息指定给网桥设备。前面章节提到设备上传输报文要调用dev_queue_xmit执行,dev_queue_xmit函数会调用驱动程序的hard_start原创 2020-06-20 22:02:32 · 1413 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第14章 协议处理函数
协议处理函数每种协议都会有一个初始化函数,如果协议被静态编译到内核中初始化函数在引导期间执行,如果被编译成模块,就在模块加载时执行。设备驱动接收到一个报文后,将其保存在sk_buff结构内,然后对protocol字段初始化。skb->protocol = eth_type_trans(skb, nic->netdev);protocol字段被前面章节出现过的__netif_receive_skb函数使用,找到合适的L3处理函数并调用deliver_skb函数将skb传递到上层进行处理。原创 2020-06-13 11:08:30 · 470 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第11章 帧的传输
111原创 2020-06-11 21:58:04 · 931 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第10章 帧的接收
帧的接收通知内核已接收NAPI和netif_rxNAPI通知内核已接收NAPI和netif_rxLinux驱动程序通知内核接收报文有两种方式:netif_rx函数NAPI机制NAPINAPI混合中断和轮询,不适用纯粹的中断事件驱动模型。...原创 2020-06-07 23:04:12 · 739 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第9章 中断和驱动程序
接收帧通知设备和内核可以使用两种方式交互数据:轮询和中断。有时候轮询和中断可以组合使用提高效率。轮询轮询就是内核不断的查询设备是不是有新数据就绪需要处理,例如查看某个寄存器等。中断中断时当特定事件发生时,内核中断其他的进程活动,调用中断处理函数处理数据。当接收到一个报文时处理函数将报文放入队列,然后通知内核进行后续的处理。这种处理方式在低流量环境时可以很好的工作,但是如果流量负载比较高而每个报文都导致一次中断,让CPU为处理中断浪费很多时间。中断中接收数据分成两个部分:第一是中断中的处理,将帧原创 2020-06-06 20:35:41 · 441 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第8章 设备注册和初始化
设备注册和初始化原创 2020-06-04 22:53:19 · 1389 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第7章 组件初始化的内核基础架构
组件初始化的内核基础架构引导期间的内核选项注册关键字两遍分析使用引导选项配置网络设备模块初始化代码新模型:宏卷标引导期间的内核选项Linux允许用户把内核配置选项传递给引导程序,可以使用此机制在引导期间调整内核。parse_args函数用于解析输入字符串,输入字符串是形如 key=value形式的参数。寻找到特定关键字后,启用适当的处理函数。注册关键字内核组件使用__setup宏,注册关键字和处理函数。如网络子系统注册的关键字__setup("netdev=", netdev_boot_setu原创 2020-06-02 23:05:18 · 268 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第6章 PCI层和网卡
PCI层和网卡数据结构PCI NIC设备驱动程序注册电源管理和网络唤醒PCI NIC驱动程序注册范例数据结构pci_device_idpci_device_id设备标识符,这不是Linux使用的本地ID,是根据PCI标准定义的IDpci_dev每个PCI设备都会被分派一个pci_dev实例,这个结构由内核引用一个PCI设备pci_driver定义PCI层和设备驱动程序之间的接口。这个结构主要由函数指针构成。所有的PCI设备都会使用这个结构。name驱动程序的名称id_table原创 2020-06-01 21:12:49 · 278 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第5章 网络设备初始化
网络设备初始化内核初始化设备注册和初始化NIC初始化设备与内核交互硬件中断中断类型中断共享设备处理层初始化热插拔hotplug内核初始化当内核引导时,会执行start_kernel函数,start_kernel函数对一些子系统做初始化,start_kernel函数终止前调用init内核线程,由其负责后续的初始化。引导期间选项start_kernel函数里调用两次parse_args,一次是通过parse_early_param间接调用。这两个用于处理引导加载程序(BOOTLOAD,LILO或GR原创 2020-05-31 23:06:47 · 541 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第4章 通知链
通知链概述定义通知链注册通知链通知链事件通知网络子系统的通知链概述内核多个子系统之间具有相互依赖性,因此一个子系统需要侦测或产生其他子系统感兴趣的事件。在网络协议栈中,比如路由子系统对网卡设备的UP、DOWN就非常感兴趣,路由子系统根据网卡产生的事件执行相应的动作。通知链就是一个函数链表,当给定的事情发生时,就调用链表中的所有的函数。通知链有两个角色:被通知者(notified),注册回调函数给通知者。通知者(notifier),产生事件并调用回调函数。定义通知链内核使用struct n原创 2020-05-31 19:02:11 · 224 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第3章 用户空间与内核空间接口
用户空间与内核空间接口概述procfssysctlioctlNetlink概述Linux内核协议栈和用户空间交互的接口有:procfs文件系统sysctl(/proc/sys目录)sysfs文件系统ioctl系统调用Netlink套接字这是网络应用程序与内核通信的最新机制。IPROUTE2包中大多数命令都使用这个接口。procfs大多数网络功能在初始化时在/proc/下注册一个多个文件,当用户空间读取这个文件的时候,会调用内核函数,返回某种输出内容。网络协议栈的文件一般放在/proc原创 2020-05-31 16:45:50 · 288 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第2章 关键数据结构
sk_buff结构这个结构是Linux网络协议栈中最重要的结构之一,代表接收或要传输的数据。不同的网络层都会使用这个结构,这个结构在不同层之间传递,不同的协议会传递这个值,结构内的字段相应的改变。struct sk_buff_head结构的next和prev字段必须是第一个,要和struct sk_buff一致,这样他们可以放到一个链表中。布局字段内核有一个双向链表维护所有的sk_buff结构。内核用struct sk_buff_head 记录了该链表信息。struct sk_buff_head原创 2020-05-31 11:25:38 · 424 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第1章 简介
内存缓存内核使用kmalloc和kfree分配和释放内存块。对于常用的数据结构比如struct skb_buff等内核通常分配一块内存缓冲区用于常用数据结构的申请和释放。处理内存缓存相关的函数kmem_cache_createkmem_cache_destroykmem_cache_allockmem_cache_free引用计数为了避免访问已经释放的数据结构,同时让垃圾回收机制更加容易和有效率,很多数据结构会设置引用计数(reference count)。对于数据结构的存储和释放,内核原创 2020-05-23 15:18:51 · 314 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第24章 L4协议RAW IP处理
L4协议注册L4协议由struct net_protocol描述,其中的handler作为处理报文的函数,err_handler由ICMP协议处理函数所用的函数,用于通知L4协议收到ICMP UNREACHABLE消息。/* This is used to register protocols. */struct net_protocol { int (*early_demux)(struct sk_buff *skb); int (*early_demux_handler)(struct原创 2020-05-16 12:53:41 · 626 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第22章 处理分段
处理分段IP分片IP分片IP层如果确定一个IP报文分片:第一个分片offset=0且MF=1中间的分片offset>0且MF=1最后一个分片offset>0且MF=0旧版本的内核在IP层处理IP分片,发送数据的函数可以接受0-64KB数据,当报文大于PMTU时,就必须把数据分割成多个IP报文。最近的版本是让L4协议协助分片任务,L4协议传递一组和PMTU匹配的缓冲区,IP层只需要为每个缓冲区增加IP头即可。分片方式快速分片慢速分片IP分片主要任务:把L3数据分成较原创 2020-05-13 22:37:30 · 634 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第21章 传输
传输是指报文离开本地到另外一台主机,可以由L4层或转发调用。在此之前,内核需要做的准备包括:查询路由子系统下一跳初始化IP头处理选项分段校验和传输相关重要函数ip_queue_xmit L4协议吧PMTU考虑后,已经把数据切成合适大小的段,IP层只要加上IP头。ip_push_pengding_frames 调用该函数的L4协议不考虑IP分片相关操作。ip_append_data用来存储几个传输请求而不传输任何东西。使得IP层更容易处理分片,提高性能。当L4必须刷新数据时调用ip_pu原创 2020-05-12 22:28:12 · 623 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第20章 IPV4转发和本地传递
转发原创 2020-05-10 17:44:24 · 319 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第19章 IPv4 Linux原理和功能
Linux内核ipv4相关数据结构struct iphdrIP报文头struct ip_option存储被传输或转发的封包选项。struct ip_optionip分度的片段集struct ip_option内核为最近连接过的每个远程主机都保留一个该结构。struct in_device存储一个网络设备所有与IPV4相关的配置内容。sk_buff和net_device结构里与校验和相关字段net_device->features字段中有些标记可以用于定义设备硬件校验和能力.原创 2020-05-10 11:33:23 · 1305 阅读 · 0 评论 -
深入理解Linux网络技术内幕 第18章 IPv4协议介绍
LINUX内核协议栈-IPv4IPv4协议字段版本报文长度服务类型分段和重组相关字段存活时间(ttl)协议源地址、目的地址选项字段IP选项IPv4协议字段版本IP协议的版本,值为4。报文长度以32位为单位。服务类型该字段最初是为了协助QoS(Quality of Service 服务质量),就是通知路由器此封包的传送者希望传输时的偏好:最小时延、最大吞吐等。总长度:ip报文的总长度...原创 2020-05-08 22:02:43 · 512 阅读 · 0 评论