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

2023-11-12

文章出处:http://blog.csdn.net/dog250/archive/2010/02/09/5303291.aspx

 

    之所以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

ient  172.16.0.5/32  scope  global  eht0

然后将另一台单网卡的Linux机器M2的eth0配置如下的一个IP:

eth0:

inet  10.2.2.5/24  brd  10.2.2.255  scope  global  eht0

保证两台机器在一个物理以太网即可,然后在M2上ping 192.168.0.152不通,ping 172.16.0.5也不通,难道是因为一个物理网络的IP也必须在一个逻辑网段吗?根本不是那么回事,记住,IP逻辑网络中最重要的是路由,只要有路由就能通,和物理网络没有关系,于是为M2配置如下的路由:

172.16.0.5/32  dev  eht0  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逻辑网络,可是很不实用,但是对于理解概念十分有用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 我应该使用哪个 Linux 发行版作为 Xen 主机? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我为家庭办公室订购了一台服务器 我想用 Xen 对其进行分区 我认为这将使事情保持干净并且更容易维护 我将运行 MySQL PostgreSQL
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • 如何确保 numpy BLAS 库可用作动态加载库?

    The theano安装文档 http www deeplearning net software theano install html troubleshooting make sure you have a blas library指
  • 确保 config.h 包含一次

    我有一个库项目 正在使用 Linux 中的 autotools 套件移植到该项目 我对自动工具很陌生 本周 我已经了解了其操作的基础知识 我有一个关于如何保留内容的问题config h免遭重新定义 我惊讶地发现生成的config h文件也没
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • 如何从linux命令行运行.exe可执行文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Windows 中有一个 abc exe 可执行文件 我可以使用 DOS 命令提示来执行此应用程序 并为其提供一些运行时变量 我想从
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • gethostbyname() 或 getnameinfo() 如何在后台工作?

    How gethostbyname or getnameinfo 在后台工作 include
  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 如何在Python中独立于语言安装(linux)获取用户桌面路径

    我找到了 如何找到用户桌面的路径 的几个问题和答案 但在我看来它们都已失效 至少我找到的那些 原因是 如果用户安装的 Linux 不是英语 他或她的桌面很可能位于除 Desktop 例如 对于瑞典语 我相信它是在 Skrivbord 谁知道
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • Composer 安装要求

    我正在尝试将 Composer 安装到 Laravel 项目中 当我做的时候sudo composer install在项目目录中它显示了两个错误 Problem 1 Installation request for simplesoftw
  • Docker:处理 tar 文件时出错(退出状态 1):设置枢轴目录时出错:不是目录

    我是 Docker 新手 不知道是什么原因导致此错误或如何诊断它 任何有关此问题的具体帮助或有关首先检查何处以诊断此类问题的提示将不胜感激 我的 Dockerfile FROM java 8 Install maven RUN apt ge
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对

随机推荐

  • 更改bat文件图标_如何优雅地设置文件夹图标?收下我的小工具吧

    作者 富妈 在 Windows 系统 可以通过修改图标使文件夹更容易区分 可是如果需要美化的文件夹太多 一个个设置就显得很费力 而且移动文件夹或者重装系统后 图标也容易失效 这是一个很常见的问题 但网上相关的资料却比较少 很多小伙伴可能在搜
  • 关于电脑D盘(C盘等)出现管理员权限(影响删除,重命名),需要解除具体操作。

    管理员权限 影响新建文件 修改文件类型 内容 当安装软件时也带来诸多不便 对于某些语言输入器 编译器更是不友好 因为我们需要经常新建文件 修改文件 我就是在用VScode时发现的 D盘文件全都开启了管理员权限 研究一上午找到两种解决方案 第
  • Unity Camera 的跟踪,转动,缩放,代码教程 适合做角色的第一,第三人称视角

    Unity Camera 的跟踪 转动 缩放 代码教程 适合做角色的第一 第三人称视角 1 代码挂载到摄像机 camera上 Player是你要跟踪物体的位置 把你要跟踪的物体放上就行 2 源代码 using UnityEngine usi
  • python 3.6安装cPickle

    1 在python2 X中 需要安装cPickle 2 在python3 X中 这个包已被别的包替换 使用以下语句即可 import pickle as cPickle
  • string.IsNullOrEmpty()

    string IsNullOrEmpty 是一个判断字符串是否为空引用或者值为空的方法 string IsNullOrEmpty 返回值是boolen型 也就是true或者false
  • Bcrypt 加密算法研究与对比

    Bcrypt 加密算法研究与对比 一 什么是Bcrypt 二 Bcrypt如何加密与验证 一 encode方法加密 二 matches方法验证 三 如果使用彩虹表进行hash碰撞攻击会如何 四 比较 MD5加密算法的缺陷 相对于MD5 Bc
  • 循环语句和字符串拼接

    1 循环语句 循环语句就是让一部分代码重复执行 JavaScript中常用的循环语句有 for while do while 1 for循环 2 while循环 3 do while循环 2 字符串拼接 字符串之间使用 运算符 说明 数字和
  • 基于BERT Adapter的词汇增强型中文序列标注模型

    原创作者 疯狂的Max 论文Lexicon Enhanced Chinese Sequence Labelling Using BERT Adapter 解读 01 背景与动机 近年来 多项研究致力于将词汇信息融入中文预训练模型中以提升命名
  • lstm代码_ARIMA时间序列与LSTM神经网络的PK

    作者 李应硕 人大在读 授权转载 收藏順便 点个 赞 创作不易 前言 时间序列算是我接触的第一个统计学实践项目 也是它把我带进了机器学习的大门 当时的我的工作是根据过往投资和赎回量 每天预估一个需要留的钱 有点类似银行准备金 我本想自己写个
  • Vijava 学习笔记之CustomizationPassword

    CustomizationPassword类介绍 包含密码字符串和一个标志 指定字符串是否为纯文本或加密 Properties NAME TYPE DESCRIPTION plainText xsd boolean Flag to spec
  • c语言中ln,lg,log的表示

    c标准头文件math h中有两个与log有关的函数声明 double cdecl log double X double cdecl log10 double X 1 2 其中log代表ln 即loge log10顾名思义就是lg loge
  • Arduino 初识+项目

    目录 Arduino初识 电路的基本知识 基于此就可以做一些有趣的小玩意 第一个大坑 串口通信 项目 基于Arduino板控制小车 几大问题 1 控制电机转动 2 麦轮的安装 3 电路连接 4 使用PWM调速 5 优化小车行驶的平稳性 PI
  • aarch64交叉编译libturbojpeg

    0 目的 因项目上有使用jpeg turbo的需求 用的aarch64的平台 需要使用交叉编译工具来获取libturbojpeg so 1 libturbojpeg下载 libturbojpeg源码git地址 GitHub libjpeg
  • Hyperledger Fabric如何通过虚拟机部署以太坊智能合约

    EVM作为用户链代码安装到Fabric中 然后可以通过它部署智能合约 单个EVM链代码足以在通道上运行多个以太坊智能合约 链码不采用以太坊的共识方法 所有事务仍将遵循Fabric事务流中的执行 订单 验证步骤 确保在不同组织中的足够对等方安
  • 判断子序列

    给定字符串 s 和 t 判断 s 是否为 t 的子序列 leetcode链接 你可以认为 s 和 t 中仅包含英文小写字母 字符串 t 可能会很长 长度 500 000 而 s是个短字符串 长度 lt 100 字符串的一个子序列是原始字符串
  • 项目经理与技术经理的区别

    项目经理和技术经理有什么区别 区别有多大呢 这个问题此前我从没有认真的去思考过 直到被明确的问到的时候 才细思极恐 连两者的区别都没能有条理的讲出来 一 关于项目经理 在没有真正进入软件行业之前 对于系统集成方面的项目还是有些心得的 有种一
  • 编译Linux内核获取LLVM bitcode (LLVM IR)

    最近要获取linux内核的llvm bitcode 以便后续进行分析 例如获取callgraph等等 尝试了很多提取llvm bitcode的方法 用build bom wllvm 过程中也出现了很多错误 最后用wllvm终于成功了 记录下
  • Docker容器与虚拟化技术:Docker资源控制、数据管理

    目录 一 理论 1 资源控制 2 Docker数据管理 二 实验 1 Docker资源控制 2 Docker数据管理 三 问题 1 docker容器故障导致大量日志集满 造成磁盘空间满 2 当日志占满之后如何处理 四 总结 一 理论 1 资
  • 【模电】0014 运放自激振荡和消除(补偿)

    一般我们讨论的负反馈放大电路多关注其幅频特性 也就是它的增益 而对其相频特性关注的不多 这主要是因为 一个放大电路如果它工作状态是稳定的 其输入和输出相差一定的相位对分析它的特性并不影响 只是相当于信号延迟了一点时间 注意这里有个前提条件
  • 关于IP网段间互访的问题——路由是根本

    文章出处 http blog csdn net dog250 archive 2010 02 09 5303291 aspx 之所以IP网段间可以互相访问 完全靠的就是路由 因此路由是IP通信的根本 IP是机器可以进行通信的资格证书 而路由