第12章 网络 (6)

news2024/9/21 22:35:14

12.8 网络层

12.8.4 分组转发

转发IP分组,根据目标地址分为:

        1. 直接和本地相连。

        2. 不直接相连,需要网关转发。

int    ip_route_input_noref(skb,   daddr,   saddr,   tos,   net_dev):

        //查找路由表。

如果 skb->_skb_refdst 成员缓存了 struct   dst_entry 信息,无需查找路由表。

ip_forward 流程:

ip_forward_options:

        处理IP选项。

最后调用 skb->dst->output,即 ip_output。

struct   sock   {

        struct   dst_entry   *sk_dst_cache;         //缓存的路由结构体。

}

如何缓存一个struct   dst_entry     dst ?

        rcu_assign_pointer(sk->sk_dst_cache,   dst);

所以若同一 socket 的所有分组的目的地址都相同,则只需在发送第一个分组时查找 struct  dst_entry。

        后续分组可使用缓存的 struct  dst_entry。

12.8.5 发送分组

ip_queue_xmit:更高层协议使用,如TCP,UDP。

举例:

tcp_transmit_skb ->

        icsk->icsk_af_ops->queue_xmit(skb,   &inet->cork.fl);

                // 即 ip_queue_xmit ()

所以 转发和本地发送的数据,都最终调用 ip_output。

1. 转移到网络访问层

int   ip_output(struct  sk_buff   *skb)

{

        struct net_device  *dev   =   skb_dst(skb)->dev;

        skb->dev   =   dev;         //将skb->dev改为路由表指示的出口设备。

        NF_HOOK_COND(NFPROTO_IPV4,   NF_INET_POST_ROUTING,   skb,   ,   dev,

 ip_finish_output,  );

}

dst->neighbour->output   =   dev_queue_xmit;

        neighbour:ARP层相关。

dev_queue_xmit

        -> dev_hard_start_xmit

                -> ops->ndo_start_xmit(skb, dev); //不同网卡的驱动自定义。

2. 分片

分片原理:

ip_fragment:实现分片,并发送。

        包括:

                设置分片偏移量。

                除最后一个分片都设置MF标志。

3. 路由

struct   dst_entry   {         // 路由查找时填充成员。

        struct   net_device         *dev;

        int         (*input)(struct sk_buff   *);           //  处理进入分组。

        int         (*output)(struct sk_buff   *);         // 处理外出分组。

};

                                本地                         转发

input指针                 ip_local_deliver        ip_forward

output指针               ip_ouput                   ip_ouput

struct   neighbour    {         //就是ARP表项,存储本地网络的IP和硬件地址。

        struct neighbour           *next;

        struct neigh_table         *tbl;

        unsigned char         ha[ALIGN(MAX_ADDR_LEN,   sizeof(unsigned long))];

                //硬件地址

        int                 (*output)(struct  neighbour   *,    struct  sk_buff   *);

                // 用于转发数据包时发送数据包到邻居设备上。

                //通常为dev_queue_xmit; ,最终调用网卡实现的 ndo_start_xmit 函数指针。

        struct   net_device         *dev;

};

12.8.6 netfilter

1. 扩展网络功能

netfilter可扩展的功能:

        1. 不同方向的包过滤。

        2. NAT。

        3. 拆分、修改包。

2. 调用钩子函数

netfilter钩子函数会中断网络层函数。

如何调用钩子函数?

        使用宏 NF_HOOK

int   NF_HOOK(uint8_t pf,   unsigned int   hook,   struct sk_buff   *skb,   struct net_device   *in, struct net_device   *out,   int   (*okfn)(struct sk_buff *))

NF_HOOK

        -> NF_HOOK_THRESH(INT_MIN)

int   NF_HOOK_THRESH(pf,   hook,   skb,   in,   out,   okfn,   INT_MIN)

        //所有钩子函数都执行,因为INT_MIN值的最小

{

        int   ret    =    nf_hook_thresh(pf,   hook,    skb,    in,   out,    okfn,   thresh);

                //nf_hook_thresh->nf_hook_slow

        if (ret    ==    1)         //ret=1 即没有注册钩子函数

                ret    =    okfn(skb);

}

宏的参数介绍:

        pf:

                调用哪个协议族的钩子函数。

        hook:钩子编号。如:

                NF_IP_FORWORD

                NF_IP_LOCAL_OUT

        okfn:

                钩子函数结构后执行。

        thresh:

                优先级高于该值的钩子函数都将执行。

                最小为:INT_MIN,此时所有钩子函数都执行。

使用举例:

int    ip_forward(struct    sk_buff    *skb)

{

        ...

        return   NF_HOOK(NFPROTO_IPV4,    NF_INET_FORWARD,   skb,   skb->dev,

  rt->dst.dev,   ip_forward_finish);

}

所以 NF_INET_FORWARD 钩子函数执行完后,就调用okfn函数,即ip_forward_finish。

如果:

        1. 内核没有开启CONFIG_NETFILTER。

                或

        2. 没有注册对应pf,hook钩子函数。

则不调用钩子函数,直接执行okfn函数,即ip_forward_finish。

ip_forward_finish:实现转发操作,包含:

        1. 递减TTL(生存时间)。

        2. 修改 IP包头。

        3. 调用dev_queue_xmit。

        4. 更新路由缓存项,以加速下一次路由。

当没有配置CONFIG_NETFILTER:

        #define    NF_HOOK(pf,    hook,    skb,    indev,    outdev,   okfn)

                (okfn)(skb)

3. 扫描挂钩表

nf_hook_slow:扫描钩子链表。

所有的钩子函数保存在:

struct list_head    nf_hooks [ NFPROTO_NUMPROTO ] [ NF_MAX_HOOKS ];

NFPROTO_NUMPROTO:

        支持的协议族数量。如IPV4,IPV6,ARP,BRIDGE。

        默认值:13。

NF_MAX_HOOKS:

        一个协议族最多的挂钩链表。

        默认值:8。

最多链表数量:13 * 8。

IPV4协议族定义 5 个链表:

        NF_INET_PRE_ROUTING

        NF_INET_LOCAL_IN

        NF_INET_FORWARD

        NF_INET_LOCAL_OUT

        NF_INET_POST_ROUTING

这 5 个链表中连接了各自钩子函数。

钩子函数用 nf_hook_ops 表示:

        struct nf_hook_ops         *arpfilter_ops;

        struct nf_hook_ops         *mangle_ops;

        struct nf_hook_ops         *filter_ops;

        struct nf_hook_ops         *ipv4_conntrack_ops;

        struct nf_hook_ops         *rawtable_ops;

        struct nf_hook_ops         *ebt_ops_filter;

struct   nf_hook_ops   {

        struct list_head    list;

        nf_hookfn            *hook;         // 钩子函数。

        u_int8_t                pf;             // 协议族。

        unsigned int         hooknum;

                // 钩子编号,如 NF_INET_POST_ROUTING

        int                         priority;

                // 钩子的优先级。按先后执行。

                //如 INT_MIN

};

nf_hook_slow

        -> nf_iterate

nf_iterate:执行指定协议族,指定钩子编号中注册的所有钩子函数。

        如:

                协议族为NFPROTO_IPV4,

                钩子编号为NF_INET_POST_ROUTING。

                (当然是,大于指定优先级的所有钩子函数。)

4. 激活钩子函数

钩子函数的返回值:

        1. NF_ACCEPT:

                包通过当前检查点,继续协议栈后续处理。

        2. NF_DROP:

                该包将被丢弃。无需其他处理。

        3. NF_QUEUE:

                包被送到用户空间的一个队列中,供用户态程序后续处理。

                不再执行其他钩子函数。

        4. NF_REPEAT

                重复执行当前hook链规则检查。

12.8.7 IPv6

1. 概述

IPv6地址长度:128位。

注:IPv5名称被STP协议使用。

IPv6 报文格式:

2. 实现

IPv6低层和IPv4低层一样。

IPv6不会分片,所以帧格式中无需分片信息。

IPv6处理流程:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安捷伦色谱仪器LabVIEW软件替换与禁运配件开发

可行性分析及实现路径 可行性: 软件替换: 驱动程序支持: 要实现LabVIEW对安捷伦色谱仪器的控制,需要检查安捷伦是否提供LabVIEW驱动程序。如果没有现成的驱动,则可能需要开发自定义的驱动程序,通过LabVIEW…

微软推出全新多语言高质量Phi-3.5语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

css flex布局 justify-content: space-between 最后两张居左

比如如果是8张&#xff0c;最后两张两边对齐&#xff0c;第八张最后一张 放个占位符就OK了 <div class"previewPadding flex" > <div class"picList picList3" v-for"(item,index) in picDataList" :key"index"> <…

6个免费字体网站,无需担心版权问题~

在设计项目中&#xff0c;选择合适的字体至关重要。然而&#xff0c;许多高质量的字体往往价格不菲。幸运的是&#xff0c;有一些网站提供了免费的商用字体&#xff0c;既能满足设计需求&#xff0c;又不需要额外的预算。在这篇文章中&#xff0c;分享6个免费商用字体网站&…

济南网站制作方案定制

在当今数字化时代&#xff0c;拥有一个专业的网站已经成为企业发展不可或缺的一部分。济南作为山东省的省会&#xff0c;经济发展迅速&#xff0c;各行各业对网站制作的需求也日益增加。因此&#xff0c;定制化的网站制作方案在济南显得尤为重要&#xff0c;能够帮助企业在激烈…

深入探究为什么 RAG 并不总是按预期工作:概述其背后的业务价值、数据和技术。

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 欢迎来到雲闪世界。我们将首先探讨决定基于 RAG 的项目成败的业务要素。然后&#xff0c;我们将深入探讨常见的技术障碍&#xff08;从数据处理到性能优化&#xff09;&#xff0c;并讨论克服这些障碍的策略…

数据结构(邓俊辉)学习笔记】优先级队列 10——左式堆:插入 + 删除

文章目录 1. 插入即是合并2. 删除亦是合并 1. 插入即是合并 以上&#xff0c;我们已经实现了&#xff0c;对于左式堆来说最为在意的合并算法。非常有意思的是&#xff0c;尽管合并操作并非优先级队列所要求的基本操作接口。但基于合并操作&#xff0c;我们却同样可以实现左式堆…

超全大模型训练流程,教你如何训练自己的大模型

“大模型的核心主要有两部分&#xff0c;一是训练数据&#xff0c;二是机器学习模型。” 现在大模型发展得如火如荼&#xff0c;但是没有学过人工智能技术的开发者&#xff0c;只会调用其接口&#xff0c;但不清楚怎么训练一个大模型。 今天就简单介绍一下自己的理解&#xf…

Transformer系列-10丨一文理解透Transformer

一、引言 "Attention Is All You Need"是一篇于2017年发表的开创性论文&#xff0c;首次介绍了Transformer模型。 这篇论文彻底改变了自然语言处理&#xff08;NLP&#xff09;领域的研究方向&#xff0c;为后续的众多NLP模型和应用奠定了基础。我们熟知的ChatGPT也…

【022】字符串的处理(输出,分割,删除,新增,替换,查找,长度)_#VBA

字符串的处理——输出,分割,删除,新增,替换,查找,长度 字符串的处理1. 输出2. 长度3. 查找4. 删除5. 新增6. 分割7. 替换字符串的处理 为了更好快捷查找对应的字符串处理方法,将对应的方法汇总,可以直接使用,没有过多的介绍,直接代码块及对应效果。包括字符串的输出…

全国上市公司网络安全风险指数(2001-2023年)

数据来源&#xff1a;本数据参考耿勇老师等&#xff08;2024&#xff09;做法采集了2001-2023年的上市公司年报&#xff0c;所有年报均来自于深交所和上交所官方网站&#xff0c;通过对上市公司的年报进行精读&#xff0c;提取出包括网络安全、网络攻击等在内的39个关键词构成企…

自定义@ResponseBody以及SpringMVC总结

文章目录 1.需求分析2.目录3.自定义ResponseBody注解4.MonsterController.java5.Monster.java 实现序列化接口6.引入jackson7.Adapter.java 如果有ResponseBody注解就返回json8.测试9.SpringMVC执行流程 1.需求分析 2.目录 3.自定义ResponseBody注解 package com.sunxiansheng…

大数据技术之 Flume概述、安装(1)

目录 Flume 概述 Flume 定义 为什么选用 Flume Flume 基础架构 Agent Source Sink Channel Event Flume 安装 Flume 安装部署 安装地址 安装部署 Flume 概述 Flume 定义 Flume 是 Cloudera 提供的一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。Flume…

多系统萎缩不慌张,这些维生素是你的“守护神”✨

亲爱的朋友们&#xff0c;今天我们来聊聊一个可能不太为人熟知但至关重要的健康话题——多系统萎缩&#xff08;MSA&#xff09;。面对这样的挑战&#xff0c;除了医疗治疗&#xff0c;日常的营养补充也是不可或缺的一环。特别是维生素&#xff0c;它们在我们的身体中扮演着举足…

有无符号整形加减,截断,提升等问题解析

一&#xff1a;整形截断问题 1. 分析&#xff1a;-128 的原码是 10000000 00000000 00000000 10000000 补码是 11111111 11111111 11111111 10000000&#xff0c;因为是char 型&#xff0c;截断之后&#xff1a;10000000 %u 是打印无符号整数&#xff0c;整形提升补截断之后…

多态(详细介绍以及内存图展示)

什么是多态&#xff1f; 同类型的对象&#xff0c;表现出的不同形态 多态的表现形式 父类类型 对象名称 子类对象 多态的前提 1.有继承关系 2.有父类引用指向子类 Fu f new Zi() 3.有方法重写 多态的好处 使用父类型作为参数&#xff0c;可以接收所有子类对象 体现…

大模型从入门到精通,看这篇就够了,AI小白的大模型学习路径_大模型教程

写这篇文章的初衷&#xff1a;作为一个AI小白&#xff0c;把我自己学习大模型的学习路径还原出来&#xff0c;包括理解的逻辑、看到的比较好的学习材料&#xff0c;通过一篇文章给串起来&#xff0c;对大模型建立起一个相对体系化的认知&#xff0c;才能够在扑面而来的大模型时…

牛客小白月赛99

文章目录 A.材料打印B. %%%C.迷宫又是一年毕业季题目链接 A.材料打印 签到题&#xff0c;直接按照题意输出就行。赛时写的有点慢了&#xff0c;这种题应该一分钟之内写完的 void solve () {int n;cin>>n;for (int i1;i<n;i) {int a,b,c,d;cin>>a>>b>…

go const(常量)

常量介绍 示例 package mainimport ("fmt" )func main() {const name "tom"fmt.Println(name)const tax float64 0.8fmt.Println(tax) }go run const.go tom 0.8package mainimport ("fmt" )func main() {const a intfmt.Println(a) }go run…

SpringAop介绍与使用

AOP的介绍 在不修改原有代码的情况下 增强跟主要业务没有关系的公共功能代码到 之 前写好的方法中的指定位置 这种编程的方式叫AOP AOP的底层用的代理&#xff0c;代理是一种设计模式 静态代理 玩家类 代理类 他们的接口 最后用接口接收代理的类实现静态代理 总结&#x…