zoukankan      html  css  js  c++  java
  • 不使用路由器来实现不同网段(子网)计算机之间通信的方法

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

           首先,来看一个常见的问题:

    --------------------------------------------

    Q:不同网段的机器通过二层交换机相连接,它们之间能相互通信吗?

    A:常规的情况下不同网段需通过网关访问的方式我想你应该是已经了解的~这个系列的第一篇文章也有提到。(来自:网络基本功系列:细说网络那些事儿

     

         关于交换机连接不同网段的机器一定要实现相互通信,应该需要特殊的设置:

         比如PC 1 IP: 192.168.1.1,默认网关设为:192.168.2.1

         PC 2 IP: 192.168.2.1,默认网关设为:192.168.1.1

         PC 1发现与PC 2不是同一网段需要发送给网关,现在问题就是如何获得网关(也就是PC2 )的MAC地址。所以PC 1发送包含网关IP地址的ARP。ARP到交换机这里, 交换        机转发这个ARP广播包(没有VLAN的话),于是PC 2返回自己的MAC地址给PC 1。现在,PC 1就有了PC 2的MAC地址。这样就可以相互通信了。

    ---------------------------------------------

        接下来介绍一下,网关的作用,因为实现中要借助网关。
        路由器是三层的设备,主要协议为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通信。

    总结

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

    转:http://www.pppei.net/blog/post/6

    -------------------------------------------------------------------------

    另:

    这个问题我弄清楚了,关键是从通信过程去找原因。我们来看一下不同子网间的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通了

  • 相关阅读:
    225. 用队列实现栈
    232. 用栈实现队列
    459.重复的子字符串(简单)
    28. 实现 strStr()(简单)
    剑指 Offer 58
    541. 反转字符串 II(简单)
    浏览器渲染页面的过程、重绘、重排以及页面优化
    隐藏一个元素的几种方法
    当我们在浏览器中输入一个URL后,发生了什么?
    Object.create() 和 new Object()、{} 的区别
  • 原文地址:https://www.cnblogs.com/zhoading/p/11949510.html
Copyright © 2011-2022 走看看