路由和寻址的区别

news2024/11/28 14:51:33

如果说传输层协议,除了 TCP/UDP,我们还可以有其他选择,比如 Google 开发的 QUIC 协议,帮助在传输层支持 HTTP 3.0 传输。但是在网络层,IP 协议几乎一统天下。IP 协议目前主要有两个版本 IPv4 和 IPv6。
根据 Google 统计,使用 IPv6 的Google 用户比例在 30% 左右。
在这里插入图片描述
IPv4使用范围很大,平时工作中很容易遇到,比如开发场景、网络优化场景、解决线上问题场景等。

什么是 IP 协议?

IP 协议(Internet Protocol)是一个处于垄断地位的网络层协议。 IPv4 就是 IP 协议的第 4个版本,是目前互联网的主要网络层协议。IPv4 为传输层提供 Host-To-Host 的能力,IPv4需要底层数据链路层的支持。
在这里插入图片描述

IP 协议并不负责数据的可靠性。传输数据时,数据被切分成一个个数据封包。IP 协议上层的传输层协议会对数据进行一次拆分,IP 协议还会进一步进行拆分。进行两次拆分是为了适配底层的设备。之前我们提到过, 数据在网络中交换(封包交换算法),并不需要预先建立一个连接,而是任由数据在网络中传输,每个节点通过路由算法帮助数据封包选择下一个目的地。
可靠性,可靠性保证数据无损地到达目的地。可靠性是 IP 协议上方的 HostTo-Host 协议保证的,比如 TCP 协议通过应答机制、窗口等保证数据的可靠性。 IP 协不能保证可靠性。比如 IP 协议可能会遇到下面这几个问题:

  • 封包损坏(数据传输过程中被损坏);
  • 丢包(数据发送过程中丢失);
  • 重发(数据被重发,比如中间设备通过 2 个路径传递数据);
  • 乱序(到达目的地时数据和发送数据不一致)。
    但是 IP 协议并不会去处理这些问题,因为网络层只专注解决网络层的问题, 而且不同特性的应用在不同场景下需要解决的问题不一样。对于网络层来说,这里主要有 3 个问题要解决:
  • 延迟
  • 吞吐量
  • 丢包率

这三个是鱼和熊掌不能兼得。另外,IP 协议目前主要有两种架构,一种是 IPv4,是目前应用最广泛的互联网协议;另一种是 IPv6,目前世界各地正在积极地部署 IPv6。

IP 协议的工作原理

IP 协议接收 IP 协议上方的 Host-To-Host 协议传来的数据,然后进行拆分,这个能力叫作分片(Fragmentation)。然后 IP 协议为每个片段(Fragment)增加一个 IP 头(Header),组成一个IP 封包(Datagram)。之后,IP 协议调用底层的局域网(数据链路层)传送数据。最后 IP 协议通过寻址和路由能力最终把封包送达目的地。接下来为你讲述完
整的过程。

分片(Fragmentation)

分片就是把数据切分成片。 IP 协议通过它下层的局域网(链路层)协议传输数据,因此需要适配底层传输网络的传输能力。数据太大通常就不适合底层网络传输,这就需要把大的数据切片。 当然也可能选择不切片,IP 协议提供了一个能力就是把封包标记为不切片,当底层网络看到不切片的封包,又没有能力传输的时候,就会丢弃这个封包。你要注意,在网络环境中往往存在多条路径,一条路径断了,说不定其他路径可以连通。

增加协议头(IP Header)

切片完成之后,IP 协议会为每个切片(数据封包 Datagram)增加一个协议头。一个 IPv4 的协议头看上去就是如下图所示的样子:
在这里插入图片描述
其中分成 4 个部分。

  • 最重要的是原地址和目标地址。IPv4 的地址是 4 组 8 位的数字,总共是 32 位。具体地
    址的作用我们在下面的“寻址部分”介绍。
  • Type Of Service 服务的类型,是为了响应不同的用户诉求,用来选择延迟、吞吐量和丢
    包率之间的关系。关于这块知识,
  • IHL(Internet Header Length)用来描述 IP 协议头的大小。所以 IP 协议头的大小是
    可变的。IHL 只有 4 位,最大值 1111 = 15。最大是 15 个双字(15*4 字节 = 60 字
    节)。
  • Total Length 定义报文(封包 Datagram)的长度。
  • Identification(报文的 ID),发送方分配,代表顺序。
  • Fragment offset 描述要不要分包(拆分),以及如何拆分。
  • Time To Live 描述封包存活的时间。因此每个 IP 封包发送出去后,就开始销毁倒计
    时。如果倒计时为 0,就会销毁。比如中间的路由器看到一个 TTL 为 0 的封包,就直接
    丢弃。
  • Protocol 是描述上层的协议,比如 TCP = 6,UDP = 17。
  • Options 代表可选项。

“鱼和熊掌”不能兼得——延迟、吞吐量、丢包率

IPv4 协议中提供了一个叫作 Type of Service(服务类型)的字段。这个字段是
为了在延迟、吞吐量和丢包率三者间选择。

  • 延迟(latency)
    延迟指的是 1 bit 的数据从网络的一个终端传送到另一个终端需要的时间。这个时间包括在发
    送端准备发送的时间、排队发送的时间、发送数据的时间、数据传输的时间等。
  • 吞吐量(Throughput)
    吞吐量指单位时间内可以传输的平均数据量。比如用 bit/s 作为单位,就是 bps。吞吐量和延
    迟没有联系,比如延迟很高的网络,有可能吞吐量很高。可以类比成水管很大流速很慢,对比
    水管很细流速很快,这两种情况,最终流量可以是相等的。
  • 丢包率(Packet loss)
    丢表率指发送出去的封包没有到达目的地的比例。 在最大流速确定的网络中,丢表率会直接影
    响吞吐量。
    如果把延迟看作一个平均指标,丢包也会影响延迟——一个包丢了,需要重发。而有的应用需要高吞吐量,延迟不是很重要,比如说网盘下载文件。大部分应用期望丢包不能太严重,比如语音电话,少量丢包还能听清,大量丢包就麻烦了,根本听不清对方说什么。严格希望不丢包的应用比较少,只有极特殊的网络控制管理场景,才需要在互联网层要求不丢包。当然这三个条件,通常不能同时满足。如果同时追求延迟、吞吐量、丢包率,那么对网络设备的要求就会非常高,说白了就会非常贵。因此 IP 协议头中的 Type of Service 字段里,有以下4 种主要的类型可以选择:
  • 低延迟
  • 高吞吐量
  • 低丢包率
  • 低成本

寻址(Addressing)

地址想要表达的是一个东西在哪里。寻址要做的就是:给一个地址,然后找到这个东西。IPv4
协议的寻址过程是逐级寻址。

IPv4 地址

IPv4 地址是 4 个 8 位(Octet)排列而成,总共可以编址 43 亿个地址。比如 103.16.3.1 就是一个合法的 Ipv4 地址。4 组数字用.分开,是为了让人可读,实际上在内存和传输过程中,就是直接用 32 位。你可以观察一下103.16.3.1的二进制,如下图所示:

寻址过程

寻址就是如何根据 IP 地址找到设备。因为 IPv4 的世界中,网络是一个树状模型。顶层有多个平行的网络,每个网络有自己的网络号。然后顶层网络下方又有多个子网,子网下方还有子网,最后才是设备。

在这里插入图片描述
IP 协议的寻址过程需要逐级找到网络,最后定位设备。下面我们具体分析下这个过程。

  • 步骤 1:找到顶层网络
    比如103.16.3.1最顶层的网络号可以和255.0.0.0(子网掩码)做位与运算得到,如下所
    示:
    因此103.0.0.0就是103.16.3.1所在的顶层网络。255.0.0.0.称作子网掩码。子网掩码的
    作用就是帮助根据 IP 地址找到对应子网。子网掩码是很多个1接着很多个0,和 IP 地址一起使
    用。
  • 步骤 2:找到下一层网络
    接下来要找到下一级网络,就需要用 IP 地址和下一级的子网掩码做位与运算。 比如:
    其中103.16.0.0就是下一级的网络号。
  • 步骤 3:找到再下一级网络
    接下来使用255.255.255.0子网掩码找到下一级网络是103.16.3.0。
  • 步骤 4:定位设备
    设备就在子网103.16.3.0中,最终找到的设备号是1。
    当然子网掩码也不一定都是255,比如这个子网掩码255.240.0.0也是可以的。但通常我们把
    IPv4 的网络分成这样 4 层。

路由(Routing)

在寻址过程中,数据总是存于某个局域网中。如果目的地在局域网中,就可以直接定位到设备
了。如果目的地不在局域网中,这个时候,就需再去往其他网络。
由于网络和网络间是网关在连接,因此如果目的地 IP 不在局域网中,就需要为 IP 封包选择通
往下一个网络的路径,其实就是选择其中一个网关。你可能会问:网关有多个吗?如果一个网
络和多个网络接壤,那自然需要多个网关了。下图中,路由器在选择 IP 封包下一个应该是去
往哪个 Gateway?
假如,我们要为 IP 地址 14.215.177.38 寻址,当前路由器所在的网络的编号是16.0.0.0。那么
我们就需要知道去往 14.0.0.0 网络的 Gateway IP 地址。
如果你在当前网络中用route查看路由表,可能可以看到一条下面这样的记录。

  • Destination:14.0.0.0
  • Gateway:16.12.1.100
  • Mask:255.0.0.0
  • Iface:16.12.1.1
    这条记录就说明如果你要去往 14.0.0.0 网络,IP 地址 14.215.177.38 先要和 255.0.0.0 进行位
    运算,然后再查表,看到 14.0.0.0,得知去往 Gateway 的网卡(IFace)是 16.12.1.1。
    当封包去向下一个节点后,会进入新的路由节点,然后会继续上述路由过程,直到最终定位到
    设备。

总结

首先 IP 协议会进行分片,将上游数据拆成一个个的封包(Datagram),然后为封包增加 IP 头部。封包发送出去后,就开始了寻址过程。寻址就是找到 IP 地址对应的设备。在局域网内,如果找不到设备,就需要路由。路由就是找到数据应该往哪里发送。最后通过层层路由定位到具体的设备。
寻址(Addressing)就是通过地址找设备。和现实生活中的寻址是一样的,比如根据地址找到一个公寓。在 IPv4 协议中,寻址找到的是一个设备所在的位置。路由(Routing)本质是路径的选择。就好像知道地址,但是到了每个十字路口,还需要选择具体的路径。所以,要做路由,就必须能够理解地址,也就是需要借助寻址的能力。要通过寻址找到最终的设备,又要借助路由在每个节点选择数据传输的线路。因此,路由和寻址,是相辅相成的关系。
下面这几个地址 127.0.0.1, localhost, 0.0.0.0 有什么不同?
127.0.0.1是本地回环地址(loopback),发送到 loopback 的数据会被转发到本
地应用。
localhost 指代的是本地计算机,用于访问绑定在 loopback 上的服务。localhost 是一个主机
名,不仅仅可以指向 IPv4 的本地回环地址,也可以指向 IPv6 的本地回环地址 [::1]。
0.0.0.0是一个特殊目的 IP 地址,称作不可路由 IP 地址,它的用途会被特殊规定。通常情况下,当我们把一个服务绑定到0.0.0.0,相当于把服务绑定到任意的 IP 地址。比如一台服务器上有多个网卡,不同网卡连接不同的网络,如果服务绑定到 0.0.0.0 就可以保证服务在多个IP 地址上都可以用。

在服务器中,0.0.0.0指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,
192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0,那么通过两个ip
地址都能够访问该服务。 一般我们自己的机器都会有防火墙之类的东西阻止非此局域网
的IP访问,所以测试时才需要其他人的机器与自己接入同一个局域网。  而作为IP地
址,0.0.0.0意味着“这个网络”或者“这个主机”,全0的IP地址作为网络号指的是当前网
络。0.0.0.0允许机器在不知道网络号的情况下访问自己所在的网络。  因此,当我们
在本地启动flask应用时,在浏览器输入0.0.0.0:5000,无论有无接入互联网都可以访问
flask应用,因为机器访问的是自己所在的网络。  所有127.xx.yy.zz形式的地址保留给
回环测试用,发送到该地址的数据包并没有被真正放在线路上,它们如同入境数据包一
样在本地处理。  而127.0.0.1是一个回环地址,通过这个地址我们只能访问发出此次
访问的同一台主机,目的地址为“127.0.0.1”的数据包不会通过网关,因此该数据包不会
出现在网络传输过程中。如果一个服务监听127.0.0.1,其实它只监听本机对此服务的访
问。  localhost是一个别名,默认表示IP地址127.0.0.1,也可以在/etc/hosts中设置为
其他IP地址。在终端ping localhost可以看到localhost被解析为127.0.0.1
**强:
localhost其实是一个域名,一般windows系统默认指向127.0.0.1,但不代表localhost就
是127.0.0.1,localhost指向的IP地址是可以配置的;凡是以127开头的地址,都是回环地
址。通俗讲,我们在主机上发送给127开头的IP地址会被发送的主机自己接受,根本穿不
回去,外部设备也无法通过回环地址访问到本机。而127.0.0.1作为127集合中的一员,也
是个回环地址。只不过127.0.0.1经常被默认配置为localhost的IP地址。(正常的数据包
会从IP层进入链路层,然后发送到网络上,而给回环地址发送数据包,数据包会直接被
发送的主机的IP层获取,后面没有链路层什么事了)0.0.0.0并不是真实的IP地址,它表
示本机中所有的IPv4地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开发者一定要知道的 API 管理五大趋势

API First 大势所趋,APIaaS(API 作为服务)也将受到越来越多企业和组织的选择,研发团队对 API 研发管理工具的要求也水涨船高。 API 在今天的数字化世界中扮演着至关重要的角色,随着云计算、物联网、微服务尤其是 AI 等…

Uniapp 引入uView-ui 插件

前言 最近在写uniapp,用了一下原生的ui框架感觉不是很好看,打算去插件市场上面找一下好看的UI插件。学习不是闭门造车,自己重复造轮子。能自己解决和会不会用别人的方法是两回事。我自己也能写UI界面逻辑,但是这样太费时间了。最…

线宽变大,损耗变小;线宽无限大,损耗无限小?

一博高速先生成员:黄刚 作为高速信号传输的重要的指标之一,损耗,无论是对硬件工程师,设计工程师还是我们SI工程师来说,都会是非常的关注。而对于像背板传输这种长距离的走线系统或是像芯片测试板要求损耗极小的情况&a…

港联证券|港交所内地路演人气爆棚 新一轮上市改革加速推进

5月10日,香港交易所在深圳举行未来科技峰会,拉开了港股特专科技上市新规内地路演推广的序幕。 今年3月底,港交所正式推出特专科技公司上市新规,《主板上市规则》新增18C章,并于3月31日起接收特专科技公司上市申请&…

JavaWeb《后端内容:2. MVC-ServletContext-IOC-事务管理-过滤器Filter》

目录 1. 准备和回顾 2. MVC-reflect 3. MVC-dispatcherServlet 3.1 思路部分 3.2 Debug部分 3.3 基于controller进行优化 4. Servlet-api 4.1 回顾 4.2 Init方法 1. 获取ServletConfig config getServletConfig(); 2. 获取初始化参数值:config.getInitP…

静态库(lib),动态库(dll)

我之前有一篇文章讲过静态链接库和动态链接库,大家可以点击链接去看一下:静态链接库,动态链接库【滴水逆向三期48笔记】,由于不是系统学习Windows编程,感觉那时候就是囫囵吞枣,今天又学习了一遍&#xff0c…

基于Keil生成外部Nor Flash下载算法,并使用J-Flash直接烧录(以W25Q64为例)

需要的软件: Keil STM32CubeMX J-Flash 参考文档: 方法1:在Keil中点击Help→uVision Help,然后再搜索框中输入FLM,点击列出主题,可以看到生成下载算法的大致步骤: 方法2:在ARM Ke…

带你玩转三子棋—【C语言】

目录 前言: 1. 菜单的打印 2. game函数的实现 2.1 初始化棋盘 2.2 显示棋盘 2.3 玩家下棋 2.4 电脑下棋 2.5 判断输赢 2.6 判断棋盘是否满了 3. 全部代码 3.1 game.h 3.2 game.c 3.3 test.c 前言: 为了实现三子棋,首先我们应该…

frp将配置写在代码中重新打包

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。在有些情况下我们需要隐藏配置信息,尤其是客户端(比如我们要在第三方电脑…

第五章 总结及作业(123)【编译原理】

第五章 作业【编译原理】 前言推荐第五章 总结5.1自下而上分析基本问题 5.1.1归约5.1.2规范归约简述5.1.3 符号栈的使用与语法树的表示 5.2 算符优先分析5.2.1算符优先文法及优先表构造算法:构造FIRSTVT集算法:构造LASTVT集算法:构造优先表5.…

Google I/O 2023 - 一文快速总结 Flutter Dart 的现状和未来

随着 Google I/O 2023 的发布, Flutter 3.10 和 Dart 3.0 也都正式发,不得不说如今 Dart 的版本号终于快追上 Flutter 得版本号了,特别随着 Dart 3 的发布, Flutter 在 records 和 patterns 的加持下,开发体验终于开始…

LlamaIndex :面向QA 系统的全新文档摘要索引

在这篇博文中,我们介绍了一种全新的 LlamaIndex 数据结构:文档摘要索引。我们描述了与传统语义搜索相比,它如何帮助提供更好的检索性能,并通过一个示例进行了介绍。 背景 大型语言模型 (LLM) 的核心场景之一是对用户自己的数据进…

MapReduce框架

TextInputFormat 1)FileInputFormat实现类 思考:在运行MapReduce程序时,输入的文件格式包括:基于行的日志文件、二进制格式文件、数据库表等。那么,针对不同的数据类型,MapReduce是如何读取这些数据的呢&…

Postman 如何关联接口测试并设置全局变量(带有token鉴权)

一、登陆接口 创建一个request请求 在Tests中添加JavaScript代码,用来获取鉴权: var jsonData JSON.parse(responseBody); var Authorization jsonData.data.access_token; console.log(Authorization) pm.globals.set(‘Authorization’,Authorizatio…

solr快速上手:solr简介及安装(一)

0. 引言 虽然现在主流的搜索引擎组件已经es主导,但不乏有部分“老”项目依旧在采用solr,当遇到这类项目时,如何快速上手solr组件,以及后续如何拓展深入研究solr的途径成为问题,本期我们的目的就是带大家来快速上手sol…

2023 年第三届长三角高校数学建模竞赛赛题浅析

为了更好地让大家本次长三角比赛选题,我将对本次比赛的题目进行简要浅析。数模模型通常分为优化、预测、评价三类,而本次数学题目就正好对应着A、B、C分别为优化、预测、评价。整体难度不大,主要难点在于A题的优化以及B、C的数据收集。稍后&a…

QT5.12.6 + mysql5.5.9 出现 Driver not loaded Driver not loaded

由于我重装了电脑系统,qt 和mysql均进行了软件版本的升级, 在使用数据库模块时,出现了如下问题: Driver not loaded Driver not loaded 排除问题一: pro文件中是否加载了sql模块 查看pro文件,发现 有此模…

React的两种组件创建方式(二)

react是面向组件编程的一种模式&#xff0c;它包含两种组件类型&#xff1a;函数式组件及类式组件 函数式组件 一个基本的函数组件长这个样子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>hell…

java报错-->java.lang.IllegalAccessError

1、前言 在gradle中运行main方法突然出现如下错误 Exception in thread "main" java.lang.IllegalAccessError: class XXX.util.ImageBorderUtils (in unnamed module 0x4bd4bcd4) cannot access class sun.font.FontDesignMetrics (in module java.desktop) becaus…

使用宝塔在Linux面板搭建网站,并实现公网远程访问「内网穿透」

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 转载自远程内网穿透的文章&#xff1a;Linux使用宝塔面板搭建网站&#xff0c;并内网穿透实现公网访问 前言 宝塔面板作为简单好用的服务器运维管理面板&#…