《网络是怎样连接的》学习总结-第三章下

3. 从网线到网络设备---探索集线器、交换机和路由器

3.3 路由器的包转发操作

3.3.1 路由器的基本知识

路由器的内部结构如下图所示。最重要的是转发模块和端口模块。转发模块复制判断包的转发目的地,端口模块负责包的收发操作。路由器转发模块和端口模块的关系就相当于协议栈的IP模块和网卡模块之间的关系。因此大家可以将路由器的转发模块想象成IP模块,将端口模块想象成网卡。

图1

计算机的网卡支持以太网和无限局域网,很少见到支持其他通信技术的品种,而路由器的端口模块则支持除局域网之外的多种通信技术,如ADSL、FTTH以及各种宽带专线等,只要端口模块安装了支持这些技术的硬件就可以。

路由器在转发包时,会通过端口的硬件将包接收进来。然后转发模块会根据接收到的包的IP头部中记录的接收方IP地址在路由表中查询,以此判断转发目标。然后转发模块将包转移到转发目标对应的端口,端口再转发,不断重复。

路由器的各个端口都具有MAC地址和IP地址。路由器是先接收包,然后查询转发目标,再由相应端口作为发送方将包发送出去。这一点和交换机不同,交换机只是将进来的包转发出去而已,自己并不会成为发送方或接收方。

3.3.2 路由表中的信息

路由器中的路由表是根据IP头部中的IP地址来判断转发地址,交换机是通过MAC头部中的接收方MAC地址来判断转发目标的。

表中最左侧的IP地址实际上只包含表示子网的网络号部分的比特值,而表示主机号部分的比特值全部为0(第二行第四行不是,见下一段的解释)。交换机在地址表中只匹配完全一致的记录,而路由器则会忽略主机号部分,只匹配网络号部分。第二列的子网掩码是用于给路由器去匹配网络号的比特数的,这部分可以看第一章1.2节的内容。

图2

上一段说过目标地址列的IP地址表示的是子网,但是也有例外,有时地址本身的子网掩码和路由表中的子网掩码是不一致的,这是路由聚合的结果。路由聚合会将几个子网合并为一个子网,并在路由表中只产生一条记录。如下图所示,当路由器B需要发送包到A中的三个子网,这时路由器B中本应该有对应这三个子网的3条记录,但在这个例子中,无论发往任何一个子网都是通过路由器A来转发的,因此可以在路由表中将这三个子网合并成10.10.0.0/16,这样就可以正确地进行转发而去减少了路由表中的记录数量,这就是路由聚合。经过路由聚合,多个子网被合并成一个子网,子网掩码发生变化,同时目标地址也会改成聚合后的地址。

图3

路由表的子网掩码只是用来匹配目标地址时告诉路由器应该匹配多少个比特。可以将某台计算机的地址写入路由表中,这时子网掩码就为255.255.255.255,也就是说地址中的全部32比特全都为1.这样一来,主机号部分比特全部为0表示一个子网,主机号部分不全部为0表示某一台具体的计算机(第一章也讲过),图2中的表的第2和第4行就是这样的。

表中第3第4列分别是网关和接口。它们表示网络包的转发目标。根据目标地址和子网掩码匹配到某条记录后,路由器就将网络包交给接口列中指定的网络接口,并转发到网关列中指定的IP地址。

最后一列是跃点计数,它表示距离目标IP地址的距离是远是近,数值越小就越近,反之越大。

路由表的维护与包转发操作是独立的,在包转发过程中不对路由表进行维护。对路由表的维护方法大致分为两种:

a) 由人手动维护路由记录

b) 根据路由协议机制(如RIP、OSPC、BGP等),通过路由器之间的信息交换路由器自行维护路由表的记录。

3.3.3 路由器的包接收操作

路由器的端口有各种不同的类型,这里只讲以太网端口。首先,信号到达网线接口部分,其中的 PHY(MAU)模块和 MAC 模块将信号转换为数字信息,然后通过包末尾的 FCS 进行错误校验,如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。如果包的接收方 MAC 地址不是自己,说明这个包是发给其他设备的,如果接收这个包就违反了以太网的规则。

3.3.4 查询路由表确定输出端口

完成包接收操作之后就丢弃MAC头部,路由器就会根据IP头部中的字段转发包。转发会经过几个阶段,首先是查询路由表判断转发目标。

就是像上一节讲的那样用子网掩码匹配目标地址,符合谁就转发到谁。但是有可能会匹配到多条记录。比如如果转发目标地址为192.168.1.10,那么在上面的表中就会匹配第3、4、5行。这种情况下就选网络号匹配到最多的,网络号比特越长,说明主机号比特数越短,就意味着该子网内可分配的主机数量越少,即子网中可能存在的主机数量越少,尽量缩小范围。在这个例子中,那么多直接会使用第4行,因为第4行的子网掩码是255.255.255.255,就表示匹配到了一台服务器,按照最长匹配原则那么就是转发到这条记录。

如果路由表中存在网络号长度相同的多条记录,那么就需要根据跃点数的值来进行判断了,选择跃点数小的记录。

在路由表中找不到匹配的记录情况下,路由器就直接丢弃这个包,并通过ICMP消息告诉发送方(第二章讲过)。这里处理方式与交换机不同,交换机在MAC地址表中找不到数据时就去广播发到所有连接到交换机的设备,这是因为交换机连接的设备不大,最多也就几千台,不会造成网络堵塞。但是路由器是互联网的入口,它的规模远远大于以太网的,所以肯定不可能发到整个网络上。

3.3.5 找不到匹配路由时选择默认路由

其实上面图2中的那张表中的最后一行的就是默认的转发地址。它的子网掩码为0.0.0.0,意思是需要匹配的网络号为0,也就是不需要匹配,那么无论任何地址都会匹配到这一行(但是它优先级是最低,用来兜底的操作)。只要在这一行记录的网关列中填写接入互联网的路由器地址,当匹配不到其他路由时,网络包就会被转发到互联网接入路由器。在计算机的TCP/IP设置窗口也有一个填写默认网关的框。(如果有朋友遇到连到wifi但是访问不了互联网的时候可以试一下这个方法,改一下wifi的DNS地址)。

这样一来,无论目标地址是表示一个子网还是某台设备,都可以用相同的方法查找出转发目标,避免了不知道转发到哪里的问题。

3.3.6 包的有效期

路由器在将包转交给输出端口之前还需要去更新IP头部中的TTL字段。TTL字段表示包的有效期,每经过一个路由器的转发这个值就会减1,当值变为0时,就表示超过了有效期,这个包就会被丢弃。

这个机制是为了防止包在一个地方陷入死循环。发送方在发送包时会将TTL设为64或128,现在的互联网即使访问地球另一边的服务器最多只需要经过几十个路由器,因此只要包被正确转发,就可以在过期之前到达目的地。

3.3.7 通过分片功能拆分大网络包

路由器的端口并不是只有以太网一种,也可能支持其他局域网或专线通信技术。不同的线路和局域网各自能传输的最大包长度不同,因此输出端口的最大长度可能会小于输入端口的。一旦转发的包长度超过了输出端口能传输的最大长度,就无法直接发送这个包了。

这个时候IP协议中的分片功能就有作用了,它会拆分包,缩短每个包的长度。分片操作过程如下图。首先,我们需要知道输出端口的MTU(一个包能传输的最大数据长度),看看这个包能不能不分片直接发送。最大包长度是由端口类型决定的,用这个最大长度减去头部的长度就是MTU,将MTU与要转发的包长度对比,如果MTU足够大就不拆分,如果小,就需要将包按照这个MTU进行分片。但在此之前还要看一下IP头部中的标志字段确认是否可以分片,当发送方应用程序设置了不允许分片或者包已经是经过分片后的包就不允许分片。

如果查询标志字段发现不能分片,那么就只能丢弃这个包,并通过ICMP消息通知发送方。否则

图4

3.3.8 路由器的发送操作和计算机相同

到这里路由器的准备工作就完成了,就进入包的发送操作了。这一步取决于输出端口的类型,有以太网、ADSL等类型,这里以以太网为例。以太网的包发送操作是根据以太网规则来进行的,其基本过程和协议栈的IP模块发送包的过程是相同的。
首先,为了判断 MAC 头部中的 MAC 地址应该填写什么值,我们需要 根据路由表的网关列判断对方的地址。如果网关是一个 IP 地址,则这个 IP 地址就是我们要转发到的目标地址;如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址。知道对方的IP 地址之后,接下来需要 通过 ARP根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。
然后是发送方MAC地址字段, 填写输出端口的MAC地址(一般在生产过程中写入ROM中)还有一个 以太类型字段,填写0080。
然后 将包转换成电信号并通过端口转发出去。如果输出端口为以太网,则发送出去的网络包会通过交换机到达下一个路由器。由于接收放MAC地址就是下一个路由器的地址,所以交换机会传输到下一个路由器,然后经过层层转发到达目的地。

3.3.9 路由器与交换机的关系

IP协议本身没有传输包的功能,因此包的实际传输要委托以太网来进行。路由器是基于IP设计的,而交换机是基于以太网设计的,因此IP与以太网的关系也就是路由器与交换机的关系。换句话说,路由器将包的传输工作委托给交换机来进行。但是现在的路由器都有内置交换机的功能,所以如果拆开来看,单纯的不具备交换功能的路由器就需要配合交换机来使用。作者这样拆开来讲也更好理解。这样我们就知道了现在的路由器是具备转发+传输的功能的。

简单来说,IP(路由器)负责将包发送给通信对象这一整体过程,而其中将包传输到下一个路由器的过程则是由以太网(交换机)来负责的。

当然网络并非只有以太网一种,还有无线局域网,以及接入互联网的通信线路,它们和IP之间的关系又是怎样的呢?其实只要将以太网替换成无线局域网、互联网线路等通信规格就可以。也就是如果是无线局域网,就委托无线局域网将包传输过去;是互联网线路就委托它将包传输过去。IP本身不负责包的传输,而是委托各种通信技术将包传输到下一个路由器,这样的设计是有重要意义的,即可以根据需要灵活运用各种通信技术,这也是IP的最大特点。

3.4 路由器的附加功能

3.4.1 通过地址转换有效利用IP地址

路由器有两个最重要的附加功能,地址转换和包过滤。

或许大家都听说过IPv6,其实IPv6的出现就是为了解决IPv4不足的问题。在网络最开始时IPv4地址还很多时都是每一台服务器都去向地址管理机构申请IP地址,也就是那个时候其实是没有内网和外网的区别的,所有客户端都是直接连接到互联网。

后来随着互联网规模的指数级增长,IPV4不够用了,但是IPv6的推动又不是一蹴而就的,所以在这个过渡时期就是利用了IP地址转换(NAT)。就是假如A公司和B公司都有各自的内网,A和B内网之间不会有网络包流动,所以即使具有相同的IP地址也没事。这样公司内部的设备就不需要去申请公网IP了,就大幅节约了IP地址,只需要公司去申请一个NAT网关用来进行地址转换,当内网访问外网或者外网访问内网时都先经过NAT网关将IP转换之后再去访问,内网访问外网就将内网的私有IP地址转换为公网的IP地址去访问,外网访问内网就将公网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

当公司内网和互联网连接时就采用如下图的结构,其实也就是现在说的NAT地址转换。

图5

3.4.2 地址转换的基本原理

地址转换的基本原理是在转发网络包时对IP头部中的IP地址和端口号进行改写。

TCP连接操作的第一个包被转发到互联网时,会将发送方IP地址从私有地址改写成公有地址,这里使用的公有地址是地址转换设备的互联网接入端口的地址。然后端口也需要改写,地址转换设备会随机选择一个空闲的端口。然后改写前的私有地址和端口号以及改写后的公有地址和端口号会作为一组对应的记录保存在地址转换设备(不仅路由器可以作为地址转换设备,有些防火墙也可以地址转换)内部的一张表中。

包发网互联网后到达目标,然后目标服务器返回一个包,返回的这个包的接收包就是原始包的发送方,也就是被改写后的公有地址和端口号,对互联网来说其实通信对象就是地址转换设备的地址。然后地址转换设备又在表中查找记录,将公有地址和端口改写为私有地址和端口然后发到内网,这样包就到达原始的发送方了。

家庭网络中的工作过程也是完全相同的,只是规模不同而已。

图6

3.4.3 改写端口号的原因

以前的地址转换是只转换地址不转换端口号的。不过这种方式是需要公有地址和私有地址一一对应的,只不过当一台内网的客户端断开连接后,删除了表中的记录后,这个公有地址又可以去和其他内网的客户端连接,所以一个公有地址是可以被多个私有地址使用的。但是随着公司规模的扩大,一个几千人的公司同时有几百个客户端在进入互联网是正常的,所以这种方法也会需要使用到很多公有地址。

改写客户端就是为了解决这个问题。客户端一方的端口号本来就是从空闲端口号中随机选择的,因此改写了也不会有问题。端口号是一个16比特的数值,可以分配出几万个端口,因此如果使用公有地址加上端口的组合对应一个私有地址,一个公有地址就可以对应几万个私有地址,这种方法提高了公有地址的利用率。

3.4.4 从互联网访问公司内网

从互联网访问内网的网络包,如果在地址转换设备的表里没有找到记录就无法正常转发,因为如果对应表中没有记录,就无法判断公有地址与私有地址之间的关系。这意味着没有在访问互联网的内网设备,是无法主动从互联网向其发送网络包的。

如果想要能互联网通内网,就需要一些设置。比如事先手动添加在地址转换设备添加一条记录就可以,将服务器的私有地址手动添加到地址转换设备中,这样就可以从互联网访问到这台具有私有地址的服务器了。

3.4.5 路由器的包过滤功能

包过滤就是在对包进行转发时根据MAC头部、IP头部、TCP头部的内容按照事先设置好的规则决定是转发这个包还是丢弃这个包。通常说的防火墙设备或软件,大多数都是利用这一机制来防止非法入侵的。

包过滤的原理非常简单,但是想要设置一套恰当的规则来区分非法访问和正常访问,只阻止非法入侵而不影响正常访问是非常不容易的。这里会在第五章的内容介绍。

小记

到这里第三章的内容就完结了,第四章的内容是关于网络包如何在互联网中传输的,就与运营商的知识有关了,但是个人认为这部分不用了解那么多也可以。所以先打算接下来更新第五章和第六章的内容,等以后再看看需不需要更新第四章的内容。

相关推荐
PersistJiao3 分钟前
Spark 分布式计算中网络传输和序列化的关系(二)
大数据·网络·spark·序列化·分布式计算
码上有前11 分钟前
解析后端框架学习:从单体应用到微服务架构的进阶之路
学习·微服务·架构
初遇你时动了情29 分钟前
uniapp 城市选择插件
开发语言·javascript·uni-app
岳不谢37 分钟前
VPN技术-VPN简介学习笔记
网络·笔记·学习·华为
Lws39 分钟前
CS144 lab0(个人理解)
网络协议
follycat1 小时前
信息收集--CDN绕过
网络·安全·网络安全
海害嗨1 小时前
阿里巴巴官方「SpringCloudAlibaba全彩学习手册」限时开源!
学习·开源
zongzi_4941 小时前
二次封装的天气时间日历选择组件
开发语言·javascript·ecmascript
麻辣_水煮鱼2 小时前
vue数据变化但页面不变
前端·javascript·vue.js
一条晒干的咸魚2 小时前
【Web前端】实现基于 Promise 的 API:alarm API
开发语言·前端·javascript·api·promise