不用路由器,实现不同网段(子网)计算机之间的通信

文章针对有IP网络基础知识,对osi和以太网有基本了解的人群!

此文章所有字眼均出自笔者本人(转帖请注明出处) ,如果不对还请高手指点,也希望收到自位中老手的意见或建议。
下面奔今天的主题
首先介绍一下,网关的作用,因为实现中要借助网关。
    路由器是三层的设备,主要协议为IP。三层设备主要负责寻址,通过查看自已通过各种动态路由协议或静态指定的路由表,来确定数据包的传送方向,路由器就像是站在十字路口的一个交警,如果有司机(数据包)不知道目的地就问这个交警,这个交警从大脑的数据库中检索到,这个司机要去的目的地,然后再确定到达目的应走哪个路口。计算机操作系统实现了OSI七层模型,当应用层发出网络请求后经由表示层、会话层、传输层(具体功能不在本文范围,请参看其它资料),要送到网络层加封网络层信息即IP地址,同时也要进行寻址(路由)。大部分的计算机只有自身使用的路由表,不会路由接收到的数据包,配置网关就相当于在自身的路由表中加入一个条目(在命今提示符下输入 route print 查看,特别注意,没有网关是没有这个条目的),所有不明去向的包都发送至网关,这就是网关的作用。这里假定网关为192.168.1.1 网卡IP为:192.168.1.123):

Network Destination        Netmask          Gateway         Interface       Metric
       0.0.0.0               0.0.0.0        192.168.1.1      192.168.1.123      20

    这是一条默认路由,意思是当 route print 看到的这张表上,找不到去网目的地的路由条目时,将数据包发往网关192.168.1.1,interface为到达网关的本地接口,这里是192.168.1.123所在接口的链路上。(有这张表的前题是:你的网卡必须是处在UP状态,既线缆接好的状态下才能看到)。除上边那个条目外应该还有很多条目,还必须说的一个条目是你的直连路由条目,或说你的网卡IP地址所在子网的路由(这条路由是系统自动生成的):

Network Destination        Netmask          Gateway         Interface       Metric
     192.168.0.0         255.255.255.0    192.168.1.123    192.168.1.123     20

意思是 到达你网卡IP所在网段 192.168.0.0/24的数据包,都将会发到你的本地接口上 既192.168.1.123所在接口连接的链路上(Gateway和Interface为什么一样,我这样认为:本地网段不需要网关设备,当然还有种情况,不是本地接口上的网段的情况下,也可能是接口ip,因为以太网是广播网络,广播网络上开启arp代理的设备,如果有到此网段的路由,这个开启arp代理的设备会回应arp请求)。

当PCA要给PCB发送数据时,首先应用程序产生数据,经由上层协议送到网络层,网络层要完成他的使命,首先封装源IP地址192.168.1.111,再封装上目的IP地址192.168.1.222,下一步就要进行路由了,这时就用到了计算机中的那张路由表。查表结果:去往192.168.0.0/24 (直连路由,同网段的)应发到192.168.1.123接口上。之后,还要引入一个新概念,就是arp表,就是由arp协议(address resolution protocol)产生的表。Arp是网络层的协议,直接封装在EthernetⅡ类型的以太网帧里的。作用是请求 某IP
地址所对应的以太网MAC地址。然后型成一张表,以便缓存此地址,下次直接再用。在这个例子中已经确定,此数据包是发给PCB的,检查目的和源IP地址,是在同一网段的,这时arp启动,发送request包(把arp包中的opcode位置0X0001),包里的部分内容为

Sender MAC address 00:00:00:00:00:01 Sender IP address 192.168.1.111
Target MAC address 00:00:00:00:00:00 Target IP address 192.168.1.222

意思是:谁的IP是192.168.1.222,请把你的MAC地址告诉192.168.1.111
然后PCB 发reply包(opcode位置0X0002)给源主机,部发内容如下:

Sender MAC address 00:00:00:00:00:02 Sender IP address 192.168.1.222
Target MAC address 00:00:00:00:00:01 Target IP address 192.168.1.111

意思是 我PCB 192.168.1.222 的mac地址是00:00:00:00:00:02
这样源主机就知道了目的主机的MAC地址,数据包封装的二层MAC目的地址为00:00:00:00:00:02
然后发到链路上,数据包就会顺利到达,与此同时对方会学到PCA的mac(通信是双向的吗),双方互相知道对方的MAC。

    还以上面图为例,现在假定PCB的IP为192.168.0.222 (不在同一网段)看看如何通信,实践告诉我们IP不在同一网段的计算机之间是不能通过二层交换机进行通信的,那么是为什么呢,有了上面的基础就不难分析出来。PCA要发往PCB的数据包在进行路由时,检查发目的IP没有和自已网卡IP在同一网段,也就不会有去往192.168.0.222/24的路由条目,这时就有两种情况了:
1、有网关(存在一个三层路由设备),网关指向三层设备,也就相当由PC上有了条默认路由,此时又有两种情况如果网关IP和本地主机在同一网段,arp协议就会请求网关的IP所对应的mac,假如PCA的网关为192.168.1.1,arp请求如下:
Sender MAC address 00:00:00:00:00:01 Sender IP address 192.168.1.111
Target MAC address 00:00:00:00:00:00 Target IP address 192.168.1.1

如果不在同一网段,比如PCA的网关配置为192.168.100.1(路由表也会出现相应的一条路由),当PCA向某个互连网ip发送数据时,arp请求如下:
Sender MAC address 00:00:00:00:00:01 Sender IP address 192.168.1.111
Target MAC address 00:00:00:00:00:00 Target IP address 192.168.100.1
除非本网段真有ip为192.168.100.1的主机,否则这个arp请求,只有开启arp代理且有去往192.168.100.1网段路由的设备才能回应。
2、没有网关(不存在三层设备),自然没法配置网关,也就不会有默认路由。这样数据包就没有去处,丢弃数据包。至此原因找以了,不能通信的原因在于,没有路由条目。怎么解决一下呢,只要在本地主机有条去网目标主机的路由,这样就能实现通信了,这也是我们要讨论的情况。

下面看看实现方法如下图:

实现1 互相做为对方的网关:
PCA
网关设为192.168.0.222。其实加入网关就是在电脑上加入一条默认路由
(也可以用route add 192.168.0.0 mask 255.255.255.0 192.168.111加上一条路由)即
Network    Destination       Netmask Gateway       Interface         Metric
0.0.0.0       0.0.0.0          192.168.0.222       192.168.1.111        1

PCB
网关设为192.168.1.111。默认路由就是
Network     Destination       Netmask Gateway         Interface       Metric
0.0.0.0       0.0.0.0          192.168.1.111       192.168.0.222        1

此前的数据通信过程就成了这样

PCA应用层向pc2发送数据,数据经由表示层、会话层、传输层后,要送到网络层加封网络层信息即IP地址,源IP和目的IP不在同一网段(也就是没有直连路由),用默认路由进行发送,默认路由网关为192.168.0.222,启动arp查询网关的mac地址,192.168.0.222真实存在,192.168.0.222回应arp请求,双方获得对方mac,这样数据包就发送至PCB,PCB同样可以与PCA通信。

实现2 在两台pc上分别加入到对方的路由:
PCA
route add 192.168.0.222 mask 255.255.255.255 192.168.1.111(到192.168.1.111 从本地接口送出)
PCB
route add 192.168.1.111 mask 255.255.255.255 192.168.0.222

数据通信过程就成了这样
PCA应用层向pc2发送数据,数据经由表示层、会话层、传输层后,要送到网络层加封网络层信息即IP地址,源IP和目的IP不在同一网段(也就是没有直连路由),用手动添加的静态路由进行发送,从本地接口发送,启动arp查询目的ip的mac地址,192.168.0.222真实存在,192.168.0.222回应arp请求,双方都获得对方mac,这样数据包就发送至PCB,PCB同样可以与PCA通信。

总结
这篇文章技术含量不高,但对通信细节要有明确了解,且还要有清晰的思路来让读者看懂。为了适应大多数人,所以写的比较啰唆,仅适用于初学者。在实现过程中,最后解释的不清析,或说不够准确,有什么不足之处请指出。

10 thoughts on “不用路由器,实现不同网段(子网)计算机之间的通信

  1. 看过你的文章:《不用路由器,实现不同网段(子网)计算机之间的通信》,觉得写得很细,我没有动手做过文章里涉及到的试验,但还是感觉非常有意思!

    但在此想问个问题:如果文章里所说的不同网络的主机之间真的可以通过那种方式通信,那岂不是就说明只需知道对方MAC地址就能通信了,而跟实际使用的网关都无关了?因为实际上在你的实例里两台机器都未指定中间路由器活网关机器的IP。

    非常感谢!

    • 这篇文章写的就是不用路由器实现不同网段之间的通信,而适合这种环境的前题是不在同一网段的计算机必须在同一广播域中(二层能互通)。文章的目的其实不是应用,而是说明为什么二层网络中配上不同子网的IP就不能通信了,而在同一网段的确是能的。不同网段(同一广播域)之所以不能通信是因为,ARP发送请求数据包时会检查目的网段是不是和自己的IP处于同一个子网,如不再是不会发送请求包的,详细请看arp的RFC,这是本文要说明的结论,并用具体实验证明了这点。而这种方法并没有太大的实用价值。
      要强调的是以上要求必须在同一广播域,这种网络就不能太大,否则网络性能会严重下降,从而引出了vlan的概念来实现广播域的隔离,或用路由器分割广播域,所以路由器是必不可少的。
      至于网关我想说的是网关不一定是路由器的接口地址,网关的本质是在电脑中加入一条默认路由,下一跳是网关中的地址。

      不知我解释清楚了没有!不明白再Email给我!

  2. 两个问题:1、如果有网关,但网关地址和目的IP不在同一网段,arp协议不会启动,那么然后是不是就丢弃数据包呢?
    2、如果只是设定网关,但是没有用ARP静态设置MAC与IP的映射,是不是也是可以的呢?

    • 是这样,因为我没有看过TCP IP的源码,当然也看不懂,具体的处理方试是这样,“网关地址和目的IP不在同一网段,arp协议不会启动(运行)”这句话是指如果抓此链路上的包,你看不到arp包,其实你跟本就看不见IP包,主机处理非本网段的数据包时,就是丢丢弃(类似于路由器上的NULL 类型的接口的处理操作,这个丢弃动作是主机做的)。
      没有用ARP静态设置MAC与IP的映射,在主机ip和网关为同一网段时就可行的,因为这时arp会自动学习,这是arp存在的原因。如果主机ip和网关没在同一网段,正如前面所说arp不运行了自然不会学会对方mac地址。
      其实分析为什么不同网段的主机不能进行ip通信的源因,才是本文的用意,后面的东西都是在进行补充。

  3. 你的这篇文章非常好,虽然没有实意义,但是理解网络通信原理是非常好的!

    按照你的说法,如果有网关,但网关地址和目的IP不在同一网段,那主机就丢弃数据包。这就引出一个问题:PA与PB不在一个网段,如果PA的网关地址设为PB的IP地址,PB的网关地址设为PA的IP地址,PA与PB之间是可以PING通的,这又怎么解释呢?为什么没有丢弃呢?

  4. 这个问题我弄清楚了,关键是从通信过程去找原因。我们来看一下不同子网间的PC是如何通信的:首先数据从应用层到网络层,网络层运行的是IP协议,它的主要功能是负责路由,这时它会判断目标IP是否在同一网段,如果不是,它就准备把数据包发往网关,这时它会检查ARP缓存是否有网关IP所对应的MAC地址,如果有则将数据包封装成帧提交给数据链路层,数据链路层在通过物理层发往网关;如果没有网关IP所对应的MAC地址,ARP协议启动会向本网段广播请求包(ARP协议只能对自己所在的网段广播),然后获得网关的MAC地址,再提交给数据链路层到物理层发往网关。
        网关收到数据包后,它会根据目标IP地址搜索本地的路由表(网关的本质就是路由,可以把它看成路由器),如果能够找到对应的路由条目,则进行转发,如果没有找到对应的路由条目,网关就会丢弃数据包。这样数据就发送失败。
        清楚了这个过程就可以解释不同网段计算机间为什么不能通信了。
        这是因为当数据包到达PCA的网关时,找不到去往目标IP地址的路由(下一跳),因为目标IP地址和网关IP不在一个网段,如果没有人为设置,网关IP不会有去往不同网段的路由,所以数据通不过而被丢弃。这时你可以做一个实验:在PCA的网关上添加一条去往PCB网段的路由信息,这样数据就可以通过了,同样要想让数据反过来也能够通过,也必须在PCB的网关上添加一条去往PCA网段的路由信息才可以使得PCA与PCB通信。
       上面说的是在PCA的网关与PCA在同一网段,PCB的网关与PCB在同一网段的情况(一般情况都是这样)。但是为了做实验,如果我们把PCA的网关设置为PCB的IP地址,PCB的网关设置为PCA的IP地址,我们会发现奇迹出现了,PCA与PCB可以通信了?为什么呢?同样可以通过上述通信过程来解释:因为数据到达PCA的网关,PCA的网关就是PCB,PCB的路由表里肯定会有到达自己地址的路由,所以数据可以通过网关,到达目的地,反之也一样。有些人就会问了,既然PCA网关地址与PCA不在一个网段,PCA在将数据提交给数据链路层之前如何获得MAC地址呢?原因是这样:PCA在网络层会判断目标IP是否在同一网段,因为不是,它就准备把数据包发往网关,这时它会检查ARP缓存是否有网关IP所对应的MAC地址,如果有则将数据包封装成帧提交给数据链路层,数据链路层在通过物理层发往网关;如果没有网关IP所对应的MAC地址,ARP协议启动会向本网段广播请求包(ARP协议只能对自己所在的网段广播),那么由于PCA的网关不在一个网段,它怎么能够收到ARP的请求包呢?这里我们要说的一个事实是PCA的网关收到了请求包,而且还回应了请求,因为PCA与PCB都连在一个交换机上,所以当ARP广播请求时,交换机会把广播包广播到所有端口,这样PCB(也就是PCA的网关)也就收到ARP的广播请求,同时在ARP缓存中记录下PCA的MAC地址,然后PCB进行了响应,将装有自己MAC地址的响应包发往PCA,同理由于不在一个网段,PCA的网络层会将数据发给自己的网关就是PCA,现在由于PCB已经有了PCA的MAC地址,所以数据就可以到达网关PCA,从而数据到达目的地。我们就发现PCA与PCB可以PING通了。
    大家有问题可以联系我:chzg99@21cn.com

    http://chzg99.blog.sohu.com/

  5. "有网关,有网关就有默认路由,此时又有两种情况如果网关IP和本地主机在同一网段arp协议就会请求网关的IP所对应的mac,如果不在同一网段,arp协议不会启动这是协议规定 "
    这个好像 不全是吧 ARP代理就是不同网段的啊 LZ

    • 这篇文章写的比较早了,当时在学校宿舍是边实验边写的,还抓包验证了。刚才又试了一下,网关与主机ip不在同一网段也会发送arp请求,不知是不是网卡驱动的问题!当然也有可能是我的问题!感谢您的指正!

发表评论

电子邮件地址不会被公开。 必填项已用*标注


Verify Code   If you cannot see the CheckCode image,please refresh the page again!