皮鞋进水发胖之后怎样才会恢复原样?拥有八块腹肌的中国浙江温州小型皮鞋厂老板也没有办法。


今天花了太多时间聊一些形而上意义上的东西,所以本文形而下。


今天时间不多,直奔主题。

我准备两台虚拟机,设为主机A,主机B,分别用其eth0接口直连,配置如下:

# 主机A-eth0 直连 主机B-eth0
# 主机A
eth0:1111:1111::101/64# 主机B
lo:1111:1111::110/64
eth0:1111:1111::123/64

如果如上述这般配置,那么协议栈显然会生成下面的相关路由(确实也是的):

# 主机A
1111:1111::/64 dev eth0 proto kernel metric 256# 主机B (两种情况,1111:1111::/64 的链路层路由和unreachable路由的先后顺序取决于eth0口和lo口上地址的添加顺序!)
1111:1111::/64 dev eth0 proto kernel metric 256
unreachable 1111:1111::/64 dev lo proto kernel metric 256 error -101
# 或者
unreachable 1111:1111::/64 dev lo proto kernel metric 256 error -101
1111:1111::/64 dev eth0 proto kernel metric 256

现在,从主机A来ping主机B的lo口地址1111:1111::110,无论主机B的eth0口和lo口的地址添加顺序如何导致无论哪种路由表项顺序,都是可以ping通的。然而从主机B主动ping主机A的eth0地址1111:1111::101,两种路由表项顺序结果是不同的:

  • unreachable路由在链路层路由前面,则ping不通。
  • 链路层路由在unreachable路由前面,则能ping通。

有点儿意思。

这是为什么?

难道IP协议不是 无方向无连接无状态的 吗?答案当然是肯定的!那么为什么会出现上面不对称的结果?


仔细观察上述的两条路由:

unreachable 1111:1111::/64 dev lo proto kernel metric 256 error -101
# 和
1111:1111::/64 dev eth0 proto kernel metric 256

它们之间的不同点太多,但是仅有 metric 是标准IP路由认识的,遗憾的是,二者的metric相同,这让我们想不通的是:

  1. 在主机A ping主机B时,主机B收到主机A的ICMPv6 Echo Request的时候,Linux内核协议栈到底check了哪些字段致使无论哪种路由排列都能ping通呢?
  2. 在主机B主动ping主机A时,两条路由中又是哪些字段让数据包优先匹配第一条匹配到的路由呢?

长篇大论无益,以后再说,这里直接说结论,关键的字段就是 dev ,即 路由项的出口网卡 字段。

以下简单解释。


首先几条路由可以等价为:

1111:1111::110/128 dev lo IN local
1111:1111::/64 dev lo unreachable
1111:1111::/64 dev eth0 onlink

当从主机A去ping主机B的时候,Echo Request数据包从主机B的eth0进入,显然目标地址会在Local路由表命中,然后主机B协议栈会回复Echo Reply。

此时Reply的目标地址是 1111:1111::101 ,查询路由表。

如果按照目标地址为健值查询的话,即便从metric看,两条路由均将命中,那么到底选择哪一条呢?

这里,TCP/IP协议栈的实现者按照check source的原则,定制了默认规矩,即 数据包从哪个网卡进入,它的回包将会从哪个网卡出去!

于是乎,从过主机B接收到主机A的主动请求,无论是ping的Echo Request还是TCP的Syn,它们均将从eth0被收入,那么回复Echo Response或者TCP的Syn/ack时,它们就理应从主机B的eth0出去,于是乎,在回包查询路由表时,自然而然就会加上 “出口网卡是eth0” 这么一个约束!

这样答案不就明确了吗?如果是从主机A主动去ping主机B,那么回包的路由肯定会匹配到主机B关于 1111:1111::/64dev eth0 链路层路由 ,而不会匹配到unreachable路由,这也就解释了为什么A ping B总是通的。

那么从主机B主动去ping或者telnet 主机A呢?

很显然,此时在查询路由表之前,并不知道要从那块网卡出去,这个时候,关于1111:1111::/64的链路层路由和unreachable路由是完全等价的,当然是谁排在前面那就选谁咯!

更加细节且有趣的是,IPv6在Linux内核协议栈中的组织采用了Trie树数据结构,它不像链表那般稳定,因此两条路由的顺序,还真的不一定。这还只是Linux的实现,还没说BSD和Windows呢…


看下代码,便可安睡?嗯,对于我等码农而言,是的!不说ICMP,就说说更加激烈的TCP吧。

在一个TCP服务端收到TCP客户端主动的SYN报文的时候,会回复SYN/ACK报文,在这个SYN/ACK报文的回复前,需要查找路由,在初始化路由查找键的时候,就会把出口网卡给引入,它的值,便是SYN报文的入口网卡:

关于ICMPv6报文,请自行解析!


浙江温州皮鞋湿;
下雨进水不会胖。

关于一个lo接口IPv6 unreachable路由的细节相关推荐

  1. linux添加ipv6静态路由命令,Debian下配置IPV6和静态路由

    一.编辑网卡文件 vi /etc/network/interfaces 二.修改网卡文件# This file describes the network interfaces available o ...

  2. IPv6静态路由怎么配置?

    建议写法: ipv6 route 2001::/64 e0 fe80::1234:abcd:1234:abcd (下一跳的link local地址) <RIP>--ripng 在IPV6中 ...

  3. 快速搭建一个网关服务,动态路由、鉴权看完就会(含流程图)

    [文章来源]https://sourl.cn/tcbSPi 前 言 本文记录一下我是如何使用Gateway搭建网关服务及实现动态路由的,帮助大家学习如何快速搭建一个网关服务,了解路由相关配置,鉴权的流 ...

  4. 快速的利用 Express 框架实现一个 Rustfull 接口的后端 Server

    快速的利用 Express 框架实现一个 Rustfull 接口的后端 Server 附:基于 Nodejs 的服务器后端的框架用的比较多的是 Koa : github/kaojs/koa 但本文这里 ...

  5. VLAN间路由:每个VLAN一个物理连接,单臂路由,三层交换

    VLAN间路由3种方式:每个VLAN一个物理连接,单臂路由,三层交换. 每个VLAN一个物理连接:在路由器上为每个VLAN分配一个单独的接口,并使用一条物理链路连接到二层交换机上.当VLAN间的主机需 ...

  6. linux使用虚拟ip路由问题,linux – 来自主机的虚拟机的IPv6公共路由

    所以我有一个来自OVH的专用服务器.有了这个,我得到了64位IPv6地址和1个公共IPv4地址.我购买了第二个IPv4地址作为后备. 主机正在运行Xen管理程序,我已经设置了桥 bridge name ...

  7. 下一代互联网实验:IPv6静态路由和路由汇总 IPv6 to IPv4 隧道 IPv6 NAT-PT 配置

    目录 实验一  IPv6静态路由和路由汇总 实验二 IPv6 to IPv4 隧道 实验三 IPv6 NAT-PT 配置 实验一  IPv6静态路由和路由汇总 实验目的 1.掌握基本的 IPv6 地址 ...

  8. ipv6 华为交换机 路由配置_利用华为ENSP模拟器实现IPv6与IPv6默认路由与静态路由的配置...

    1.1[实验目的] 1.理解汇总路由的运作原理. 2. 深刻理解IPv6协议原理. 3.掌握IPv6默认路由的配置方法 4.掌握IPv6静态路由的配置方法 1.2[实验环境] ENSP模拟器 路由器获 ...

  9. 计算机命令跟踪,如何使用tracert这一个命令跟踪IPv6路径

    网络协议为计算机网络中进行数据交换而建立的规则.标准或约定的集合.例如,网络中一个微机用户和一个大型主机的操作员进行通信,由于这两个数据终端所用字符集不同,因此操作员所输入的命令彼此不认识.一起跟着小 ...

最新文章

  1. 【Go】Go基础(四):流程控制(控制结构)
  2. Spring 命名空间
  3. Linux-鸟菜-6-文件与目录管理
  4. tableau实战系列(七)-服务器日志清理和级别设置
  5. linux学习网站分享
  6. java定义基础变量语句_java语言基础-变量
  7. jpa中::::_项目学生:JPA标准查询
  8. This time, ZTE has released the world‘s first
  9. leetcode28 Implement strStr() 在字符串中寻找目标字符串
  10. 修改ORACLE RAC的字符集(记录一下)
  11. Bluetooth的profile总结
  12. 二级python有必要买书吗_清华大学出版社-图书详情-《二级Python编程指南》
  13. c#图解教程和c#高级编程电子书链接
  14. 各种泵的图形符号_液压泵以及液压马达的常见图形符号
  15. 主控芯片测试软件,主控芯片检测工具MyDiskTest的使用教程的详解【图文】
  16. 如何解除电子书DRM限制
  17. chm文件转换成单个html
  18. Globally and Locally Consistent Image Completion 实验记录
  19. 在2147483647的边缘疯狂试探
  20. PPT:灯塔工厂相关介绍

热门文章

  1. deb 中标麒麟_中标麒麟6安装google chrome浏览器遇到的问题及解决
  2. b树的表示形式_B.Com的完整形式是什么?
  3. 美通社企业新闻汇总 | 2019.1.11 | 耐克中国物流中心升级,属于中国味蕾的黑珍珠餐厅指南发布...
  4. 程序员的写作课:四、我们如何管理素材
  5. 4、IOC 之Bean的依赖关系
  6. 上海控安入选首批工控安全防护能力贯标咨询机构名单
  7. 2008年8月26号,星期二,晴。欲穷千里目,更上一层楼。 —— 王之涣《登鹳雀楼》今天是我博士生涯的第51天,争吵,分歧,以自我为中心的考虑问题,那个关键问题
  8. 另眼看iPad发布。
  9. 这个IDEA插件可以帮你少写30%的代码
  10. 日文输入手写汉字模式快速切换