关于IP网段间互访的问题—路由是根本

2024-04-30 14:08

本文主要是介绍关于IP网段间互访的问题—路由是根本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之所以IP网段间可以互相访问,完全靠的就是路由,因此路由是IP通信的根本,ip是机器可以进行通信的资格证书,而路由决定该机器的数据可以到哪以及如何到。没有路由就不可能有IP网络,IP其实就是一个标号,而IP路由就是精心设计的基于这种标号的寻址机制。这种逻辑上的解决方案使整个世界连接在了一起从而成为一个整体,前面说过,ip提供了一个逻辑的物理层,而传输层就是逻辑上的链路层,那么整个ip网络就是一个逻辑网络,这个逻辑网络丝毫不会在意下面的物理网络,也就是说不会在意下面的链路层和物理层。逻辑网络和下面的物理网络比如以太网建立关系的时候就是给网卡分配ip地址的时候,毕竟ip网络只是一个逻辑意义上的网络,想要实际传输数据还是要靠物理网络承载,将ip地址分配给网卡就是表示需要这个网卡作为ip数据传输的载体,就是需要这个网卡传输到这个ip的或者从这个ip发出的数据,网卡只是一个承载层,当然可以承载多个ip的数据,就好比一辆卡车可以装载多种货物一样,一个人也可以身兼数职,这里人是物理概念,而职位是逻辑概念,职位给了一个人,这个人只是这个这个职位行为的执行者,具体如何执行还要看职位本身的指示,因此将ip地址给了网卡,网卡不知道如何传输ip数据,网卡的作用再次重申,就是一个承载方,它只提供物理连接的两点的传输机制而已,记住是物理相连的两点,如果想让一切工作起来,那么就要靠路由,路由就是IP逻辑网络这个“职位”的规则,它指示如何传输数据。
原则上你可以给一块网卡分配任意数量的IP,然后为这些ip地址指定路由就可以了,在这块网卡上你只能指示往哪个目的ip地址的数据往哪个网口走,给这块网卡分配多个ip地址意味着这些ip可以被寻到,也就是说有数据是以这些ip地址为目的的,因此你必须保证在别的机器或者路由器上配置指向这些ip的路由,只有这样,数据才能有去有回来往畅通,每个路由记录会指示数据怎么走,走的时候还是要一步一步走的,一步一步走就是通过底层的物理承载网络走的。只要你指定了路由,那么数据就可以通信,逻辑ip网络和物理的链路层网络的关系除了承载与被承载之外其实并不大,也就是说并不是一个物理网络的ip地址也必须是一个网段的,只要有路由就可以。举个例子:
将一台单网卡的linux机器M1的eth0配置如下两个ip(ip addr add):
eth0:
inet 192.168.0.152/24 brd 192.168.0.255 scope global eth0
inet 172.16.0.5/32 scope global eth0
然后将另一台单网卡的linux机器M2的eth0配置如下的一个ip:
eth0:
inet 10.2.2.5/24 brd 10.2.2.255 scope global eth0
保证两台机器在一个物理以太网即可,然后在M2上ping 192.168.0.152不通,ping 172.16.0.5也不通,难道是因为一个物理网络的ip也必须在一个逻辑网段吗?根本不是那回事,记住,ip逻辑网络中最重要的是路由,只要有路由就能通,和物理网络没有关系,于是为M2配置如下的路由:
172.16.0.5/32 dev eth0 scope link
这条路由的意义是往ip地址172.16.0.5/24的数据请走eth0,现在再试试ping 172.16.0.5,还是不行,是不是有啥问题了呢?一点问题也没有,首先先说说物理网络的行为,ip逻辑网络与物理网络还有一个相联系的地方就是 arp机制,如果路由配置好了,那么在路由的指导下进行实际传输,但是实际传输是在物理网络进行的,因此必须要有物理地址,这就是arp的作用,以太物理网络是广播网络,因此肯定可以随意传输数据的,我们不是已经有了去往目的地址172.16.0.5的路由了吗?那么在访问172.16.0.5之前首先需要172.16.0.5的mac物理地址,因为我们是在一个物理网络内的,因此M2的网卡就开始了询问:“谁的ip地址是172.16.0.5,请把你的 mac地址告诉我,我的地址是10.2.2.5。”然后把这条arp询问广播出去,因为是广播所有的机器都接收到这个询问,M1拥有172.16.0.5,因此M1做出回答,然后将它的mac地址打包发给10.2.2.5,可是出事了,它并不知道怎么到10.2.2.5啊,于是mac 地址便送不到10.2.2.5,于是直接阻碍了物理传输,于是就ping不通了,现在已经找到问题了,于是解决问题,就是很简单的给M1配置上到 10.2.2.5的路由:
10.2.2.5/32 dev eth0 scope link
做完了以后,再在M2上试试ping  172.16.0.5,肯定通了。
因此可以看出逻辑网络是否连通和物理网络的结构没有关系,只和路由有关,即使刚才那个arp引起的逻辑网络不通的问题也和路由有关,只要有路由,一切自由连通,如果物理网络是不同的网络,比如不同的以太网,那么道理一样,只不过情况更复杂罢了,本质还是创建路由。既然可以为网卡指定ip地址,那么可不可以说ip属于网卡呢?不能,网卡只是传输媒介罢了,ip是属于主机的,ip是提供给应用的一个逻辑概念,并不是网卡的内秉属性,还是以卡车为例,车上的货物是物主的而不是卡车的,以人的职位为例,职位是属于国家机器的而不是属于人的,人只是它的执行代理,这个人不干了还可以换人,但是该职位永远属于国家机器。一个古老的问题就是路由器和交换机的区别,按照这种逻辑网络和物理网络的理解,路由器就是指示ip数据如何走的机器,交换机指导物理数据帧怎么走,它只提供物理连接的两点之间的物理传输机制,其实路由器就是一个逻辑上的交换机,它的层次更高罢了。如果把路由当作寻址来理解的话,物理网络也有一个路由机制,交换机中也有一个“路由表”,那就是交换机学习到的mac地址和端口的映射关系。虽然路由需要人为指定,但是有一种路由确是在为网卡指定ip时自动生成的,这就是链路层发现的路由,该路由指导了和指定ip为一个网段的数据包该怎么走。规范将这个“显然”的事实作为一条自动路由生成了,规范将ip地址存在相同部分的主机作为一个ip网段,一般的,导线直接相联的两个网口是一个网段的,事实上这已经成了约定,于是协议就会认为这个网口的那一端一定和本网口指定的ip是一个网段的,于是就有了链路层自动发现的路由一说,含义就是:到和本网口同一ip网段的数据一定从本网口出去!这初看起来就是事实,难道不是吗?我们不都是这么配置网络的吗?很不幸,这不是事实。看看我刚才举的那个例子吧,那么混乱的配置,几乎没有在同一网段的地址,竟然ping通了!这就印证了另一个真正的事实,就是ip网络的连通在于路由而不是别的,协议自动生成的那条链路层路由其实是为了方便而不是真的必要,比如把上述混乱配置的例子中的链路层自动路由删除,照样可以ping通,其实那种混乱的配置下,我们根本就不用自动的链路层路由,那条路由是为常规配置准备的。仔细看看链路层路由,它实际上是借用了物理网络的方便,因为常规上尽量把一个ip逻辑网段映射到一个物理网段,所以可以借用这个常规的假设,因此叫做链路层路由。真正纯粹意义的ip逻辑网和物理网是没有关系的,不应该有上述的网段一致映射,但是规范中建议了那种映射。上面的混乱配置的例子才是真正的理论上的ip逻辑网络,可是很不实用,但是对于理解概念十分有用。

这篇关于关于IP网段间互访的问题—路由是根本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949074

相关文章

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red