没有IP地址的主机如何保持IP层联通

在《两台不同网段的PC直连是否可以相互ping通》一文中,我有点像在玩旁门左道,本文中,我继续走火入魔。两台机器,M1和M2,各自有一个网卡eth0,配置如下:
M1的配置:
eth0上不配置任何IP地址。
M2的配置:
eth0上不配置任何IP地址。
....
爆炸,机器上都没有IP地址,通个毛线球啊!!
        我只是想在7年后进一步阐述一个常识,即能否互通,路由是根本。在7年前的2010年,我写了一篇文章《关于IP网段间互访的问题—路由是根本》,在前段时间,我写了一篇类似的《两台不同网段的PC直连是否可以相互ping通》,7年了,好似没有任何进步,除了文章排版好看了些,唉,也是沉醉,但不妨碍我更进一步。
        我依然想用M1的1.1.1.1来ping M2的2.2.2.2,但却不把这两个地址配置在M1和M2上,怎么办?很简单,配置路由即可。配置如下:
M1的配置:      
ip route add local 1.1.1.1/32 dev eth0
ip route add 2.2.2.2/32 dev eth0 scope link 或者 ip route add 2.2.2.2/32 via 2.2.2.2 dev eth0 onlink

M2的配置:
ip route add local 2.2.2.2/32 dev eth0
ip route add 1.1.1.1/32 dev eth0 scope link 或者 ip route add 1.1.1.1/32 via 2.2.2.2 dev eth0 onlink

试试看,在M1上来ping 2.2.2.2,尽情互通吧。
        看到了吧,没有配置任何IP地址,只配置了路由即可互通,以上配置中,local路由指示了本机接收哪些数据包,而onlink路由则可以直接arp目标。两条路由非常好理解。
        如果是转发设备,需不需要local路由呢?答案是需要的。也许你会问,作为转发设备,没有任何数据包要到本地啊,为什么还要local路由呢?这么理解是对的,然而你忽略了arp。
        不过如果你的链路层不是以太网,而是点到点的noarp链路的话,那么作为转发设备而言,local路由则不再需要。
--------------------
看了这个例子之后,也许你会问,那么IP地址的意义何在?说实话,IP地址的意义仅两点:
1.标识节点。
2.帮配置该IP的节点生成几条路由项:
2.1.标识自身的local路由;
2.2.标识子网的广播路由;
2.3.标识链路的链路层路由,即scope link路由;

看到了吗?如果说你不需要标识主机,只是为了通信,那么当你可以手工配置上述三种路由之后,也就根本不需要IP地址了。
--------------------
其实,IP路由这东西,没什么太多的知识在里面,关键看玩法。高端的玩法,可以搞搞算法,搞搞最短路径,生成树啥的,中端点的可以玩玩协议,BGP,IS-IS,OSPF啥的精通了也够装逼了,屌丝一点的,就像我这种,折腾下边缘点的东西,帮看到我文章的出点变态点的面试题,就很满足了。哈哈。
        说了这么多,路由是根本!没有显示bind的TCP listener怎么知道bind哪个地址?靠路由。UDP报文怎么填充源地址?靠路由。ARP怎么处理?靠路由...

温州皮鞋,下雨进水不会胖!奥康,意尔康,红蜻蜓,日泰,吉尔达,惠特,蜘蛛王,康奈,报喜鸟,这些温州皮鞋牌子,你们都懂吗?你们穿过吗?会穿吗?

补充:
在M1上,如果你如下敲入配置:
ip route add 20.2.2.2/32 via 4.4.4.4 dev eth0
将会怎样?很显然,会提示网络不可达。如何解决?首先你要知道为何网络不可达?很显然系统不知道4.4.4.4在哪里,而你既然想让4.4.4.4成为到达20.2.2.2的下一跳,那它一定在M1的链路上,那么好办,配一条到达4.4.4.4的link路由即可:
ip route add 4.4.4.4/32 dev eth0 scope link
接下来,继续配置ip route add 20.2.2.2/32 via 4.4.4.4 dev eth0,你将看到自己的微笑。
        想互通,路由是根本!

--------------------
7年前的《关于IP网段间互访的问题—路由是根本》有个评论,问了个问题:
arp不是直接调用链路层吗?对M1来说,就算不设置到M2的路由,也应该回答M2发出来的arp解析请求啊。但通过抓包看到M1的确没有回答,这是为什么呢?
直到几天前我才看到并给了回答,估计问问题的不会再看到了,所以我把我的回答贴出来:
将M1收到M2的arp请求的那个网卡的rp_filter配置成0就可以回复M2的arp请求了。

时间: 2024-11-05 12:24:34

没有IP地址的主机如何保持IP层联通的相关文章

路由器的ip地址和主机默认网关的关系

实验拓扑图: PC0 IP:                 192.168.1.2 Submask:              255.255.255.0 Gateway:       192.168.1.1 PC1 IP:                 192.168.2.2 Submask:              255.255.255.0 Gateway:       192.168.2.1 配置过程: R2 en conf t hostname R2 int fa 1/0 no

Centos 7 安装 设置 IP地址,DNS,主机名,防火墙,端口 (实测+笔记)

环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7.0-1406-x86_64-DVD.iso 安装步骤: 1.虚拟系统安装 1.1 使用VMware 虚拟机,读入ISO进行安装.启动后进行安装界面 1.2 选择 Install CentOS7,进行语言选择 1.3 选择简体中文,进入信息摘要 1.4 点击"安装位置",选择系统需要安装到的硬盘,点击“完成”. 1.5 点击"网络和主机名",进行网络设置

在cmd中获取ip地址和主机名

将下面的文件放到一个bat文件当中,以管理员身份运行. @echo off &setlocal enabledelayedexpansion Rem '/*========获取本机的IP地址(局域网)=========*/ echo "please wait" for /f "tokens=2 delims=:" %%b in ('ipconfig^|find /i "ip"') do set fsip=%%b echo %fsip% s

Java如何获取本地计算机的IP地址和主机名?

在Java编程中,如何获取本地计算机的IP地址和主机名? 以下示例显示如何使用InetAddress类的getLocalAddress()方法获取系统的本地IP地址和主机名. package com.yiibai; import java.net.InetAddress; public class GetLocalIPAddress { public static void main(String[] args) throws Exception { InetAddress addr = Ine

Java如何从IP地址查找主机名?

在Java编程中,如何从IP地址查询出主机名? 以下示例显示了如何通过net.InetAddress类的InetAddress.getByName()方法将指定的IP地址查到主机名称. package com.yiibai; import java.net.InetAddress; public class HostSpecificByIP { public static void main(String[] argv) throws Exception { InetAddress addr =

IP地址及子网--四种IP广播地址

国际规定:把所有的IP地址划分为 A,B,C,D,E. 类默认子网掩码:A类为 255.0.0.0; B类为 255.255.0.0; C类为 255.255.255.0.子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上. A类地址:范围从0-127,实际上是1-126.0是保留的并且表示所有IP地址,而127也是保留的地址,并且是用于测试环回用的.可用的A类网络有126个.如:10.0.0.1,第一段号码为网络号码,剩下的

推断给定的IP地址是否是内网IP

/** * 推断给定的IP地址是否是内网IP * * @author GaoHuanJie */ public class Test{ public boolean isInnerIP(String ipAddress){/*推断是否是内网IP*/ boolean isInnerIp = false;//默认给定IP不是内网IP long ipNum = getIpNum(ipAddress); /** * 私有IP:A类 10.0.0.0 -10.255.255.255 * B类 172.16

PHP获取IP地址的方法,防止伪造IP地址注入攻击

原文:PHP获取IP地址的方法,防止伪造IP地址注入攻击 PHP获取IP地址的方法 /** * 获取客户端IP地址 * <br />来源:ThinkPHP * <br />"X-FORWARDED-FOR" 是代理服务器通过 HTTP Headers 提供的客户端IP.代理服务器可以伪造任何IP. * <br />要防止伪造,不要读这个IP即可(同时告诉用户不要用HTTP 代理). * @param integer $type 返回类型 0 返回IP

几句话掌握子网掩码、ip地址、主机号、网络号、网络地址、广播地址

1.191.172.16.10.33/27 中的/27也就是说子网掩码是255.255.255.224 即27个全1 2.从子网掩码255.255.255.252得出其网络位为30位,所以只有剩下的2位为主机位,主机位全零的为网络地址,主机位全1的为广播地址,剩余的主机号码为主机地址范围 3.公有地址(Public address)由Inter NIC(Internet Network Information Center 因特网信息中心)负责.这些IP地址分配给注册并向Inter NIC提出申