【读书笔记-《网络是怎样连接的》- 7】Chapter3_2 路由器

本篇继续介绍路由器及其转发过程。

在这里插入图片描述

1 路由器内部结构

路由器内部结构图如图所示。
在这里插入图片描述
即主要包含左侧的包转发模块和右侧的端口模块。转发模块负责查找包的发送目的地,端口模块完成包的发送。通过安装不同的硬件,转发模块不仅可以支持以太网,也可以支持无线局域网等不同的网络技术。

首先,端口模块根据使用的网络技术,将发过来的包接收进来。接下来转发模块根据包的IP头部中记录的接收方IP地址,在路由表中查询转发目标。然后转发模块将包转移到端口模块,由端口模块根据使用的硬件规则再将包发送出去。

与交换机的不同之处在于,路由器的端口具有MAC地址,会根据包中的接收方MAC地址判断是否需要接收;同时端口还具有IP地址,将需要转发的包发送出去。从这个意义上来讲,路由器的端口与计算机网卡是一致的。路由器的工作有个接收-发送的过程,而对于交换机来说其实没有进行任何处理,只是将所有进来的包再转发出去。

2 路由表

路由器根据路由表查询发送目的地,路由表的内容如下表所示。
在这里插入图片描述
将接收方IP地址与表中的目标地址进行匹配,其中子网掩码一列表示匹配的字节数。网关列为转发的目的地址,而接口表示转发的端口。假设当前收到一个包,其接收方目标地址为10.10.1.10。在表中查找,发现第一条记录目标地址为10.10.1.0,子网掩码为255.255.255.0,表示只匹配前24个比特,则这个包可以与第一条记录匹配上。10.10.1.0这样的记录,主机号的8个比特全部为0,表示的是一个子网;而10.10.1.101这样的记录,主机号的8个比特不全为0,则表示的是一台主机。

此外路由表的更新与交换机地址表的更新也有所不同。交换机在转发过程中可以自动更新地址表,而路由表则无法进行这样的更新。路由表的更新有以下两种方式:

(1) 由人手动维护路由记录;
(2) 根据路由协议机制,通过路由器之间的信息交换,由路由器自行维护路由记录;

3 路由器基本工作过程

了解了路由表的基本内容,再来看路由器的工作过程。

首先路由器会接收发送过来的网络包。网络包经网线到达路由器接口时,PHY与MAC模块将信号转换为数字信息,检查包结尾的FCS,FCS无误后再检查MAC头部中的接收方MAC地址。如果接收方MAC地址与端口的MAC地址一致,则存入缓冲区,否则就丢弃这个包。

路由器收到包之后会将MAC头部去掉。因为MAC头部就是用来将包转发到路由器的,到达路由器之后,这个MAC头部就会被丢弃,在转发到下一个路由器前,再添加上新的MAC头部。

接下来转发模块会根据路由表查询转发的目标。以上表中的内容为例,假设当前有IP地址为10.10.1.101的计算机向IP地址为192.168.1.10的服务器发送一个包,这个包会先到达路由器。首先会根据包的接收方地址,在目标地址栏中进行匹配。如前所述,这里会根据子网掩码确定匹配的比特数。

根据实际情况,可能匹配到多条满足要求的记录,这时要选择网络号比特数最长的一条记录。网络号的比特数越长,则主机号的比特数越短,说明子网中可能存在的主机数越少,这样就可以尽量缩小范围。

如果根据这一规则,仍然匹配到了多条网络号比特数相同的记录,则需要根据跃点数来进行判断。跃点数越小,说明该路由器越近,因此要选择跃点数最小的记录。

如果未匹配到符合要求的记录,则路由器会丢弃这个包,并通过ICMP消息告知发送方。另外,最后一行的目标地址0.0.0.0,是在其他记录都无法匹配时选择的默认地址。因为目标地址和子网掩码都为0.0.0.0,任何地址都可以匹配到这条记录。在这一条记录的网关列中填入接入互联网的路由器地址,当匹配不到其他记录时,网络包机会转发到互联网接入路由。因此这一条记录也被称为默认路由,配置的网关被称为默认网关。

查找到转发目标之后,还需要完成一些工作,才能将包交给端口模块进行发送。

首先是更新IP头部中的TTL(Time To Live,生存时间)参数,该参数表示包的有效期,每经过一个路由器,TTL的值就-1,当TTL的值变为0时,该包就会被丢弃。如果路由表的转发目标配置有问题,包就可能出现死循环的情况,这一机制是为了防止这一情况。TTL通常被设置为64或128,在正常情况下访问任何一台服务器所需要经过的路由器也不过几十个,只要路由表配置正确,包就能够在过期之前被转发到目的地。

由于路由器的端口可以支持不同的硬件协议,可能出现端口的输出包的最大长度小于端口的输入包的最大长度,这种情况下就需要通过IP协议中定义的分片功能对大的包进行拆分。分片功能与TCP协议的拆分的不同之处在于TCP协议是将数据部分拆分之后再添加头部,而IP协议的分片是将包含头部的完整包重新进行拆分,如下图所示。
在这里插入图片描述在分片的过程中,首先查询输出端口的MTU,看包能否不经拆分就进行转发。如果输出端口的MTU小于输入端口,则需要对包进行拆分。接下来查询拆分的标志字段,如果标志字段设置为不允许拆分,则路由器将这个包丢弃并通过ICMP告知。否则就可以根据输出端口的MTU大小对包进行拆分了。原包从TCP头部开始的部分都可以作为拆分的数据,每个拆分的部分也都会被添加MAC头部和IP头部,除了标志分片的信息之外,这些头部信息内容基本是一致的。

以上工作完成之后,可以准备发送了。在路由器中,如果路由表中网关一列为空,表示下一个转发的目标就是包中的接收方地址。根据IP地址,通过ARP协议获取对应的MAC地址,并加入到MAC头部中。

如果接收端口类型为以太网,网络包就会被发往下一个路由器。这样经过多次转发,最终到达目的地。

4 路由器的地址转换

设备在网络中通信时,每个设备都应该具有唯一的地址,这样才能保证包转发到正确的目的地。早期网络确实是这样做的,每个接入网络的设备都会分配唯一的固定地址。但随着接入互联网的设备越来越多,网络地址逐渐面临不够用的情况。

有一种方法是,对于两个互相独立的子网,只要子网内部的IP地址不重复即可,两个子网之间的地址可以重复。这样子网内部的设备就不必分配固定的地址了。子网内部的地址也需要根据一定的规则进行设置,称为私有地址;而原来的固定地址则称为公有地址。私有地址仅限于以下范围:

  • 10.0.0.0 - 10.255.255.255
  • 172.16.0.0 - 172.31.255.255
  • 192.168.0.0 - 192.168.255.255

私有地址本身的结构并无特殊之处,只是将公有地址中没分配的一部分拿出来,规定只能在内网中使用。

这样做可以节省一部分IP地址,但还是无法完全解决问题。如果内网之间不是完全独立的,需要通过互联网传送信息,具有相同内网地址的计算机通信仍然会出现问题。针对这个问题,采用的方法是将子网分成两个部分,一部分是对互联网开放的服务器,另一部分是子网内部的设备。对互联网开放的服务器分配公有地址,可以直接与互联网通信;内部设备分配内部地址,不能和互联网直接收发网络包,需要通过地址转换的机制。

通过私有地址与互联网通信,在建立TCP连接时,首先要将发送方IP地址从私有地址改写为公有地址。这里的公有地址即地址转换设备(路由器)的互联网接入地址。同时端口号也要进行改写,地址转换设备会随机选择一个空闲的端口进行改写。接下来改写前的私有地址和端口号与改写后的公有地址和端口号会作为一组对应的记录,保存在地址转换设备内部的一张表中,如下表所示

在这里插入图片描述
这个包经过改写之后发送出去,会收到来自服务器的响应。响应包中的接收方地址和端口号即是发送前改写的公有地址和端口号。根据公有低值和端口号,在表中查询,即可以找到对应的私有地址和端口号,包就可以到达原始的发送方了。

由于可用端口号有几万个,通过将私有地址转换为公有地址与端口号的组合,相当于一个公有地址可以对应几万个私有地址,很大程度上提高了公有地址的利用率。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P5099 [USACO04OPEN] Cave Cows 4

P5099 [USACO04OPEN] Cave Cows 4https://www.luogu.com.cn/problem/P5099 思路: 这里的垫蹄石之间很明显是有后效性的 所以不能用dp来做 考虑宽搜 我们每次都枚举和这个垫蹄石之间x方向和z方向的距离均不超过2的垫脚石 因为都很大 我们可以使用 代码&#xf…

高阶C语言之六:程序环境和预处理

本文介绍程序的环境,在Linux下对编译链接理解,较为简短,着重在于编译的步骤。 C的环境 在ANSI C(标准C语言)的任何一种实现中,存在两个不同的环境。 翻译环境:在这个环境中,源代码…

【Python数据可视化分析实战】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化

大数据分析设计方案 1.数据集来源:https://search.jd.com 2.实现思路: (1)数据爬取 首先,我们需要从京东平台上采集手机品牌的相关数据。可以通过网络爬虫或API接口等方式获取数据。为了保证数据的完整性和准确性&…

【MySQL-4】表的基本查询

目录 1. 整体学习的思维导图 2. 表的创建 2.1 Create(创建) 2.1.1 插入规则 2.1.2 更新插入 2.2 Retrieve(读取) 2.2.1 创建一个实例表 2.3 select使用 2.3.1 全表查询 2.3.2 指定序列查询 2.3.3 查询表达式 2.3.3.1 为查询表达式改名字 2.3.4 查询去重 2.…

无人机航测技术算法概述!

一、核心技术 传感器技术: GPS/GLONASS:无人机通过卫星定位系统实现高精度的飞行控制和数据采集。 高清相机:用于拍摄地面图像,通过后续图像处理生成三维模型。 激光雷达(LiDAR):通过激光扫…

uniapp 自定义加载组件,全屏加载,局部加载 (微信小程序)

效果图 全屏加载 页面加载使用 局部加载 列表加载里面使用 使用gif html <template><view><view class"" v-if"typeFullScreen"><view class"loading" v-if"show"><view class""><i…

【D3.js in Action 3 精译_040】4.4 D3 弧形图的绘制方法

当前内容所在位置&#xff1a; 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建&#xff08;上篇&#xff09; 4.1.1 D3 中的边距约定&#xff08;中篇&#xff09;4.1.2 坐标轴的生成&#xff08;中篇&#xff09; 4.1.2.1 比例尺的声明&#xff08;中篇&#xff09;4.1…

element ui 走马灯一页展示多个数据实现

element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 主要是对走马灯的数据的操作&#xff0c;先看js处理 let list [{ i: 1, name: 1 },{ i: 2, name: 2 },{ i: 3, name: 3 },{ i: 4, name: 4 },]let newL…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在&#xff0c;大模型已经渗透到各行各业&#xff0c;大模型也逐渐趋于平民化&#xff1b;从最开始对其理解、生成、强大的知识积累的惊叹&…

Linux进阶:软件安装、网络操作、端口、进程等

软件安装 yum 和 apt 均需要root权限 CentOS系统使用&#xff1a; yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&#xff0c;自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…

如何解决飞书网页文字无法复制的问题

如何解决网页文字无法复制的问题&#xff1f;特别推荐提词宝防复制文案功能&#xff01; 在日常工作和学习中&#xff0c;我们经常遇到一些网页文字无法复制的情况&#xff0c;无论是因为权限限制还是其他原因&#xff0c;手动输入内容不仅耗时费力&#xff0c;还容易出错。那…

STM32电源管理—实现低功耗

注&#xff1a; 本文是学习野火的指南针开发板过程的学习笔记&#xff0c;可能有误&#xff0c;详细请看B站野火官方配套视频教程&#xff08;这个教程真的讲的很详细&#xff0c;请给官方三连吧&#xff09; 在响应绿色发展的同时&#xff0c;在很多应用场合中都对电子设备的功…

Linux网络:守护进程

Linux网络&#xff1a;守护进程 会话进程组会话终端 守护进程setsiddaemon 在创建一个网络服务后&#xff0c;往往这个服务进程是一直运行的。但是对于大部分进程来说&#xff0c;如果退出终端&#xff0c;这个终端上创建的所有进程都会退出&#xff0c;这就导致进程的生命周期…

基于深度学习的文本信息提取方法研究(pytorch python textcnn框架)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Seatunnel解决Excel中无法将数字类型转换成字符串类型以及源码打包

需求 需要实现将Excel中的数字类型的单元格像数据库中字符串类型的字段中推送 问题原因 Seatunnel在读取字段类型的时候都是使用强转的形式去获取数据的 假如说数据类型不一样的话直接强转就会报错 修改位置 org/apache/seatunnel/api/table/type/SeaTunnelRow.java org…

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台 传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大&#xff0c;也被企业广泛采用&#xff0c;然后也存着在诸如学习曲线陡峭&#xff0c;上手难度大&#x…

UniAPP快速入门教程(一)

一、下载HBuilder 首先需要下载HBuilder开发工具&#xff0c;下载地址:https://www.dcloud.io/hbuilderx.htmlhttps://www.dcloud.io/hbuilder.html 选择Windows正式版.zip文件下载。下载解压后直接运行解压目录里的HBuilderX.exe就可以启动HBuilder。 UniApp的插件市场网址…

计算机网络 (5)数据通信的基础知识

前言 数据通信是一种以信息处理技术和计算机技术为基础的通信方式&#xff0c;它通过数据通信系统将数据以某种信号方式从一处传送到另一处&#xff0c;为计算机网络的应用和发展提供了技术支持和可靠的通信环境&#xff0c;是现代通信技术的关键部分。 一、数据通信的基本概念…

K8s学习笔记之了解k8s的网络模型

文章目录 docker 网络模型容器与容器之间&#xff0c;容器与宿主机之间如何通信容器访问外部网络外部网络访问容器 k8s 网络模型CNIpod 网络配置流程 k8s 热门网络插件介绍Flannel 来源Calico 来源Cilium 来源 k8s 网络插件的工作模式Flannel 的工作模式Calico 的工作模式BGP 和…

Python 三种方式实现自动化任务

在这篇文章中&#xff0c;我们将介绍一些用Python实现机器人过程自动化的包。机器人流程自动化&#xff08;Robotic process automation&#xff0c;简称RPA&#xff09;是指将鼠标点击和键盘按压自动化的过程&#xff0c;即模拟人类用户的操作。RPA用于各种应用程序&#xff0…