TCP/IP详解 IP路由选择
在本篇文章当中, 将通过例子来说明IP路由选择器过程
如图所示, 主机A与主机B分别是处在两个不同的子网当中, 中间通过一个路由连接. 如果主机A请求与主机B进行通行, 主机A寻找主机B的位置的过程就可以理解为IP路由的选择过程.
现在主机A的用户通过Ping命令确认与主机B的连通性. Ping命令看似简单, 但是其中IP路由选择的过程还是会有很多的步骤. 具体的步骤如下 :
当主机A上输入12.34.56.78之后, 主机A的因特网控制报文协议(ICMP)创建一个回应请求数据包, 其数据域中只包含有字母.
ICMP协议会将刚刚创建的回应请求数据包(有效负荷)转交给因特网协议(IP协议)。IP协议会对这个数据包进行封装,创建一个数据包。在IP协议创建的数据包中,包括主机A的IP地址,目的主机B的IP地址以及值为01h的协议字段。当数据包达到主机B时,主机B通过判断协议字段01h,将这个有效负荷交给ICMP协议处理。
IP协议创建数据包后,会判断目的主机B的IP地址是处于本地网络中还是处于远程网络。根据IP地址规则,主机A、B属于不同网络。此时IP协议所创建的数据包会被发送到默认的网关。(在每个终端设备中,网络配置中需要包含自身的IP地址,以及默认到的网关地址。在不同网络之间的主机互相通信,依靠的就是网关设备)
如图中所示,默认的网关就是图中的路由器。此时我们需要确认路由器的MAC地址。假设路由器对应连接到主机A的路由器网络接口的IP地址为10.142.149.1,那么主机A(10.142.149.6)的默认网关配置为10.142.149.1,。现在要将IP数据包发送到对应的路由器网络接口10.142.149.1上,就必须知道这个接口的物理地址,也就是MAC地址。只有知道MAC地址,IP数据包才能够从网络层传递到底层的数据链路层并根据链路层的规则生成帧。之后主机A才能把链路层中的包发送到IP地址为10.142.149.1的路由器接口上。在本地局域网中,主机只可以通过硬件地址进行相互通信。所以当主机A要把数据包发送给对应的路由器接口时,必须提前知道这个路由器对应的MAC地址。这时就需要用到ARP协议,ARP协议的具体讲解后面会单独写一篇笔记进行分析。主机A会先检查本地的ARP缓存,查看一个默认网关的IP地址是否有对应路由器接口的MAC地址。如果ARP缓存表中有对应的记录,表示IP地址已被成功解析。此时,IP层会将数据包传递到数据链路层并生成帧。其中目的主机B的MAC地址也将和数据包一起传递到数据链路层。通常情况下,在主机A中,可以通过ARP命令来查看主机当前的IP地址与MAC地址对应表。
生成数据帧。当IP数据包和目的主机B的MAC地址传递给数据链路层后,局域网驱动器将用以提供媒体访问服务,以通过以太网进行数据传输。通过一些控制信息封装IP数据包,形成数据帧。数据帧中包含有目的主机B和源端主机A的MAC地址,以及以太网类型字段。以太网类型字段主要用来描述交付这个数据包到数据链路层的网络层协议。数据帧结尾是一种被称作为帧校验序列的字段,它装载循环冗余校验计算值的区域。总结一下,以这个例子来说,主机A的数据链路层中生成的数据帧包括目的地址MAC地址(指的是对应路由器接口的MAC地址)、主机A自身的MAC地址、以太网类型字段、数据包、帧校验序列。注意:这个传输过程中,目的地址不是主机B的MAC地址,而是与主机A对应的路由器接口的MAC地址。最后数据帧到物理层以位(bit)的形式传输。
路由器接口接收这些位(bit)并且重新合并成数据帧。接收完毕后,会进行CRC过程并核对保存在帧校验序列字段中的内容。如果值互相不匹配,则数据帧将会被丢弃。如果两个值相同,则路由器接口将会接收主机A传输过来的数据帧,并核查数据帧中的目的放的MAC地址,是否与自身MAC地址匹配。路由器还会查看数据帧的以太网类型字段,以了解在网络层采用的协议类型,然后路由器就会抽出数据帧中的数据包,丢弃其余内容。抽取后的数据包传送给以太网类型字段中列出的上层协议。在本例中为IP协议。
IP协议接收这个数据包后,检查目的IP地址。在本例中,由于数据包中的目的地址与接收路由器所配置的任何地址都不相匹配,所以路由器会在自己的路由表中查看目的IP网络的地址。本例中,由于路由器同时还连接着10.142.148.10,所以在这个路由器中的路由表中,有相关的记录。若没有相关记录,则这个数据包会直接被丢弃。数据包被丢弃后,会向主机A发送一个“目标地址不可达”的错误信息。
如果路由器在它的路由表中找到了对应的网络地址记录,则数据包就会被转发到路由器的输出接口。在本例中,就是路由器用来与主机B连接的接口。路由器会将这个数据包交换到对应接口的缓冲区内。
接下来就是路由器接口缓冲区中数据包处理情况。这个接口缓冲区需要知道目的主机B地址的MAC地址。因为现在数据包中包含了目的主机B的IP地址,所以路由器会根据这个IP地址检查本地ARP缓存表,如果主机B的MAC地址已经被解析并缓存在路由器的ARP缓冲中,则这个数据包和主机B的MAC地址会被传递到数据链路层以便重新生成数据帧。在路由器以前跟主机B通信过的情况下,主机B的IP与MAC地址的映射记录会在路由器中缓存四个小时。超过四小时未再通信的话,IP与MAC地址的映射记录将会被删除。如果在路由器ARP的缓冲表中没有这个映射记录,则路由器接口被在其连接的子网内部发送一个ARP请求。ARP请求是以广播方式发送的,子网内部所有的主机都会受到这个请求,发现这个请求的主体是10.142.148.10的MAC地址。这时各个主机会检查自己的IP地址,发现不匹配,就会抛弃这个ARP请求包。而主机B检查自己的IP地址,发现匹配成功,这时主机B就会进行响应,将自己的MAC地址告诉路由器。因此路由器就能够得知目的主机B的IP地址和MAC地址,就会把数据包和目的主机B的MAC地址传递到底层的数据链路层中。当然这时,路由器也会把主机B的IP地址和MAC地址缓存到自己的ARP缓冲表中,以备下次使用。
路由器随后会生成数据帧,传送到物理层,以位的方式发送到物理媒体上,在网络介质上进行传输。
主机B接收到数据帧后进行CRC校验过程。校验结果与帧校验序列中字段内容相同的话,则数据帧中目的方的MAC地址会被读取,主机B会比对这个MAC地址与自己的MAC地址是否相同。如果相同,则会抽取其中的数据包,并根据以太网字段类型中指定的协议,把数据包传递给相应的协议处理。在本例中,数据包中是一个回应请求,所以主机B会把这个数据包最终交给ICMP协议处理。ICMP协议会应答这个请求,同时把这个数据包丢弃并迅速生成一个新的有效负荷作为回应应答。然后主机B会利用同样的过程把数据包以及目的MAC地址传递到下一层,让其生成数据帧,通过物理介质传递到对应的路由器接口上。
路由器会重复上面对应的步骤,把数据包转交到另一个接口上进行传递,随后主机A就接收到一个回应应答信息,表示主机A到主机B的网络是通的。
总结 : 以上就基本阐述了IP路由选择的全部过程。在本篇笔记中,列举的是一个路由器节点的例子。像多路由器的转发的情况也是同一个道理,到达每个路由器时都会先搜索路由表,以确定下一步数据传输到哪里或者是丢弃。大致步骤都是相同的,对于IP数据包,其在网络中的流向基本上是一个套路:
- 主机A的传输层将数据交给网络层,网络层添加IP首部,如双方IP地址,TTL等信息,封装称为IP数据包,然后通过ARP协议获取目的MAC地址后,将数据包交给数据链路层。
- 数据链路层根据IP、MAC地址,将数据帧封装为物理帧,通过物理媒体传输。
- 主机B接收物理帧,判断MAC地址。如果与自己MAC地址匹配,就把数据帧交给网络层处理。
- 网络层判断IP地址是否匹配,如果是发给自己的,则再移交上层协议处理;如果不是,则在路由表中查找此IP地址的下一跳地址,并将数据通过内存从接受数据网卡的IP程序copy到发送数据网卡的IP地址。在发送接口中, 通过ARP请求获取下一跳的MAC地址,IP程序将数据包和目的MAC地址交给数据链路层,然后封装为数据帧,通过物理媒体传输数据帧。
在IP路由选择的过程中,我们可以发现路由表的作用是不可或缺的。下一跳的地址还是直接丢弃数据包,都是与路由表息息相关。下一篇笔记将会简单介绍一下路由表的形式与作用。