• 网关


     MAC 头和 IP 头的细节

    一旦配置了 IP 地址和网关,往往就能够指定目标地址进行访问了。由于在跨网关访问的时候,牵扯到 MAC 地址和 IP 地址的变化

    在任何一台机器上,当要访问另一个 IP 地址的时候,都会先判断,这个目标 IP 地址,和当前机器的 IP 地址,是否在同一个网段。怎么判断同一个网段呢?需要 CIDR 和子网掩码.

    如果是同一个网段,例如,你访问你旁边的兄弟的电脑,那就没网关什么事情,直接将源地址和目标地 址放入 IP 头中,然后通过 ARP 获得 MAC 地址,将源 MAC 和目的 MAC 放入 MAC 头中,发出去就 可以了。 

    如果不是同一网段,例如,你要访问你们校园网里面的 BBS,该怎么办?这就需要发往默认网关 Gateway。Gateway 的地址一定是和源 IP 地址是一个网段的。往往不是第一个,就是第二个。例如 192.168.1.0/24 这个网段,Gateway 往往会是 192.168.1.1/24 或者 192.168.1.2/24。 

    网关往往是一个路由器,是一个三层转发的设备。三层设备就是把 MAC 头和 IP 头都取下来,然后根据里面的内容,看看接下来把包往哪里转发的设备。 

    人们把网关就叫作路由器。其实不完全准确,而另一种比喻更加恰当:路由器是一台设 备,它有五个网口或者网卡,相当于有五只手,分别连着五个局域网。每只手的 IP 地址都和局域网的 IP 地址相同的网段,每只手都是它握住的那个局域网的网关。 

    任何一个想发往其他局域网的包,都会到达其中一只手,被拿进来,拿下 MAC 头和 IP 头,看看,根据 自己的路由算法,选择另一只手,加上 IP 头和 MAC 头,然后扔出去。

    静态路由是什么?

    不改变IP地址的路由 

    静态路由,其实就是在路由器上,配置一条一条规则。这些规则包括:想访问 BBS 站(它肯定有个网 段),从 2 号口出去,下一跳是 IP2;想访问教学视频站(它也有个自己的网段),从 3 号口出去,下 一跳是 IP3,然后保存在路由器里。 

     服务器A访问服务器B显然不是同网段,这里用静态路由的例子解释

    服务器 A 要访问服务器 B。首先,服务器 A 会思考,192.168.4.101 和我不是一个网段的,因而需要先 发给网关。那网关是谁呢?已经静态配置好了,网关是 192.168.1.1。网关的 MAC 地址是多少呢?发送 ARP 获取网关的 MAC 地址,然后发送包。包的内容是这样的: 

    源 MAC:服务器 A 的 MAC

    目标 MAC:192.168.1.1 这个网口的 MAC

    源 IP:192.168.1.101

    目标 IP:192.168.4.101

    包到达 192.168.1.1 这个网口,发现 MAC 一致,将包收进来,开始思考往哪里转发。 

    在路由器 A 中配置了静态路由之后,要想访问 192.168.4.0/24,要从 192.168.56.1 这个口出去,下一 跳为 192.168.56.2。 

    于是,路由器 A 思考的时候,匹配上了这条路由,要从 192.168.56.1 这个口发出去,发给 192.168.56.2,那 192.168.56.2 的 MAC 地址是多少呢?路由器 A 发送 ARP 获取 192.168.56.2 的 MAC 地址,然后发送包。包的内容是这样的:

    源 MAC:192.168.56.1 的 MAC 地址

    目标 MAC:192.168.56.2 的 MAC 地址

    源 IP:192.168.1.101

    目标 IP:192.168.4.101

    包到达 192.168.56.2 这个网口,发现 MAC 一致,将包收进来,开始思考往哪里转发。

    在路由器 B 中配置了静态路由,要想访问 192.168.4.0/24,要从 192.168.4.1 这个口出去,没有下一跳 了。因为我右手这个网卡,就是这个网段的,我是最后一跳了。

    于是,路由器 B 思考的时候,匹配上了这条路由,要从 192.168.4.1 这个口发出去,发给 192.168.4.101。那 192.168.4.101 的 MAC 地址是多少呢?路由器 B 发送 ARP 获取 192.168.4.101 的 MAC 地址,然后发送包。包的内容是这样的: 

    源 MAC:192.168.4.1 的 MAC 地址

    目标 MAC:192.168.4.101 的 MAC 地址

    源 IP:192.168.1.101

    目标 IP:192.168.4.101 

    包到达服务器 B,MAC 地址匹配,将包收进来。

    通过这个过程可以看出,每到一个新的局域网,MAC 都是要变的,但是 IP 地址都不变。在 IP 头里面, 不会保存任何网关的 IP 地址。所谓的下一跳是,某个 IP 要将这个 IP 地址转换为 MAC 放入 MAC 头。 

    NAT路由  Network Address Translation

     分析服务器A到服务器B:

    这俩IP一样,自己传自己?不是的,这里是不同的局域网内的设置,但是我们的目标IP地址应该是什么呢,有一个public ip address,比如我们可以链接  https://www.whatismyip.com/

    这就是我目前的ip 信息

    所以其实我们假设服务器的public ip address (国际身份)为 192.168.56.2。

    于是,源服务器 A 要访问目标服务器 B,要指定的目标地址为 192.168.56.2。这是它的国际身份。服务 器 A 想,192.168.56.2 和我不是一个网段的,因而需要发给网关,网关是谁?已经静态配置好了,网关 是 192.168.1.1,网关的 MAC 地址是多少?发送 ARP 获取网关的 MAC 地址,然后发送包。包的内容是这样的: 

    源 MAC:服务器 A 的 MAC

    目标 MAC:192.168.1.1 这个网口的 MAC

    源 IP:192.168.1.101

    目标 IP:192.168.56.2 

    包到达 192.168.1.1 这个网口,发现 MAC 一致,将包收进来,开始思考往哪里转发。

    在路由器 A 中配置了静态路由:要想访问 192.168.56.2/24,要从 192.168.56.1 这个口出去,没有下一 跳了,因为我右手这个网卡,就是这个网段的,我是最后一跳了。 

    于是,路由器 A 思考的时候,匹配上了这条路由,要从 192.168.56.1 这个口发出去,发给 192.168.56.2。那 192.168.56.2 的 MAC 地址是多少呢?路由器 A 发送 ARP 获取 192.168.56.2 的 MAC 地址。 

    当网络包发送到中间的局域网的时候,服务器 A 也需要有个国际身份,因而在国际上,源 IP 地址也不能 用 192.168.1.101,需要改成 192.168.56.1。发送包的内容是这样的:

    源 MAC:192.168.56.1 的 MAC 地址

    目标 MAC:192.168.56.2 的 MAC 地址

    源 IP:192.168.56.1

    目标 IP:192.168.56.2 

    包到达 192.168.56.2 这个网口,发现 MAC 一致,将包收进来,开始思考往哪里转发。 

    路由器 B 是一个 NAT 网关,它上面配置了,要访问国际身份 192.168.56.2 对应国内身份 192.168.1.101,于是改为访问 192.168.1.101。 

    于是,路由器 B 思考的时候,匹配上了这条路由,要从 192.168.1.1 这个口发出去,发给 192.168.1.101。 

    那 192.168.1.101 的 MAC 地址是多少呢?路由器 B 发送 ARP 获取 192.168.1.101 的 MAC 地址,然 后发送包。内容是这样的: 

    源 MAC:192.168.1.1 的 MAC 地址

    目标 MAC:192.168.1.101 的 MAC 地址

    源 IP:192.168.56.1
    目标 IP:192.168.1.101

    从服务器 B 接收的包可以看出,源 IP 为服务器 A 的国际身份,因而发送返回包的时候,也发给这个国 际身份,由路由器 A 做 NAT,转换为国内身份。

    小结

    如果离开本局域网,就需要经过网关,网关是路由器的一个网口;

    路由器是一个三层设备,里面有如何寻找下一跳的规则;

    经过路由器之后 MAC 头要变,如果 IP 不变,相当于不换护照的欧洲旅游,如果 IP 变,相当于换护 照的玄奘西行。

    参考刘超老师《趣谈网络协议》

    一个没有高级趣味的人。 email:hushui502@gmail.com
  • 相关阅读:
    【常用配置】Spring框架web.xml通用配置
    3.从AbstractQueuedSynchronizer(AQS)说起(2)——共享模式的锁获取与释放
    2.从AbstractQueuedSynchronizer(AQS)说起(1)——独占模式的锁获取与释放
    1.有关线程、并发的基本概念
    0.Java并发包系列开篇
    SpringMVC——DispatcherServlet的IoC容器(Web应用的IoC容器的子容器)创建过程
    关于String的问题
    Spring——Web应用中的IoC容器创建(WebApplicationContext根应用上下文的创建过程)
    <<、>>、>>>移位操作
    System.arraycopy(src, srcPos, dest, destPos, length) 与 Arrays.copyOf(original, newLength)区别
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12194162.html
Copyright © 2020-2023  润新知