/*********************************************************************
* Author : Samson
* Date : 07/13/2012
* Test platform:
* GNU Linux version 2.6.29.4
* gcc version 4.4.0 20090506 (Red Hat 4.4.0-4) (GCC)
当发送数据报的IP主机为数据报建立的IP头中包含自己的地址作为源地址,并包含目的主机IP地址。当这个数据报沿着网络协议栈到达链路层后,链路层必须确定向“同一个本地网络”上哪一台主机发送。发送主机检查目的地址。这又有两种情况:
(一)如果在同一个IP网络和子网上,该主机将使用地址解析协议(ARP)向本地网络发送广播,并把IP地址映射到链路层地址(也即是MAC地址),然后将数据报封装到数据链路层帧中并直接发送到目的地,其中目的MAC地址就是通过ARP查询到的MAC地址。
(二)若目的地址不在同一个网络或子网上的情况:
要解决这个问题,就要用到路由器了,一般一个子网都是会有一个或几个路由器,发送主机把IP数据报(由初始发出,目的地址为最终目的地)封装在链路层帧中,该帧直接发给子网的默认路由器,在此链路层帧中的目的MAC地址为路由器的MAC地址,由此路由器把该帧拆开并检查IP数据报头。
首先,它将检查版本号,IPV4中只允许该字段为版本4。它还将继续处理头字段中的其他部分,递减生存期字段并重新计算包头校验和。若在发送者和接收者之间数据报必须分段,中间路由的这些路由器还会修改数据报ID和分段偏移值。路由器还会检查目的地址以确定它是否属于路由器直接连接的任一个本地网络。如果是,路由器将使用ARP确定目的地的数据链路层地址(MAC地址),然后把该数据报封装在数据链路层帧中发送。
这种情况的时候,则将数据报直接转发到另一个路由器,这个另一个路由器再重复上面的1)、2)步骤,若还是不在这个所谓的另一个路由器的子网中,那么就再进行3)这一步的操作,直到转发到一个能够找到目的地址的子网所在的那个路由器。这就是一个典型的IP寻路的一个完整过程。