路由下一跳中的变数exception

2023-12-19 10:58
文章标签 路由 exception 变数

本文主要是介绍路由下一跳中的变数exception,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内核通过查询转发信息表(fib_lookup),得到下一跳(fib_nh),从而得到了关于此条路由的相关信息,其中重要的包括下一跳设备nh_dev,下一跳网关nh_gw等。然而,关于此条路由可能存在两个变数exception,其一是这条路由相关的路径MTU(PMTU)发生改变;其二是收到了关于此条路由的ICMP重定向报文。由于此两种改变并不是永久的,内核将他们保存在下一跳fib_nh的exception中。


路径MTU改变

内核接收到目的地址不可达(ICMP_DEST_UNREACH)类型的ICMP消息,判断其code为ICMP_FRAG_NEEDED,需要更新pmtu。此时,内核会创建一个下一跳exception(fnhe)保存新的mtu值:

static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
{if (fib_lookup(dev_net(dst->dev), fl4, &res, 0) == 0) {struct fib_nh *nh = &FIB_RES_NH(res);update_or_create_fnhe(nh, fl4->daddr, 0, mtu,jiffies + ip_rt_mtu_expires);}
}


路由重定向

内核接收到重定向(ICMP_REDIRECT)类型的ICMP消息,调用update_or_create_fnhe函数创建或者更新路由下一跳exception,设置新的网关地址new_gw。

static void __ip_do_redirect(struct rtable *rt, struct sk_buff *skb, struct flowi4 *fl4, bool kill_route)
{//ICMP头中给出了重定向的新网关IP地址。__be32 new_gw = icmp_hdr(skb)->un.gateway;//发送此ICMP消息的设备为旧网关,saddr为其IP地址__be32 old_gw = ip_hdr(skb)->saddr;struct neighbour *n;n = __ipv4_neigh_lookup(rt->dst.dev, new_gw);if (!n)n = neigh_create(&arp_tbl, &new_gw, rt->dst.dev);if (!IS_ERR(n)) {if (fib_lookup(net, fl4, &res, 0) == 0) {struct fib_nh *nh = &FIB_RES_NH(res);update_or_create_fnhe(nh, fl4->daddr, new_gw,0, jiffies + ip_rt_gc_timeout);}}
}


路由exception查询


查询操作会跳过下一跳(fib_nh->nh_gw下一跳中的nh_gw的值可能已不是最新),首先查询是否存在exception,如果存在,rtable使用exception保存的相关值,包括fnhe_pmtu、fnhe_gw等。

static void fill_route_from_fnhe(struct rtable *rt, struct fib_nh_exception *fnhe)
{rt->rt_pmtu = fnhe->fnhe_pmtu;rt->dst.expires = fnhe->fnhe_expires;if (fnhe->fnhe_gw) {rt->rt_flags |= RTCF_REDIRECTED;rt->rt_gateway = fnhe->fnhe_gw;rt->rt_uses_gateway = 1;}
}

内核版本

linux-4.14.4


这篇关于路由下一跳中的变数exception的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

【vue3|第28期】 Vue3 + Vue Router:探索路由重定向的使用与作用

日期:2024年9月8日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083;0.98365 = 0.0006 说

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置

myEclipse失去焦点时报错Unhandled event loop exception的解决方案

一句话:百度杀毒惹的祸。。。。果断卸载后问题解决。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArra

这个错误说的是一个不可变数组负值给了一个可变的数组。有可能你前面定义的数组是一个可变数组,但是在你其他方法里面用他的时候,他就是一个不可变数组,因为在可变数组拿到别的地方用的时候,他会默认为不可变的,可能这只是一个类里面你只是简单的声明了他吧,并没有进行对他初始化,或者分配什么内存,所以他只是一个不可变的数组,当你在其他地方用他的时候,他就默认为不可变的数组,他可能因为你的没分配内存,而变回不可变

Exception in plugin Android ButterKnife zelezny

所在页面的布局文件命名id有问题,不能有两个下划线,,如tv__name

深入拆解 Java 虚拟机 】Exception异常笔记

【深入拆解 Java 虚拟机 】Exception异常笔记 try-with-resource语法糖finally try-with-resource语法糖 try后对象的close方法都会被运行。 package com.exception.demo;public class Foo implements AutoCloseable {private final Strin

微信小程序路由跳转之间的区别

navigateTo: 功能描述: navigateTo用于保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。 页面栈变化: 当使用navigateTo进行页面跳转时,当前页面会被推入页面栈中,但不会被销毁,新页面则显示在屏幕上。因此,页面栈中的元素数量会增加。 注意:一般定制返回时候不要用navigateTo,用navigateBack,否则会导致页面栈过多。 nav

如何为 DigitalOcean 静态路由操作员设置故障转移

静态路由操作器的主要目的是提供更大的灵活性,并在 Kubernetes 环境中控制网络流量。它使你能够根据应用程序的需求自定义路由配置,从而优化网络性能。该操作器作为 DaemonSet 部署,因此将在你的 DigitalOcean Managed Kubernetes 集群的每个节点上运行。 在本教程中,你将学习如何根据 CRD 规范管理每个工作节点的路由表,并设置故障转移网关。