【读书笔记-《网络是怎样连接的》- 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地址从私有地址改写为公有地址。这里的公有地址即地址转换设备(路由器)的互联网接入地址。同时端口号也要进行改写,地址转换设备会随机选择一个空闲的端口进行改写。接下来改写前的私有地址和端口号与改写后的公有地址和端口号会作为一组对应的记录,保存在地址转换设备内部的一张表中,如下表所示

这个包经过改写之后发送出去,会收到来自服务器的响应。响应包中的接收方地址和端口号即是发送前改写的公有地址和端口号。根据公有低值和端口号,在表中查询,即可以找到对应的私有地址和端口号,包就可以到达原始的发送方了。
由于可用端口号有几万个,通过将私有地址转换为公有地址与端口号的组合,相当于一个公有地址可以对应几万个私有地址,很大程度上提高了公有地址的利用率。
相关文章:
【读书笔记-《网络是怎样连接的》- 7】Chapter3_2 路由器
本篇继续介绍路由器及其转发过程。 1 路由器内部结构 路由器内部结构图如图所示。 即主要包含左侧的包转发模块和右侧的端口模块。转发模块负责查找包的发送目的地,端口模块完成包的发送。通过安装不同的硬件,转发模块不仅可以支持以太网,也…...
Android Activity 基础接口知识和常见问题
Activity 知识点及问题点 接口onMultiWindowModeChangedonConfigurationChanged 常见问题Android解决点击桌面图标,就重新启动应用程序问题 接口 onMultiWindowModeChanged 定义 onMultiWindowModeChanged是Android中Activity类的一个回调方法。它会在活动…...
利用python 检测当前目录下的所有PDF 并转化为png 格式
以下是一个完整的 Python 脚本,用于检测当前目录下的所有 PDF 文件并将每一页转换为 PNG 格式: import os from pdf2image import convert_from_path# 设置输出图像的 DPI(分辨率) DPI 300# 获取当前目录 current_directory os…...
解决 Spring Boot 中 `Ambiguous mapping. Cannot map ‘xxxController‘ method` 错误
前言 在使用 Spring Boot 开发 Web 应用时,经常会遇到各种各样的错误。其中一种常见的错误是 Ambiguous mapping. Cannot map ‘testController‘ method。本文将详细介绍这个错误的原因及解决方法,帮助开发者快速定位并解决问题。 错误解释 这个错误…...
C++ 函数返回值优化
本文中部分内容来自下面的文章,还有一部分来自智谱清言 C 返回值优化_c 局部变量返回优化-CSDN博客 elision:省略 copy elision:拷贝省略 RVO (Return Value Optimization):返回值优化 ------ 我最近也遇到了上面博文中说到的问题&…...
c++源码阅读__ThreadPool__正文阅读
一. 简介 本章我们开始阅读c git 高星开源项目ThreadPool, 这是一个纯c的线程池项目, 并且代码量极小, 非常适合新手阅读 git地址: progschj / ThreadPool 二. 前提知识 为了面对不同读者对c掌握情况不同的情况, 这里我会将基本上稍微值得一说的前提知识点, 全部专门写成一篇…...
关于ES的查询
查询结果那么多字段都是什么? 为什么会提到这个问题呢,因为默认ES查询的结果会有很多信息,我们可能并不希望要那么多数据,所以你需要了解这些字段都表示什么,并正确的返回和使用它们。 took– Elasticsearch 运行查询…...
数据结构初识
目录 1.初识 2.时间复杂度 常见时间复杂度举例: 3.空间复杂度 4.包装类&简单认识泛型 4.1装箱和拆箱 5.泛型 6.泛型的上界 7.泛型方法 8.List接口 1.初识 1.多画图 2.多思考 3.多写代码 4.多做题 牛客网-题库/在线编程/剑指offer 算法篇:…...
保存数据到Oracle时报错ORA-17004: 列类型无效: 1111
1、问题描述: 关键信息:Mybatis;Oracle (1)保存信息到Oracle时报错: Caused by: org.apache.ibatis.type.TypeException: Error setting null for parameter #10 with JdbcType OTHER . Try setting a dif…...
Excel——宏教程(1)
Microsoft excel是一款功能非常强大的电子表格软件。它可以轻松地完成数据的各类数学运算,并用各种二维或三维图形形象地表示出来,从而大大简化了数据的处理工作。但若仅利用excel的常用功能来处理较复杂的数据,可能仍需进行大量的人工操作。…...
论文浅尝 | MindMap:知识图谱提示激发大型语言模型中的思维图(ACL2024)
笔记整理:和东顺,天津大学硕士,研究方向为软件缺陷分析 论文链接:https://aclanthology.org/2024.acl-long.558/ 发表会议:ACL 2024 1. 动机 虽然大语言模型(LLMs)已经在自然语言理解和生成任务…...
第6章:TDengine 标签索引和删除数据
TDengine 标签索引和删除数据 目标 掌握标签索引的创建、删除掌握超表、子表创建以及数据删除删除数据 删除数据是 TDengine 提供的根据指定时间段删除指定表或超级表中数据记录的功能,方便用户清理由于设备故障等原因产生的异常数据。 注意:删除数据并不会立即释放该表所…...
【微软:多模态基础模型】(5)多模态大模型:通过LLM训练
欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html)原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微…...
海外带云仓多语言商城源码,多语言多商家云仓一键代发商城
新增海外仓,云仓国际供应链系统,商家可登陆云仓进行批量发货 商城修复了一些bug以及增加了订单数字提示,优化加载速度,二开了一些细微功能 基于 PHP Laravel 框架开发的一款 Web 商城系统。 1.前端多国语言自由切换,…...
android:taskAffinity 对Activity退出时跳转的影响
android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中,任务栈(Task)是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…...
Apache Dolphinscheduler数据质量源码分析
Apache DolphinScheduler 是一个分布式、易扩展的可视化数据工作流任务调度系统,广泛应用于数据调度和处理领域。 在大规模数据工程项目中,数据质量的管理至关重要,而 DolphinScheduler 也提供了数据质量检查的计算能力。本文将对 Apache Do…...
solana链上智能合约开发案例一则
环境搭建 安装Solana CLI:Solana CLI是开发Solana应用的基础工具。你可以通过官方文档提供的安装步骤,在本地环境中安装适合你操作系统的Solana CLI版本。安装完成后,使用命令行工具进行配置,例如设置网络环境(如开发网…...
使用 PyTorch 实现 ZFNet 进行 MNIST 图像分类
在本篇博客中,我们将通过两个主要部分来演示如何使用 PyTorch 实现 ZFNet,并在 MNIST 数据集上进行训练和测试。ZFNet(ZFNet)是基于卷积神经网络(CNN)的图像分类模型,广泛用于图像识别任务。 环…...
车轮上的科技:Spring Boot汽车新闻集散地
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理汽车资讯网站的相关信息成为必然。开发合适…...
IDEA2023 SpringBoot整合Web开发(二)
一、SpringBoot介绍 由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。SpringBoot提供了一种新的编程范式,可以更加快速便捷…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
