【读书笔记-《网络是怎样连接的》- 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提供了一种新的编程范式,可以更加快速便捷…...
国产三维CAD 2025新动向:推进MBD模式,联通企业设计-制造数据
本文为CAD芯智库原创整理,未经允许请勿复制、转载! 上一篇文章阿芯分享了影响企业数字化转型的「MBD」是什么、对企业优化产品设计流程有何价值——这也是国产三维CAD软件中望3D 2024发布会上,胡其登先生(中望软件产品规划与GTM中…...
ubuntu 之 安装mysql8
安装 # 如果 ubuntu 版本 > 20.04 则不用执行 wget 这步 wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.debsudo apt-get updatesudo apt-get install mysql-server mysql-client 安装过程中如果没有提示输入密码 sudo cat /etc/mysql/debian.cnf # 查…...
Flink Lookup Join(维表 Join)
Lookup Join 定义(支持 Batch\Streaming) Lookup Join 其实就是维表 Join,比如拿离线数仓来说,常常会有用户画像,设备画像等数据,而对应到实时数仓场景中,这种实时获取外部缓存的 Join 就叫做维…...
Elasticsearch retrievers 通常与 Elasticsearch 8.16.0 一起正式发布!
作者:来自 Elastic Panagiotis Bailis Elasticsearch 检索器经过了重大改进,现在可供所有人使用。了解其架构和用例。 在这篇博文中,我们将再次深入探讨检索器(retrievers)。我们已经在之前的博文中讨论过它们…...
【并发模式】Go 常见并发模式实现Runner、Pool、Work
通过并发编程在 Go 程序中实现的3种常见的并发模式。 参考:https://cloud.tencent.com/developer/article/1720733 1、Runner 定时任务 Runner 模式有代表性,能把(任务队列,超时,系统中断信号)等结合起来…...
【前端知识】Javascript前端框架Vue入门
前端框架VUE入门 概述基础语法介绍组件特性组件注册Props 属性声明事件组件 v-model(双向绑定)插槽Slots内容与出口 组件生命周期样式文件使用1. 直接在<style>标签中写CSS2. 引入外部CSS文件3. 使用CSS预处理器4. 在main.js中全局引入CSS文件5. 使用CSS Modules6. 使用P…...
Springboot3.3.5 启动流程之 Bean创建流程
在文章Springboot3.3.5 启动流程(源码分析)中我们只是粗略的介绍了bean 的装配(Bean的定义)流程和实例化流程分别开始于 finishBeanFactoryInitialization 和 preInstantiateSingletons. 其实,在Spring boot中,Bean 的装配是多阶段的…...
golang反射函数注册
package main import ( “fmt” “reflect” ) type Job interface { New([]interface{}) interface{} Run() (interface{}, error) } type DetEd struct { Name string Age int } // 为什么这样设计 // 这样就避免了 在创建新的实例的之后 结构体的方法中接受者为指针类型…...
【Spring】Bean
Spring 将管理对象称为 Bean。 Spring 可以看作是一个大型工厂,用于生产和管理 Spring 容器中的 Bean。如果要使用 Spring 生产和管理 Bean,那么就需要将 Bean 配置在 Spring 的配置文件中。Spring 框架支持 XML 和 Properties 两种格式的配置文件&#…...
深入解析TK技术下视频音频不同步的成因与解决方案
随着互联网和数字视频技术的飞速发展,音视频同步问题逐渐成为网络视频播放、直播、编辑等过程中不可忽视的技术难题。尤其是在采用TK(Transmission Keying)技术进行视频传输时,由于其特殊的时序同步要求,音视频不同步现…...
网站建设属于什么支出/济南网站建设老威
方法一: /proc proc 伪文件系统,它驻留在 /proc 目录,这是最简单的方法来查看任何活动进程的线程数。 /proc 目录以可读文本文件形式输出,提供现有进程和系统硬件相关的信息如 CPU、中断、内存、磁盘等等。 $ cat /proc/<pid>/status上…...
虚拟服务器怎样做网站/自媒体推广
这篇文章主要介绍了win2008 R2设置IP安全策略后在服务器内打开网站很慢或无法访问外部网站的原因,需要的朋友可以参考下win2008R2设置IP安全策略后在服务器内打开网站很慢速度只有几KB的原因是因为IP安全策略中的关闭策略中设置了原地址“任何IP”到目标地址“任何IP”的UDP任何…...
东莞一站式网站推广运营/网站外贸推广
为什么80%的码农都做不了架构师?>>> 亲身经历总结如下,程序员想承接上百万的大型软件项目,必须要具备以下几点必要的条件: 01:过关的软件开发技术技能,必须需要在行业内有一定的知名度…...
CSS3网站建设/0元入驻的电商平台
2019独角兽企业重金招聘Python工程师标准>>> 闲话不多说,直接上代码! 1、第一步,首先搭建如下架构,其中,annotation中放置自己编写的注解,主要包括service controller qualifier RequestMapping…...
网站建设计划表/软文广告500字
深度学习目标检测指标mAP https://github.com/rafaelpadilla/Object-Detection-Metrics 参考上面github链接中的readme,有详细描述转载于:https://www.cnblogs.com/fydeblog/p/9261641.html...
江门网站建设套餐/高端网站建设哪个好
链表中倒数第k个节点题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依…...