Monday, August 24, 2009

网关IP与ARP的关系

正确配置网关是机器上网重要的一步. 但是网关的IP很容易给对本人的逻辑造成混乱

之前的笔记其实早已经记录过网关这种东东, 但是这里还是要细细做做笔记. 决定要借文字, 清楚描述这个问题, 希望不要再造成混乱

造成本人混乱的原因:
1. 局域网内使用MAC地址可以完成数据的寻址
2. IP包中不需要网关的IP地址, 只需要end-to-end两端的IP

那为什么配置机器上网还需要网关的IP呢?

ARP协议被发明去解决的问题:
In computer networking, the Address Resolution Protocol (ARP) is the method for finding a host's link layer (hardware) address when only its Internet Layer (IP) or some other Network Layer address is known.
* 来自: http://en.wikipedia.org/wiki/Address_Resolution_Protocol

ARP的作用就是从网络层的IP得到链路层的MAC地址

回答上面的问题: 配置时使用网关的IP只是为了不使用网关的MAC! MAC不是人记的地址

可以使用如下的方法证实网关IP的作用:
配置客户机的IP:
rainly@laptop:~$ sudo ifconfig eth0 192.168.1.10 netmask 255.255.255.0
查看路由情况, 没有默认网关
rainly@laptop:~$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
增加默认网关, 但是这个网关IP是错的!

rainly@laptop:~$ sudo route add default gw 192.168.1.1 dev eth0
查看增加后的情况:
rainly@laptop:~$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0

0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth0

客户机目前还没有一个已知的MAC:
rainly@laptop:~$ arp
与外网机器通信, 但是结果出错, 因为网关的IP是不对的
rainly@laptop:~$ ping 203.208.39.99
PING 203.208.39.99 (203.208.39.99) 56(84) bytes of data.
From 192.168.1.10 icmp_seq=1 Destination Host Unreachable

From 192.168.1.10 icmp_seq=2 Destination Host Unreachable
From 192.168.1.10 icmp_seq=3 Destination Host Unreachable
下面就可以知道为什么ping不能机器了: 因为与网关无法通信!
rainly@laptop:~$ arp
Address                  HWtype  HWaddress           Flags Mask            Iface

192.168.1.1                               (incomplete)                              eth0

使用错的网关IP, 但是使用正常的网关MAC地址:
rainly@laptop:~$ sudo arp -s 192.168.1.1 00:1d:60:6f:d3:92
rainly@laptop:~$ ping 203.208.39.99
PING 203.208.39.99 (203.208.39.99) 56(84) bytes of data.

64 bytes from 203.208.39.99: icmp_seq=1 ttl=244 time=57.6 ms
64 bytes from 203.208.39.99: icmp_seq=2 ttl=244 time=66.8 ms

rainly@laptop:~$ arp

Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.1.1              ether   00:1d:60:6f:d3:92   CM                    eth0
192.168.1.1              ether   00:1d:60:6f:d3:92   CM                    eth0

可以知道, 网关的MAC比IP来得实在, 前提是同一个子网! MAC无法通过子网去寻址

如果有可能, 记住了MAC, 就是使用MAC呢?

这也是不应该的!
1. 因为linux kernel的arp列表是有一个老化时间的, 就算你使用arp -s Add hwaddr 去配置了网关, 到了老化时间后, 系统会自动发送ARP包去确认和更新arp列表的, 所以就算有人记过了MAC地址, 也没有人会定时使用arp配置一次MAC的!

2. 如果需要与网关机器上的其它IP层之上的服务通信时, 必定要正确的网关IP

如下是arp包的数据结构:
 * 来自: http://sznet.blog.51cto.com/91580/178447

图中可以知道, ARP包只是在链路上的帧下, 不在IP这一层

这类包是被广播的, 局域网中的机器只有在TARGET IP等于自己的IP时才回复

总:
在只是为了通过网关上网的极端情况下, 可以理解为:使用网关的IP只是为了不记MAC地址!





No comments:

Post a Comment

Note: Only a member of this blog may post a comment.