您的位置:首页 > 其它

两不同网段主机直连通信过程的建立(3个实验详细分析)

2011-04-04 12:03 465 查看
网络界流行一种说法:不同网段主机不能直接通信。今天我们就来让两台不同网段的主机直连能够通信,并做详细详细解释。

这里插讲一个技术:免费ARP——Gratuitous ARP。翻译也许不准确。

Gratuitous ARP包含的重要信息:

sender MAC:发送者的MAC地址;

sender IP:发送者的IP地址;

target MAC:00:00:00:00:00:00;

target Ip:发送者的IP地址;

Gratuitous主要有两个作用:

一是主动通告自己的MAC地址。一般用于热备份系统中,比如冗余网关,当主设备发生故障,备用设备立即接管主设备,并向广播域发送Gratuitous ARP,通知所有主机网关IP对应的MAC为备份设备的MAC,这样网络中其他设备就会把流量转向备份设备。

二是用于IP冲突检测。当一个主机A的网络接口刚UP的时候,会发送Gratuitous ARP。ARP target IP字段为自己的IP,target MAC字段全0,如果该网段中有其他主机B的IP与之相同,主机B会用自己的MAC填充单播应答ARP sender MAC字段,然后将该ARP单播应答发往主机A。主机A接收任何一个ARP的单播应答则认为产生了IP冲突。值得注意的是:当网络中其他主机收到主机A发出的Gratuitous ARP后,并不会把该ARP中包含的sender ip与sender mac加入本地ARP缓存。

注意:主机不会将Gratuitous ARP中的sender MAC和sender IP加入本地ARP缓存。

下面开始试验。

============================================================================================================

试验一:

PC1的配置:

IP:192.168.1.200

mask:255.255.255.0

getway:不配

PC2的配置:

IP:1.1.1.1

mask:255.255.255.0

getway:不配

当PC2刚启动的时候会发送3个Gratuitous ARP广播包来检测是否存在IP冲突。PC1收到PC2的ARP广播,但并不将PC1的主机IP和MAC加进自己ARP缓存中。

我们在PC2上ping PC1的IP(ping 192.168.1.200)。

PC2首先将目标IP 192.168.1.200与自己路由表比对,在本地路由表中找不到相关路由,原因是没有配置网关,从而没有默认路由。PC2直接将该ICMP包丢弃。

============================================================================================================

试验二:

PC1的配置:

IP:192.168.1.200

mask:255.255.255.0

getway:不配

PC2的配置:

IP:1.1.1.1

mask:255.255.255.0

getway:192.168.1.200 //注意:与实验一不同的地方。

当PC2刚启动的时候会发送3个Gratuitous ARP广播包来检测是否存在IP冲突。PC1收到PC2的ARP广播,但并不将PC2的主机IP和MAC加进自己ARP缓存中。

我们在PC2上ping PC1的IP(ping 192.168.1.200)。

PC2首先将目标IP 192.168.1.200与自己路由表比对,在本地路由表中找了到一条默认路由:

Network Destination Netmask Gateway Interface Metric

0.0.0.0 0.0.0.0 192.168.1.200 1.1.1.1 10

该路由条目的下一条(网关)为192.168.1.200,于是PC2查看本机ARP表缓存是否存在网关的ARP条目,但并没有找到相应网关条目,所以PC2发出寻找网关的的ARP广播。PC1收到该ARP广播查询包,于是PC1向PC2发送ARP应答的单播包,这个应答包中的sender mac就是PC1的MAC地址。PC2收到PC1的应答包后,提取sender ip和sender mac值,加入本地ARP缓存。这样PC2就知道了网关MAC地址。(注意我们要到达的目标IP为192.168.1.200,网关IP也为192.168.1.200。但我尽量用“网关”这个词语,就是要请大家留意PC2发送ARP包的目的不是寻找PING包的目的地址,而是寻找网关地址。这里查找网关的步骤属于OSI 2层通信。)

于是PC2在PING包,即ICMP包数据段的前部加上IP报头,IP报头的Distination IP:192.168.1.200,source ip:1.1.1.1,再在IP报头前部封装以太网帧头,Distination mac:网关192.168.1.200的MAC(从ARP缓存中提取),sorce mac为PC2 1.1.1.1接口MAC。于是PC2拿到这封装好了的ICMP包,交给1.1.1.1接口,就这样,PC2将ICMP包顺利传递到了网关。(注意本步骤同样用“网关”这个词。该过程属OSI 3层通信)。

PC1收到该ICMP包,提取IP报头的Distination ip 192.168.1.200与自己IP比对,发现刚好匹配。PC1认为该ICMP是给自己的。于是PC1就准备给PC2一个ICMP应答。

PC1再次分析ICMP包,从IP报头的source ip字段提取出1.1.1.1,再从以太网帧头中提取sender mac:PC2的MAC,将PC2的IP和PC2的MAC加进自己ARP缓存中。

PC1拿1.1.1.1与自己路由表比对,找不到相应路由(原因在于PC1没有配置网关)。最后PC1将放弃对PC2进行ICMP应答。

============================================================================================================

试验三:

PC1的配置:

IP:192.168.1.200

mask:255.255.255.0

getway:1.1.1.1 //注意:与实验二不同的地方。

PC2的配置:

IP:1.1.1.1

mask:255.255.255.0

getway:192.168.1.200

当PC2刚启动的时候会发送3个Gratuitous ARP广播包来检测是否存在IP冲突。PC1收到PC2的ARP广播,但并不将PC2的主机IP和MAC加进自己ARP缓存中。

我们在PC2上ping PC1的IP(ping 192.168.1.200)。

PC2首先将目标IP 192.168.1.200与自己路由表比对,在本地路由表中找了到一条默认路由:

Network Destination Netmask Gateway Interface Metric

0.0.0.0 0.0.0.0 192.168.1.200 1.1.1.1 10

该路由条目的下一条(网关)为192.168.1.200,于是PC2查看本机ARP表缓存是否存在网关的ARP条目,但并没有找到相应网关条目,所有PC2发出寻找网关的的ARP广播。PC1收到该ARP广播查询包,于是PC1向PC2发送ARP应答的单播包,这个应答包中的sender mac就是PC1的MAC地址。PC2收到PC1的应答包后,提取sender ip和sender mac值,加入本地ARP缓存。这样PC2就知道了网关MAC地址。(注意我们要到达的目标IP为192.168.1.200,网关IP也为192.168.1.200。但我尽量用“网关”这个词语,就是要请大家留意PC2发送ARP包的目的不是寻找PING包的目的地址,而是寻找网关地址。这里查找网关的步骤属于OSI 2层通信。)

于是PC2在PING包,即ICMP包数据段前部加上IP报头,IP报头的Distination IP:192.168.1.200,source ip:1.1.1.1(路由条目的interface字段提取),再在IP报头前部封装以太网帧头,Distination mac:网关192.168.1.200的MAC(从ARP缓存中提取),sorce mac为路由条目的interface字段提取的1.1.1.1接口MAC。于是PC2拿到这封装好了的ICMP包,交给路由条目中interface字段指定的接口1.1.1.1,就这样,PC2将ICMP包顺利传递到了网关。(注意本步骤我同样用“网关”这个词。该过程属OSI 3层通信)。

PC1收到该ICMP包,从IP报头的source ip字段提取出1.1.1.1,再从以太网帧头中提取sender mac:PC2的MAC,将PC2的IP和PC2的MAC加进自己ARP缓存中。

PC1再次分析ICMP包,提取IP报头的Distination ip 192.168.1.200与自己IP比对,发现刚好匹配。PC1认为该ICMP请求包是给自己的。于是PC1就准备给PC2一个ICMP应答。(上诉步骤与实验二步骤相同)

于是PC1在ICMP应答包的数据段前部加上IP报头,IP报头的Distination IP:从PC2 ICMP请求包IP报头source ip字段提取;

PC1将从PC2 ICMP请求包IP报头source ip字段提取到的1.1.1.1与自己路由表比对,找到一条默认路由:

Network Destination Netmask Gateway Interface Metric

0.0.0.0 0.0.0.0 1.1.1.1 192.168.1.200 20

该路由下一条(网关)为1.1.1.1。于是PC1查看本机ARP缓存是否存在网关的ARP条目。

Interface: 192.168.1.200 --- 0x30003

Internet Address Physical Address Type

1.1.1.1 00-0c-29-c3-0d-92 dynamic

在ARP缓存中找到了相应条目。于是PC1提取(网关)对应的MAC作为ICMP应答包以太网帧帧头的Distination mac。再从路由条目interface字段192.168.1.200对应自己网卡的mac作为ICMP应答包帧头的source mac。于是PC1拿这个封装好的ICMP应答包,交给路由条目中interface字段指定的接口192.168.1.1。就这样PC1将ICMP应答包顺利传递到了网关。(注意用词也是“网关”。该过程也属于OSI 3层通信)。

PC2收到ICMP应答包,提取IP报头的Distination ip 1.1.1.1与自己IP比对,发现刚好匹配。

到此一次完整的PING过程就完成,PC1 ping PC2 成功!。

================重要结论:两台不同网段的主机直连能够通信。=================================

下面简要总结实验一、实验二部能通信得原因:

实验一:

两主机都没网关:PC2找不到目标IP路由——双向不通。

实验二:

PC1没有网管,PC2有网关:PC2将数据包成功发往PC1,但PC找不到到达PC2的路由——单通。

实验三:

两主机网关为对端主机IP:——双向互通。

====================================================================================

在CISCO环境中,比如用CISCO路由器通过配置no ip routing来模拟PC直连,配置不同网段IP后,发现能通信的现象我还不知道怎么解释,也许CISCO有它自己的检测机制。

有网友提出是设备刚启动后发送的Gratuitous ARP所致,但本文已经阐明主机不会将Gratuitous ARP中的sender MAC和sender IP加入本地ARP缓存。再者,设备通信第一步检查的是路由表,而不是ARP缓存。所以我认为Gratuitous ARP所致的原因是不合理的。希望有朋友能提出拟独到的见解,共同探讨。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: