同网段及跨网段主机间通信原理

发布时间 2023-11-19 23:06:18作者: JobYan

在以太网络通信中,在 IP 数据包中有两个必不可少的地址,那就是 IP 地址和网卡地址(即 MAC 地址),在数据包中,无论是 IP 地址还是 MAC 地址,都有源地址和目标地址,因为通信是双方的,所以就必须同时拥有双方的地址!在同一 IP 网络中通信,将会发生以下事件:

1、同网段主机间通信

主机 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 能够打开这些数据包,至此,同网段两台主机之间的通信就此圆满结束!

2、不同网段主机间通信

在这里应该注意另外一个问题,因为主机 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 地址、目标 MAC 地址改为下一跳路由器的 MAC 地址再发出去!

最后还可以总结出:在网段通信时,数据包中的地址就是源 IP、目标 IP、源 MAC、目标 MAC,根本用不到网关,而当检测到需要把数据包发到远程网络时,这时,目标 MAC 就必须改变了,在还没有出内网时,目标 MAC 必须写成网关的 MAC 地址发出去,当网关收到时,再把目标 MAC 地址改成下一跳的 MAC 地址发出去,同时源 MAC 地址要始终保持为发出端口的 MAC 地址(回应报文可以依靠它路由回去),而源 IP 及目标 IP 不曾改变(用于判断收到数据包的本机 IP 和数据包 IP 是否一致,若一致不转发),就算到达了公网上,目标 MAC 仍然在不断改变着,直到最后,这个数据包到达目标 IP 的网络,最终通信结束!