目录
跨网关访问
MAC 头和IP 头的细节
路由算法
静态路由
过网关的“变”与“不变”
转发网关
NAT 网关
动态路由
动态路由算法
距离矢量路由算法
链路状态路由算法
动态路由协议
基于链路状态路由算法的 OSPF" >基于链路状态路由算法的 OSPF
基于距离矢量路由算法的 BGP" >基于距离矢量路由算法的 BGP
总结
首页 web前端 js教程 网络协议之路由协议的详细介绍(示例讲解)

网络协议之路由协议的详细介绍(示例讲解)

Nov 21, 2018 am 11:43 AM
javascript php

本篇文章给大家带来的内容是关于网络协议之路由协议的详细介绍(示例讲解),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

前面例子中,我们都是在一个局域网内折腾。今天就让我们扩大范围,在多个局域网甚至到广阔的互联网世界中遨游,看看这中间会发生什么。

这个过程中,跨网关访问是我们要了解的第一个内容。

跨网关访问

当我们要了解跨网关访问时,就牵扯到 MAC 地址和 IP 地址的变化,因此,我们先来看下 MAC 头和 IP 头的细节。

MAC 头和IP 头的细节

2648732515-5bf4bdd80cb2d_articlex.png

如图,在 MAC 头里,先是目标 MAC 地址,然后是源 MAC 地址,最后是协议类型。

在 IP 头里,最重要的就是源 IP 地址和目标 IP 地址。除此之外,还有版本号,也就是我们常说的 IPv4 和 IPv6、服务类型 TOS(表示数据包优先级)、TTL(数据包生存周期)以及标识协议(TCP 和 UDP)

当我们访问博客园时,经过的第一个网关应该就是我们配置的默认网关。当本机访问默认网关时,还是走局域网内部访问的步骤:

  1. 将源地址和目标 IP 地址放入 IP 头;

  2. 通过 ARP 协议获得网关的 MAC 地址;

  3. 将源 MAC 地址和网关的 MAC 地址放入 MAC 头中,发送给网关。

而我们的网关,一般就是指家里的路由器,是一个三层转发的设备。它会把 MAC 头和 IP 头都取下来,然后根据里面的内容,看看接下来把数据包转发到哪里。

很多情况下,人们把网关叫做路由器。其实并不准备,用这个比喻应该更为恰当些:

路由器是一台设备,它有五个网口或者网卡,相当于有五只手,分别连着五个局域网。每只手的 IP 地址都和局域网的 IP 地址有着相同的网段,每只手都是它握住的那个局域网的网关。

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

注意,在上面这个过程中,有出现路由算法。接下来,我们就来认识下它。

路由算法

路由算法,又名选路算法,是提高路由协议功能,尽量减少路由时所带来的开销的算法。

路由算法可以根据多个特性来加以区分,找到到达目的地的最佳路由。

路由算法的区分点有很多,有

  • 静态与动态

  • 单路径与多路径

  • 平坦与分层

  • 主机智能与路由器智能

  • 域内与域间

  • 链接状态与距离向量

    这里主要介绍静态与动态路由算法。

静态路由

    静态路由算法,实质上是由网关配置好的映射表。

    我们家里的路由器,可能会有这样的路由配置

访问博客园,从 2 号口出去,下一跳是 IP2;
访问百度,从 3 号口出去,下一跳是 IP3。

    类似上述这样的规则就是静态路由,按照一定的语法保存在路由器里。

    每当要选择从哪个口抛出去的时候,就一条一条的匹配规则,找到符合的规则,就按规则办事,从指定口抛出去,找下一跳 IP。

过网关的“变”与“不变”

    之前我们了解到,MAC 地址是一个局域网内才有效的地址。因此,MAC 地址只要过网关,就肯定会改变。而 IP 地址在过网关后 ,就不一定会改变了。

    经过网关 A 后,如果IP 地址没有改变,那 A 就是转发网关,否则,就是NAT网关

转发网关

3256003361-5bf4bdd80d10a_articlex.png

    如上图,服务器 A 要访问服务器 B,要经过过程:

1)服务器 A 到 网关 A

  1. 检查 B 的网段,发现不在同一个网段,因此发给网关

  2. 由于网关的 IP 地址是已经配置好了,因此发送 ARP 获取网关的 MAC 地址

  3. 发送包

而最后发送包的内容主要有:

  • 源 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 中配置了规则 A1:

要访问 192.168.4.0/24,就从 192.168.56.1 这个网口出去,下一跳是 192.168.56.2

2)网关 A 到 网关 B

    于是,路由器 A 匹配了 A1,要从 192.168.56.1 这个口发出去,发给 192.168.56.2。于是,又开始了这个过程:

  1. 检查 B 的网段,发现在同一个网段, ARP 获取 MAC 地址

  2. 发送包

数据包的内容是:

  • 源 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 配置以下规则 B1:

想访问 192.168.4.0/24,就从 192.168.4.1

    而路由器 B 发现,它的右网口就是目标地址网段的,因此就没有下一跳了。

3)网关 B 到 服务器 B

路由器 B 匹配上 B1。从 192.168.4.1 出口,发给 192.168.4.101。数据包内容:

  • 源 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 网关

    NAT 网关,也就是 Network Address Translation。

3026504042-5bf4bdd811cb8_articlex.png

    由于各个局域网都有各自的网段,很容易出现 IP 冲突的情况。如上图,美国服务器 A 的 IP 地址和 法国服务器 B 的 IP 地址都是 192.168.1.101/24,从 IP 上看,好像是自己访问自己,但实际上从美国的 192.168.1.101 访问法国的 192.168.1.101。

    如何解决这个问题呢?既然局域网之间没有商量好 IP 分配,各管各的,那到国际上,也就是中间的局域网里面,就需要使用另外的地址,就像出国后,我们要改用护照一样。

    首先,目标服务器 B 在国际上要有一个国际的身份,我们给它一个 190.168.56.2.在网关 B 上,我们记下来,国际身份 192.168.56.2 对应国内身份 192.168.1.101.凡是要访问 192.168.56.2 的,网关都要转成 192.168.1.101。

    于是,源服务器 A 要访问目标服务器 B,目标地址就变成国际 IP 地址 192.168.56.2。过程如下:

1)源服务器 A 发数据包到网关 A

  1. 检查服务器 B IP,不在同一网段

  2. ARP 获取网关 MAC 地址

  3. 发送包

数据包的内容是这样的:

  • 源 MAC:服务器 A 的 MAC

  • 目标 MAC:192.168.1.1 这个网口的 MAC

  • 源 IP:192.168.1.101

  • 目标 IP:192.168.56.2

    路由器 A 中 192.168.1.1 这个网口收到数据包后,检查 MAC 地址一致,将包收进来。

    在路由器 A 中配置了规则:

想访问 192.168.56.2/24,就从 192.168.56.1 网口发出去,发给 192.168.56.2,没有下一跳。

    由于路由器的右网口(192.168.56.1) IP 地址和目标 IP 地址在同一网段,因此没有下一跳。

2)网关 A 到网关 B
当网络包发送到中间的局域网时,服务器 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.101,就从 192.168.1.1 网口出去,没有下一跳。

    于是,数据包就从 192.168.1.1 这个网口发给 192.168.1.101。

3)网关 B 到服务器 B
数据包从 192.168.1.1 网口发出后,同样经过这些步骤:

  1. 检查服务器 B 的 IP,在同一网段

  2. ARP 获取服务器 B 的 MAC 地址

  3. 发送包

这时的数据包就变成了:

  • 源 MAC:192.168.1.1 的 MAC

  • 目标 MAC:192.168.1.101 的 MAC

  • 源 IP:192.168.56.1

  • 目标 IP:192.168.1.101

    服务器收到包后,检查 MAC 地址一致,就将数据包收进来。

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

动态路由

动态路由算法
距离矢量路由算法

1)基本思路

基于Bellman-Ford 算法。每个路由器都保存一个路由表,包含多行,每行对应网络中的一个路由器,每一行包含两部分信息,一个是要到目标路由器,从哪条线出去,另一个是到目标路由器的距离

2)存在问题

a. 好消息传得块,坏消息传的慢

新加入的路由器能够很快的新路由器信息广播出去。但是如果一个路由器挂了,挂的消息没有广播。每个经过这个宕机节点的路由器,无法得知该节点一宕机,而是试图通过其他的路径访问,直到试过了所有的路径,才发现这个路由器已经宕机了。

示例:

b. 每次发送消息,要发送整个全局路由表

    上面的两个问题,限制了距离矢量路由的网络规模,仅适用于小型网络(小于 15 跳)。

链路状态路由算法

1)基本思路

基于Dijkstra 算法。当一个路由器加入网络是,首先是发现邻居,给邻居说 hello,邻居都回复。然后计算和邻居的距离,发送一个 echo,要求马上返回,除以 2 就是距离。接着将自己和邻居之间的链路状态包广播出去,发送到整个网络的每个路由器。

    这种算法中,每个路由器都能在自己本地构建一个完整的图,然后针对这个图使用 Dijkstra 算法,找到两点之间的最短路径。

    不像距离矢量路由协议那样,更新时发送整个路由表。链路状态路由协议只广播更新的或改变的网络拓扑,这使得更新信息更小,节省了宽带和 CPU 利用率。而且一旦一个路由器挂了,它的邻居都会广播这个消息,可以使得坏消息迅速收敛。

动态路由协议
基于链路状态路由算法的 OSPF

OSPF(Open Shortest Path First, 开放式最短路径优先)协议,广泛应用在数据中心的协议。由于主要用在数据中心内部,用于路由决策,因此称为内部网关协议(Interior Gateway Protocol,简称 IGP)

    内部网关协议的重点就是找到最短路径。当存在多个最短路径时,可以在这多个路径中进行负载均衡,这常常被称为等价路由

    等价路由不仅可以用来分摊流量,还可以提高容错率,当一条路径不通时,还可以通过另外一条路到达目的地。

基于距离矢量路由算法的 BGP

针对网络之间的路由协议,称为外网路由协议(Border Gateway Protocol,简称 BGP)

    每个数据中心都有自己的路由配置。例如,哪些外部 IP 可以让内部知晓,哪些内部 IP 可以让外部知晓,哪些可以通过,哪些不能通过。

    因此,在各个数据中心进行交互时,需要一种协议,通过这种协议,可以知道相邻数据中心的路由配置,从而找到数据中心之间最好的路由。

    BGP 协议就是这样的协议。它不着眼于发现和计算路由,而在于控制路由的传播和选择最好的路由。

总结

  • 数据包要离开本局域网,就要经过网关,网关就是路由器的一个网口;

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

  • 经过路由器之后的 MAC 头肯定会变。如果 IP 不变,就是 转发网关,否则就是 NAT网关

  • 路由分静态路由和动态路由,动态路由可以配置复杂的策略路由,控制转发策略;

  • 动态路由主流算法有两种,距离矢量算法和链路状态算法。基于两种算法产生两种协议,BGP 协议和 OSPF 协议。

以上是网络协议之路由协议的详细介绍(示例讲解)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

您如何在PHP中解析和处理HTML/XML? 您如何在PHP中解析和处理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

php程序在字符串中计数元音 php程序在字符串中计数元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? 什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP:网络开发的关键语言 PHP:网络开发的关键语言 Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

See all articles