在当今的以太网络通信中,在IP数据包中有两个必不可少的地址,那就是IP地址和网卡地址(即MAC地址),在数据包中,无论是IP地址还是MAC地址,都有源地址和目标地址,因为通信是双方的,所以就必须同时拥有双方的地址!在同一IP网络中通信,将会发生以下事件:
主机A与主机B通信,这时主机A肯定首先要封装这些需要发给主机B的数据包,那么对于主机A来说,自己的IP地址和MAC自己肯定能够轻易得到,对于主机B的IP地址这时主机A也应该知道,要不然它就不清楚自己将要和谁通信,当有了自己的IP地址,MAC地址以及主机B的IP地址后,主机A在数据包中可以正确地写上源IP地址,目标IP地址,接下来的工作就是写入自己的MAC地址(即源MAC),最后还必须正确写入目标主机B的MAC地址,可这时主机A才发现自己根本没有目标主机B的MAC地址,那该怎么办呢?这时主机A就通过比较上面已经封装好的源IP和目标IP,通过子网掩码计算一下,发现源IP和目标IP恰好在同一个IP网络内,那么它想要得到目标主机B的MAC地址就有办法了,首先主机A就向本网段发过一个ARP请求,这个ARP请求包中包括主机A的源IP地址,源MAC地址,目标主机B的IP地址,而目标MAC地址为广播MAC地址(全部为F),因为我们要找的就是目标MAC,所以这里用广播MAC地址,又因为是以太网,所以整个局域网的所有主机都能收到这个请求MAC地址的数据包,当然主机B也能收到,因此在主机B收到此ARP请求后,立即构建一个包括自己的MAC地址的ARP回应包,回应给主机A,当主机A收到这个ARP回应后,终于完成了找寻目标MAC的重大任务,从而把目标主机B的MAC地址正确封装进上面还未封装结束的正准备发给主机B的数据包,在这时,源IP和源MAC以及目标IP和目标MAC都已正确存在于数据包中,那么这里主机A向网络内发出这些数据包,因为目标地址在本网段,所以本网段所有主机都能收到这个数据包(这是以太网的特性),最后只有真正的目标主机B能够打开这些数据包,在此,同网段两台主机之间的通信就此圆满结束!
在这里应该注意另外一个问题,因为主机A要寻找的目标主机B在同一网络,所以主机A能够通过ARP得到目标主机B的MAC地址,从而完成通信,当主机A在封装数据包时检测到目标主机并不在本网段,在这时,数据包不能把目标主机的MAC地址顺利封装进去,那么就用到另一种方法,那就是网关,主机A在准备发向主机B的数据中,封装好自己的IP地址和MAC地址,同时也封装好目标主机B的IP地址,数据包封装到这里,主机A就利用上面得到同网段目标主机B的方法去请求得到网关的MAC地址,同样也是用ARP去广播,因为网关必须和本机在同一网段,理所当然,网关能够收到这个ARP请求并能正确回应给主机A,这时主机A在数据包中封装好自己的IP地址和MAC地址,同时也封装好目标主机B的IP地址和网关的MAC地址,把数据包从网卡发出去,因为目标MAC是网关的,所以网关收到这个数据包后,发现目标MAC是自己,而目标IP却是别人,所以它不可以再往上打开这个数据包,它要做的工作就是把这些数据包发给下一跳路由器(如果网关自身就是一台路由器的话),如果网关是一台普通PC,那么它就发给路由器,让路由器把这些数据包正确传输到远程目标网络,到达远程网络后,它们的网关再将数据包发给数据包中的目标IP,即源主机A苦苦寻找的目标主机B,从而真正结束不同网络之间的通信,回应的数据包也是用同样的方法到达目的地,在这里,还需要注意的是,当网关把数据包发给下一跳路由器时,这个数据包必须由网关把目标MAC改成下一跳路由器的MAC地址(通过ARP得到),而源端MAC改成发出端口的MAC地址,否则下一跳路由器收到目标MAC不是自己的数据包,会丢弃不予理睬,下一跳路由器再发给下一跳路由器同样要把目标MAC地址改为下一跳路由器的MAC地址再发出去!
最后还可以总结出:在网段通信时,数据包中的地址就是源IP,目标IP,源MAC,目标MAC,根本用不到网关,而当检测到需要把数据包发到远程网络时,这时,目标MAC就必须改变了,在还没有出内网时,目标MAC必须写成网关的MAC地址发出去,当网关收到时,再把目标MAC地址改成下一跳的MAC地址发出去,同时源MAC地址要始终保持为发出端口的MAC地址(回应报文可以依靠它路由回去),而源IP及目标IP不曾改变(用于判断收到数据包的本机IP和数据包IP是否一致,若一致不转发),就算到达了公网上,目标MAC仍然在不断改变着,直到最后,这个数据包到达目标IP的网络,最终通信结束!
下面是个例子:Ping过程详细解
配置好路由器Route和pc0、pc1的IP地址以及网关
这个过程可以具体分为四个阶段:
一、pc0到Router阶段
1、ping进程将调用因特网控制报文协议(ICMP),ICMP创建一个回应请求数据包;
2、ICMP将这个有效负荷交给因特网协议(IP),然后IP协议会创建一个数据包。这时,这个数据包将包含源IP地址、目的IP地址和值为0x01的协议字段。
3、一旦数据包被创建,IP协议将判断目的IP地址是处于本地网络中,还是处于一个远程网络中;
4、由于IP协议断定这是一个远程请求,这个数据包需要被发送到默认网关,这样, 这个数据包才能路由到远程网络。本机注册表将被使用,以查找配的默认网关;
5、主机pc0的默认网关被配置为172.16.0.1 要能够发送这个数据包到默认网关,必须要知道路由器的FastEthernet0/0接口(其IP地址被配置为172.16.0.1)的硬件地址,因为只有这样,数据包才可以被下传给数据链路层并生成数据帧,
【注:】在本地局域网内,主机只可以通过硬件地址来进行通信,pc0要想和pc1通信,它必须将数据包发送到本地网络中默认网关的mac地址上,这一点很重要。mac地址永远都应用于本地局域网,而绝不会通过路由器。
6、接着,pc0检查arp缓存,查看一个默认网关的IP地址是否已经解析为硬件地址,如果已经被解析,数据包就将被释放、传送到数据链路层并生成数据帧(目的方的硬件地址也将通数据包一同下传至数据链路层),要查看pc0主机上的arp缓存,可以使用下列命令:
PC>arp -a
Internet Address Physical Address Type
172.16.0.1 0004.9ade.a201 dynamic
如果这个硬件地址在pc0主机的arp缓存中尚未被解析,一个arp广播将被发送到本地网络,以搜索172.16.0.1的硬件地址,路由器会响应这个请求并提供FastEthernet0/0的硬件地址,接着pc0主机将缓存这个地址;
7、一旦这个数据包和目的方的硬件地址被交付给数据链路层,局域网驱动器将用来提供媒体访问以通过以太网,此时将会产生一个数据帧,使用控制信息来封转此数据包。在这个帧中包含有目的方和源方的mac地址,以及以太网类型字段。在本例中,这个协议为IP协议。在这个帧的结尾处是被称为帧校验序列(FCS)的字段,它是装载循冗余校验(CRC)计算值的区域。此数据帧还需要查询一些信息,即pc0的mac地址,以及作为目的方的默认网关的mac地址,但这里并不包括pc1主机的mac地址;
8、数据帧完成封装以后,就会被交付到物理层,以一次一位的方式发送往物理媒体(在试验中是双绞线对);
9、在冲突域中的每台设备将接收这些位并重建为帧。它们都运行CRC并核对保存在FCS字段中的内容,如果这 两个值不匹配,此帧将会被丢弃。
如果这个CRC值相吻合,那么就核查目的方的mac地址,如果匹配,那么路由器将将查看以太网类型字段,以了解在网络层使用的协议;
10、数据包从数据帧中抽出,然后这个数据帧剩下的部分被丢弃,再把数据包传给以太网类型字段中列出的上层协议,在这里是传给IP协议;
11、IP会接受这个数据包,并检查其目的IP地址,由于数据包的目的地址与接收路由器所配置的任一地址不相匹配,路由器将会在路由表中查看目的IP网络的地址;
12、此路由表中必须包含有网络172.16.1.0的表项,否则此数据包会被立即丢弃,然后一个携带有“destination network unavailable”信息的ICMP包将被发送回发送方pc0;
13、如果路由器找到目的方的网络,数据包将被交换到输出接口,由于在被试验中所有网络都是直连的,因此没有必要使用主动路由协议;
二、Router到pc1阶段
14、路由器将交换此数据包到FastEthernet0/1的缓冲区内;
15、FastEthernet0/1的缓冲区需要了解目的方主机的mac地址,它首先检查arp缓存,
如果pc1的mac地址已经被解析并保存在路由器的arp缓存中,则这个数据包和mac地址将被传递到数据链路层并组成数据帧。下面是路由器的arp缓存:
Router#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 172.16.0.1 - 0004.9ADE.A201 ARPA FastEthernet0/0
Internet 172.16.0.2 35 0001.63BC.C8A7 ARPA FastEthernet0/0
Internet 172.16.1.1 - 0004.9ADE.A202 ARPA FastEthernet0/1
Internet 172.16.1.2 35 000C.8513.CAAB ARPA FastEthernet0/1
如果这个硬件地址尚未被解析,路由器将从FastEthernet0/1发送一个arp广播到请求,以查找 172.16.1.2的硬件地址,pc1会响应这个请求并提供硬件地址,接着路由器将缓存这个地址;然后这个包和硬件地址都会被发送到数据链路层并组成数据帧;
16、数据链路层将使用这个目的方的源方的mac地址,以及以太网的类型字段和FCS来创建一个数据帧,这个帧将被
17、pc1主机会接收到此帧,并立即运行CRC,如果运算结果与FCS字段的内容相匹配,这个目的mac地址将被检查,如果发现是匹配的,随后将检查以太网类型字段中的值,以判断应该将数据包上传给网络层的什么位置;
18、在网络层,IP会接收这个数据包,并检查其目的方的IP地址,由于他们是匹配的,数据包的协议字段将会被检查,以了解有效负荷应该交给谁;
三、pc1到Router阶段
19、此有效负荷会交给ICMP,它将知道这是一个回应请求,ICMP会应答这个请求,通过即可丢掉这个数据包并随之产生一个新的有效负荷来作为回应应答;
20、随后创建的数据包中将包含源方和目的方的地址、协议字段和有效负荷。现在,目的方设备为pc0;
21、IP协议将判断目的IP地址是处于本地网络中,还是处于一个远程网络中,由于IP协议断定这是一个远程请求,这个数据包需要被发送到默认网关,这样,这个数据包才能路由到远程网络。本机注册表将被使用,以查找配的默认网关;
22、在pc1的注册表中可以找到默认网关的IP地址,之后将查看arp缓存,以了解是否已经完成了从IP地址到mac地址的解析;
23、一旦默认网关的mac地址找到,此数据包和目的方的mac地址都将被送往数据链路层,以完成数据帧的封转;
24、数据链路层会封装数据包的内容,并在帧报头中包含以下内容:
目的方和源方的mac地址 在以太网类型字段中填充0x0800(IP) 将CRC结果填入FCS字段
25、这时,帧将会被传给物理层,并以一次一位的方式发送到网络媒体上;
26、路由器的FastEthernet0/1接口会接收到这些位并重建为一个帧,CRC校验被运行,帧的FCS字段被检验,以确认 两个结果是相符的;
27、CRC检验通过之后,目的mac地址将被检查。由于路由器的接口同这个地址是想匹配的,数据包将被从这个帧中取出, 然后以太网类型字段将被检查,以了解数据包应该投递给网络层上的哪一个协议;
28、由于协议被判断为IP。于是IP将得到这个数据包,首先IP将对IP报头运行CRC校验,然后检查目的方的IP地址;
29、在这种情况下,路由器确实知道到达172.16.0.0的方式,这一输出的接口是FastEthernet0/0,于是数据包将交换到接口FastEthernet0/0上;
四、Rouetr到pc0阶段
30、路由器检查arp缓存,确定172.16.0.2的mac地址是否已经被解析;
31、由于在将数据包传送到pc1的过程中,172.16.0.2的mac地址已经被缓存起来,因此,这一mac地址和数据包将被传递到数据链路层;
32、数据链路层会使用这个目的方的mac地址和源mac地址,然后将IP放入以太网类
33、这个帧然后被传送到物理层,以一次一位的方式发送到本地网络;
34、pc0将接收这个帧,运行CRC算法
--------------------- 本文来自 Ijuan_0712 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/tao546377318/article/details/50313441?utm_source=copy