一直有一个疑问:局域网的主机之间是如何将数据包发出去的 ? 求细节。
我目前的真实网络环境:
路由器(家用)的IP地址为192.168.1.1;
主机A地址192.168.1.100;
主机B地址192.168.1.102;
主机A的路由表:
主机A的arp表:
当主机A来ping主机B时,数据包是怎么发送到B的呢?
先说说我的理解:因为主机A与网络通信只有一条路径,所以数据包将会被转发给默认路由(192.168.1.1),然后由路由器将该包转发给主机B。具体是:A将数据包转发给路由器,路由器发送一个ARP广播查找主机B的MAC地址,得到MAC地址后,路由器通过链路层将数据发给主机B。(这里有一个ARP广播,我认为这个ARP广播应该由路由器发出,广播中的源地址(包括IP和MAC)地址都应该是路由器本身的,而不是主机A的。)
但抓包结果(见下图)来看,主机A应该是直接将数据包发给了主机B。这是因为,主机A发了一个ARP广播来寻找主机B的MAC地址,且得到了应答。(主机A所发的ARP广播中的源地址(包括IP和MAC)都是主机A本身的)。那么接下来,有了MAC地址后,主机A是怎么直接将数据发给主机B而没有通过路由器的呢? A与B虽然是同一网络,但未直接相连啊。
上面第4个包,ARP的应答包,源MAC地址是主机B,目的MAC是主机A,这个包在链路层是直接由B发给A的呢,还是B发给路由器然后由路由器转发给A的呢?
总结一下,问题应该是:同一局域网中,在链路层,各主机之间是如何发送数据的 ?
从ping的结果看,局域网内主机是直接通信,未经过路由功能,因为ping数据包中的TTL值未改变。如下:
当用主机A来Ping一个外网地址时,如 ping 20.20.30.40
这时就容易理解了,比对了目的IP地址后,选择默认路由,该ICMP数据包(ping包)是通过默认路由(192.168.1.1)来转发出去的。抓包也未发现有ARP广播数据。
--------------------------------------------------------------------------------------- 分 割 线 ------ -----------------------------------------------------------------------------------------------
回答:
路由器(非纯路由功能的),具有交换机的功能;局域网内主机间通信的时候,路由器被当做了交换机来使用。
交换机只工作在局域网内,不具有路由器的功能,只能实现数据包的转发,其解包只能解链路层协议,再往上层(IP层及以上)都不会被解析。
路由器工作在网络层,具有路由功能,解包只能解IP层协议(链路层解过之后才解的)。通常,路由器具有交换机的功能。(注意:纯路由功能的路由器不具有交换机的功能)。
家用路由器,忽略wan口以后就成了一个有4个lan口的交换机。事实上家用路由器由一个真路由器和一个交换机组成,路由器由两个端口,一个就是wan口,另一个藏在内部与交换机相连,交换机露出4个lan口。
路由器收到一个数据包后的处理过程
个人理解一:
对于(具有路由和交换功能的路由器)接收到的数据包,首先解链路层协议,根据其上层协议类型(由Type字段标识),决定将该数据包如何处理。
1) 如果其上层协议不是IP协议,则这时路由器被当做交换机使用,根据该包的MAC地址将该包转发出去;
2) 如果其上层协议是IP协议,则交由IP层解析(这时路由器又被当做路由器来使用了,使用其路由功能)。
a) 如果该目的IP地址与源IP地址属于同一局域网内,这时该包将被直接通过交换机口转发出去(TTL不减1,不需要重新计算IP头部校验和,因此Ping局域网内机器时,TTL值与源端发送时设置的相同);
b) 如果不属于同一局域网,则查找路由表进行路由。
注意:上面的过程属于个人理解,未得到验证。另外,上述1)和2)a),描述了属于直接转发数据包到目的地址的情况,其判断是否也可以直接拿数据包中的目的MAC来与路由器中的ARP表项比对呢?如果匹配了一项,则直接转发;如果不匹配,则进行路由。
个人理解二:
对于一个收到的一个数据包,解析其链路层协议,如果链路层中的目的MAC与路由器的MAC不同,则直接转发(其中,包括广播和多播的情况,需要转发到交换机的多个接口);如果链路层中的目的MAC就是路由器的MAC,则需要进行路由。
关于这两种理解,都是个人理解,未得到难。这应该属于路由器和交换机实现上的两种方式。这两种方案,都印证一点:局域网主机间通信时,路由器被当被交换机来使用,而未使用其路由功能,因为数据包的TTL值未改变,说明未经过路由。
在三层交换机(即路由器)上,VLAN之间的互通是通过实现一个虚拟VLAN接口来实现的,即针对每个VLAN,交换机内部维护了一个与该VLAN对应的接口,该接口对外是不可见的,是一个虚拟的接口,但该接口有所有物理接口所具有的特性,比如有MAC地址,可配置最大传输单元和传输的以太网帧类型等。在上述的说明中,我们提到了当交换机接收到一个数据帧时,判断是不是发给自己的,判断的依据便是查看该MAC地址是不是针对接收数据帧所在VLAN的接口MAC地址,如果是,则进行三层处理,若不是,则进行二层处理,按照上述流程进行转发。
(上面这段摘自: http://skyeagle.blog.51cto.com/417071/93338 ,理解二应该是现有的实现方案)
对于上面的问题:
局域网主机A发给主机B数据,
主机A发一个ARP广播到路由器,路由器解析到链路层协议,得到目的地址为全1的MAC地址,然后在每个内网网口(路由器的4个LAN口,相当于交换机的接口)上发一份数据。
主机B收到数据后,给出ARP应答。应答源MAC是B,目的MAC是A。将该应答包发给路由器,路由器收到数据后,同样解包并发给A。
可见,无论A与B直接通信,没有经过路由功能,因为ping的结果显示,TTL值未改变,说明未经过路由功能。
但无论如何,局域网内的主机通信是经过了路由器,只是这时路由器被当做了交换机来使用,而未使用其路由功能。
局域网内主机发送一个数据包时,
(注:局域网内不需要使用路由功能,此时路由器均是被当做交换机来使用的。路由器是运行在网络层的,其在链路层作为交换机来使用)
1) 发送端(192.168.1.00)IP层先查看主机的IP地址,通过查找主机上的路由表,选择一条路由。
如上路由表,当ping 192.168.1.101时,选出的表项是红色标注的一条。目的网络是192.168.1.0,通过本地网口192.168.1.100发送出去,但Gateway是On-link。注意,On-link的意思是直接相连,不需要经过路由,可将数据包直接发送至目的地址。这时路由器将被当做交换机来使用。
2) 由于可直接将数据包发送至目的地址,这时需要查找目的IP地址(192.168.1.101)对应的MAC地址。需要查找arp表。
如上arp表,未找到目的IP地址192.168.1.101对应的表项。于是主机发送一条ARP广播(链路层)。
3) 这时路由器被当做交换机来使用,收到arp广播后,转发给交换机上的各个接口(LAN口)。
4) 目的主机(192.168.1.101)回复一条ARP应答,发给路由器(当做交换机来使用),由路由器转发。
5) 发送端得到了目标主机的MAC地址,将ICMP包(ping包)发送出去,同时更新自己的arp表,将目标主机的表项加入进去。加入之后
6) 路由器(这时被当做交换机来使用)接收到发送端的ICMP包,并接其转发给目的主机。
注意:此时发送端已经更新了arp表项,这时如果再和目的主机192.168.1.101通信,就不需要再发送arp广播了。因为,通过arp表已经能够查到目的主机的MAC地址了。只有当通过arp表查不到MAC地址时,才需要链路层发送ARP广播。 但如果一段时间内未与目标主机通信,那么路由表会再次将该表项清除。