• 电脑是怎样上网的 (二) 从网线到网络设备


    一、信号在网线和集线器中传输

    每个包都是独立传输的

    在传输中包与包之间没有关联。

    防止网线中的信号衰减很重要

    网线越长,频率越高,损失越大。

    损失会使波形变形,无法分辨0、1,造成错误。

    防止网线中的信号衰减很重要

    网线越长,频率越高,损失越大。

    损失会使波形变形,无法分辨0、1,造成错误。

    “双绞”是为了抑制噪声

    集线器将信号发往所有线路

    • 以太网的基本架构就是将包转发到所有设备,而集线器就是这一架构的忠实体现
    • 集线器基本上将信号原封不动的转发,即使信号失真;当然一些产品具有信号整形,错误抑制等功能

    二、交换机的包转发操作

    交换机根据地址表转发

    • 交换机的每一个端口就相当于计算机上的一块网卡,但工作方式并不相同;交换机端口本身不具有MAC地址,也不核对MAC地址,而是直接将包存入缓冲区
    • 交换机根据MAC地址表查找MAC地址,然后将信号发送到相应端口

    MAC地址表的维护

    两种维护方式:

    1. 收到包时,将发送方的端口号与MAC地址加入地址表
    2. 将一段时间不使用的过时记录删除;这是为了防止设备移动而改变端口
    3. 若发生错误,重启交换机即可

    特殊操作

    1. 交换机发现包要返回源端口,就会丢弃这个包
    2. 当地址表中找不到指定地址时,就会把包发送到除源端口的所有端口,接收者会响应,然后再把地址写入地址表

    全双工模式可以同时进行发送和接收。

    自动协商:确定最优的传输速率

    • long long ago,脉冲信号只用来确定网络是否正常
    • 后来,聪明的人们设计出了特殊排列的脉冲信号,设备就可以发出这种信号将自己的支持的传输速率和工作模式告知其它设备,然后选一个都支持的最优组合
    • 现在的设备基本都支持自动协商了

    交换机可以同时执行多个转发操作

    • 交换机只把包转发到特定MAC地址的端口,其他端口仍然可以执行转发操作
    • 集线器把包转发到所有端口,多了就会发生信号碰撞
      从设备的整体转发能力看,交换机优于集线器

    三、路由器的包转发操作

    路由器的基本知识

    ① 路由器通过查表判断转发目标

    网络包经过集线器和交换机之后到达了路由器,并在此被转发到下一个路由器。

    这一步转发的工作原理和交换机类似,不过在具体的操作过程上,路由器和交换机是有区别的,因为路由器是基于 IP 设计的,而交换机是基于以太网设计的。

    ② 路由器概概况

    路由器的内部结构如下图所示。只要看明白路由器包括转发模块和端口模块两部分就可以了。

    其中转发模块负责判断包的转发目的地,端口模块负责包的收发操作。

    二者关系,就相当于协议栈的 IP 模块和网卡之间的关系,将路由器的转发模块想象成 IP 模块,将端口模块想象成网卡。

    路由器的每个端口都具有IP地址和MAC地址。

    通过更换网卡,计算机不仅可以支持以太网,也可以支持无线局域网。如果路由器的端口模块安装了支持无线局域网的硬件,就可以支持无线局域网了。

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

    路由器工作原理

    ① 根据端口对应通信技术将包接收

    路由器转发包时通过端口将发过来的包接收进来,具体取决于端口对应的通信技术。

    对于以太网端口来说,就是按照以太网规范进行工作,而无线局域网端口则按照无线局域网的规范工作,总之就是委托端口的硬件将包接收进来。

    ② 根据包中IP头部中IP地址进行查询后转发包到对应端口

    接下来,转发模块会根据接收到的包的 IP 头部中记录的接收方 IP 地址,在路由表中进行查询,以此判断转发目标。

    然后,转发模块将包转移到转发目标对应的端口,端口再按照硬件的规则将包发送出去,也就是转发模块委托端口模块将包发送出去的意思。

    ③ 端口具有MAC地址和IP地址

    端口模块是以实际的发送方或者接收方的身份来收发网络包的。

    以以太网端口为例,路由器的端口具有 MAC 地址,因此它就能够成为以太网的发送方和接收方。

    和网卡一样,MAC 地址也是在生产时写入端口的 ROM 中的。但端口并不会成为 IP 的发送方和接收方。

    端口还具有 IP 地址,从这个意义上来说,它和计算机的网卡是一样的。

    当转发包时,首先路由器端口会接收发给自己的以太网包,然后查询转发目标,再由相应的端口作为发送方将以太网包发送出去。

    这一点和交换机是不同的,交换机只是将进来的包转发出去而已,它自己并不会成为发送方或者接收方。

    端口是按照以太网规范接收包的,即当端口的 MAC 地址和包的接收方MAC 地址一致时,端口才接受这个包,否则就丢弃包。

    路由表中的信息

    ① 使用路由表判断转发目标

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

    由于使用的地址不同,记录转发目标的表的内容也会不同,路由器中的表叫作路由表。

    ② 路由表的结构

    目标地址中的IP地址是子网的地址。

    目标地址列记录的是接收方的信息。实际上这里的 IP 地址只包含表示子网的网络号部分的比特值,而表示主机号部分的比特值全部为0B。

    路由器会将接收到的网络包的接收方 IP地址与路由表中的目标地址进行比较,并找到相应的记录。

    交换机在地址表中只匹配完全一致的记录,而路由器则会忽略主机号部分,只匹配网络号部分。

    打个比方,路由器在转发包的时候只看接收方地址属于哪个区,×× 区发往这一边,×× 区发往那一边。

     

    ③ 路由聚合

    刚才我们说过,目标地址列中的 IP 地址表示的是子网,但也有一些例外,有时地址本身的子网掩码和路由表中的子网掩码是不一致的,这是路由聚合的结果。

    路由聚合会将几个子网合并成一个子网,并在路由表中只产生一条记录。

    如图 3.14 所示,我们现在有 3 个子网,分别为10.10.1.0/24、10.10.2.0/24、10.10.3.0/24,路由器 B 需要将包发往这 3 个子网。

    路由器 B 的路由表中原本应该有对应这 3 个子网的 3条记录,但在这个例子中,无论发往任何一个子网,都是通过路由器 A 来进行转发。

    因此我们可以在路由表中将这 3 个子网合并成 10.10.0.0/16,这样也可以正确地进行转发,但我们减少了路由表中的记录数量,这就是路由聚合。

    经过路由聚合,多个子网会被合并成一个子网,子网掩码会发生变化,同时,目标地址列也会改成聚合后的地址。

    ④ 路由表的子网掩码列只表示在匹配网络包目标地址时需要对比的比特数量

    还有另外一些情况,如将一个子网进行细分并注册在路由表中,然后拆分成多条记录。

    从结果上看,路由表的子网掩码列只是用来在匹配目标地址时告诉路由器应该匹配多少个比特。

    而且,目标地址中的地址和实际子网的网络号可能并不完全相同,但即便如此路由器依然可以正常工作。

    通过上述方法,我们也可以将某台具体计算机的地址写入路由表中,这时的子网掩码为 255.255.255.255,也就是说地址中的全部 32 个比特都为 1。

    这样一来,主机号部分比特全部为 0 可以表示一个子网,主机号部分比特不全部为 0 可以表示某一台计算机,两种情况可以用相同的规则来处理。

    ⑤ 网关、接口和跃点计数

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

    跃点计数表示距离目标 IP 地址的距离是远还是近。这个数字越小,表示距离目的地越近;数字越大,表示距离目的地越远。

    ⑥ 路由表的维护

    路由器中对路由表的维护是与包转发操作相互独立的,在转发包的过程中不需要对路由表的内容进行维护。

    对路由表进行维护的方法有几种,大体上可分为以下两类:

    ①由人手动维护路由记录

    ②根据路由协议机制,通过路由器之间的信息交换由路由器自行维护路由表的记录

    其中提到的路由协议有很多种,例如 RIP、OSPC、BGP 等都属于路由协议。

    路由器接收网络包后的操作

    ① 路由器接收包后存入缓存区

    路由器的端口有各种不同的类型,这里我们只介绍以太网端口是如何接收包的。

    以太网端口的结构和计算机的网卡基本相同,接收包并存放到缓冲区中的过程也和网卡几乎没有区别。

    ② PHY模块和MAC模块处理信号为数字信息

    首先,信号到达网线接口部分,其中的 PHY(MAU)模块和 MAC 模块将信号转换为数字信息,然后通过包末尾的 FCS 进行错误校验。

    如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。

    如果包的接收方 MAC地址不是自己,说明这个包是发给其他设备的,如果接收这个包就违反了以太网的规则。

    路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃

    完成接收包后的操作

    查询路由表确定输出端口

    ① 丢弃MAC头

    完成包接收操作之后,路由器就会丢弃包开头的 MAC 头部。

    MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。

    因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃。

    通过路由器转发的网络包,其接收方 MAC 地址为路由器端口的MAC 地址。

    ② 根据IP头部查询路由表

    根据最长原则匹配目标地址

    如下图所示,假设地址为 10.10.1.101 的计算机要向地址为 192.168.1.10 的服务器发送一个包,这个包先到达图中的路由器。

    然后根据包的接收方 IP 地址查询路由表中的目标地址栏,以找到相匹配的记录。

    这个匹配并不是匹配全部 32 个比特,而是根据子网掩码列中的值判断网络号的比特数,并匹配相应数量的比特。

    按照这样的规则,第3、4、5行都可以匹配。其中,路由器首先寻找网络号比特数最长的一条记录。

    网络号比特数越长,说明主机号比特数越短,子网中可能存在的主机数量越少,这一规则的目的是尽量缩小范围,所以根据这条记录判断的转发目标就会更加准确。

    这一规则称为“最长匹配”原则。

    相比服务器所属的子网来说,直接指定服务器本身的地址时范围更小,因此这里应该选择第 4 行作为转发目标。

    按照最长匹配原则筛选后,如果只剩一条候选记录,则按照这条记录的内容进行转发。

    ③ 根据跃点值筛选网络号相同的记录

    有时候路由表中会存在网络号长度相同的多条记录,例如考虑到路由器或网线的故障而设置的备用路由就属于这种情况。

    这时需要根据跃点计数的值来进行判断。跃点计数越小说明该路由越近,因此应选择跃点计数较小的记录。

    ④ 无法匹配记录的包直接丢弃

    如果在路由表中无法找到匹配的记录,路由器会丢弃这个包,并通过ICMP消息告知发送方。

    因为交换机根据以太网协议可以将包发送到所有的端口上,而路由器工作的网络环境就是互联网,连接设备远大于交换机。

    如果产生大量的网络包会造成网络拥塞,所以路由器遇到不知道该转发到哪里的包,就会直接丢弃。

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

    不是所有的转发目标都需要配置在路由表中

    如果是公司或者家庭网络,这样的做法也没什么问题,但互联网中的转发目标可能超过 20 万个,如果全部要配置在路由表中实在是不太现实。

    其中有一行子网掩码为 0.0.0.0,意思是网络包接收方 IP 地址和路由表目标地址的匹配中需要匹配的比特数为 0,换句话说,就是根本不需要匹配。

    只要将子网掩码设置为 0.0.0.0,那么无论任何地址都能匹配到这一条记录,这样就不会发生不知道要转发到哪里的问题了。

    只要在这一条记录的网关列中填写接入互联网的路由器地址,当匹配不到其他路由时,网络包就会被转发到互联网接入路由器。

    默认路由和默认网关

    因此这条记录被称为默认路由,这一行配置的网关地址被称为默认网关。

    在计算机的TCP/IP 设置窗口中也有一个填写默认网关的框,意思是一样的。

    计算机上也有一张和路由器一样的路由表,其中默认网关的地址就是我们在设置窗口中填写的地址。

    路由表中子网掩码为 0.0.0.0 的记录表示“默认路由”。

    由于匹配的比特数越长优先级越高(最长匹配原则),因此子网掩码为0.0.0.0 的记录优先级是最低的,只有当找不到其他匹配的记录时,才会选择这条记录。

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

    路由器端口支持多种通信技术

    路由器的端口并不只有以太网一种,也可以支持其他局域网或专线通信技术。

    不同的线路和局域网类型各自能传输的最大包长度也不同,因此输出端口的最大包长度可能会小于输入端口。

    即便两个端口的最大包长度相同,也可能会因为添加了一些头部数据而导致包的实际长度发生变化。

    无论哪种情况,一旦转发的包长度超过了输出端口能传输的最大长度,就无法直接发送这个包了。

    IP协议对超过端口输出数据最大长度的包进行分切

    遇到这种情况,可以使用 IP 协议中定义的分片功能对包进行拆分,缩短每个包的长度。

    需要注意的是,这里说的分片和第 2 章介绍的 TCP 对数据进行拆分的机制是不同的。

    IP分切包和TCP拆分数据的不同

    TCP 拆分数据的操作是在将数据装到包里之前进行的,换句话说,拆分好的一个数据块正好装进一个包里。

    从 IP 分片的角度来看,这样一个包其实是一个未拆分的整体,也就是说,分片是对一个完整的包再进行拆分的过程。

    分片操作的过程如图 3.15 所示。首先,我们需要知道输出端口的MTU,看看这个包能不能不分片直接发送。

    最大包长度是由端口类型决定的,用这个最大长度减掉头部的长度就是 MTU,将 MTU 与要转发的包长度进行比较。

    如果输出端口的 MTU 足够大,那么就可以不分片直接发送;如果输出端口的 MTU 太小,那么就需要将包按照这个 MTU 进行分片。

    先查询IP头中标志字段能否分片

    在此之前需要看一下 IP 头部中的标志字段,确认是否可以分片。

    如果不能分片那么就丢弃这个包,并通过ICMP 消息通知发送方。否则,就可以按照输出端口 MTU 对数据进行依次拆分。

    下面两种情况不能分片

    ①发送方应用程序等设置了不允许分片

    ②这个包已经是经过分片后的包

    TCP头部和数据一起被拆分

    在分片中,TCP 头部及其后面的部分都是可分片的数据,尽管TCP 头部不属于用户数据,但从 IP 来看也是 TCP 请求传输的数据的一部分。

    数据被拆分后,每一份数据前面会加上 IP 头部,其大部分内容都和原本的 IP 头部一模一样,但其中有部分字段需要更新,这些字段用于记录分片相关的信息。

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

    ① 包的有效期

    更新生存时间TTL字段防止包进入死循环。

    在网络包被转交给输出端口之前,路由器还需要更新 IP 头部中的 TTL 字段。

    TTL 字段表示包的有效期,包每经过一个路由器的转发,这个值就会减 1,当这个值变成 0 时,就表示超过了有效期,这个包就会被丢弃。

    这个机制是为了防止包在一个地方陷入死循环,如果其中的信息有问题,或者由于设备故障等原因切换到备用路由时导致暂时性的路由混乱,就会出现这样的情况。

    发送方在发送包时会将 TTL 设为 64 或 128,也就是说包经过这么多路由器后就会“寿终正寝”。

    现在的互联网即便访问一台位于地球另一侧的服务器,最多也只需要经过几十个路由器,因此只要包被正确转发,就可以在过期之前到达目的地。

    ② 包的发送操作

    根据不同输出端口转换信号。

    这一步操作取决于输出端口的类型。如果是以太网端口,则按照以太网的规则将包转换为电信号发送出去;如果是 ADSL 则按照 ADSL 的规则来转换,以此类推。

    在家庭网络中,路由器后面一般连接 ADSL 等线路接入互联网,因此路由器会根据接入网的规则来发送包。

    不过,要理解具体的操作过程,需要先理解相应的通信线路,比较复杂,因此我们留到下一章探索互联网内部时再讲解。

    以太网发送包的过程

    假设路由器位于公司等局域网的内部,即输出端口也是以太网,看看这种情况是如何操作的。

    以太网的包发送操作是根据以太网规则来进行的,即便设备种类不同,规则也是相同的。

    也就是说,其基本过程和协议栈中的 IP 模块发送包的过程是相同的,即在包前面加上 MAC 头部,设置其中的一些字段,然后将完成的包转换成电信号并发送出去。

    ① 查询路由表

    首先,为了判断 MAC 头部中的 MAC 地址应该填写什么值,我们需要根据路由表的网关列判断对方的地址。

    如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址;如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址。

    路由器判断下一个转发目标的方法

    ①如果路由表的网关列内容为 IP 地址,则该地址就是下一个转发目标。

    ②如果路由表的网关列内容为空,则 IP 头部中的接收方 IP 地址就是下一个转发目标。

    ② 根据IP使用ARP查询MAC

    知道对方的 IP 地址之后,接下来需要通过 ARP 根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方MAC 地址。

    路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。

     路由器也会使用 ARP 来查询下一个转发目标的 MAC 地址。

    接下来是发送方 MAC 地址字段,这里填写输出端口的 MAC 地址。还有一个以太类型字段,填写 0080(十六进制)。

    ③ 将数字信息转成电信号发送

    网络包完成后,接下来会将其转换成电信号并通过端口发送出去。这一步的工作过程和计算机也是相同的。

    如果以太网工作在半双工模式,需要先确认线路中没有其他信号后才能发送,如果检测到碰撞,则需要等待一段时间后重发。

    如果以太网工作在全双工模式,不需要确认线路中的信号,可以直接发送。

    ④ 网络包到达下一个路由器

    如果输出端口为以太网,则发送出去的网络包会通过交换机到达下一个路由器。

    由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。

    接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。

    四、路由器与交换机的关系

    ① 将IP包装进以太网包的数据部分委托以太网传输

    计算机在发送网络包时,或者是路由器在转发网络包时,都需要在前面加上 MAC 头部,准确的说法应该是将 IP 包装进以太网包的数据部分中。

    给包加上 MAC 头部并发送,从本质上说是将 IP 包装进以太网包的数据部分中,委托以太网去传输这些数据。

    IP 协议本身没有传输包的功能,因此包的实际传输要委托以太网来进行。

    路由器是基于 IP 设计的,而交换机是基于以太网设计的,因此 IP 与以太网的关系也就是路由器与交换机的关系。

    换句话说,路由器将包的传输工作委托给交换机来进行。

    除了使用交换机,还可以使用集线器,或者用交叉双绞线直接连接到路由器端口都可以。

    关键是,在委托传输时,只要能按照以太网规则传输包,不管是什么样的设备都可以。

    当然,这里讲的内容只适用于原原本本实现 IP 和以太网机制的纯粹的路由器和交换机,实际的路由器有内置交换机功能的。

    比如用于连接互联网的家用路由器就属于这一种,对于这种路由器,上面内容可能就不适用了。

    但是,如果把这种“不纯粹”的路由器拆分成“纯粹”的路由器和“纯粹”的交换机,则它们各自都适用上面的内容。

    ② IP委托以太网传输到下一个路由器

    从包的转发目标也可以看出路由器和交换机之间的委托关系。

    IP 并不是委托以太网将包传输到最终目的地,而是传输到下一个路由器。

    ③ ARP查询的就是下一个路由器的MAC地址

    在创建MAC 头部时,也是从 IP 的路由表中查找出下一个路由器的 IP 地址,并通过 ARP 查询出 MAC 地址,然后将 MAC 地址写入 MAC 头部中的。

    这表示 IP 对以太网的委托只是将包传输到下一个路由器就行了。

    当包到达下一个路由器后,下一个路由器又会重新委托以太网将包传输到再下一个路由器。

    随着这一过程反复执行,包就会最终到达 IP 的目的地,也就是通信的对象。

    到这里我们已经梳理了路由器与交换机之间的关系。

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

    ④ IP不负责包的传输只委托其他协议到下一个路由器

    如果和下一个路由器之间是通过无线局域网连接的,那么就委托无线局域网将包传输过去;

    如果是通过互联网线路连接的,那么就委托它将包传输过去。

    除了这里列举的例子之外,世界上还有很多其他类型的通信技术,它们之间的关系也是一样的,都是委托所使用的通信技术将包传输过去。

    IP 本身不负责包的传输,而是委托各种通信技术将包传输到下一个路由器。

    这样的设计是有重要意义的,即可以根据需要灵活运用各种通信技术,这也是 IP 的最大特点。

    正是有了这一特点,我们才能够构建出互联网这一规模巨大的网络。

  • 相关阅读:
    记一次 .NET某游戏后端API服务 CPU爆高分析
    Python综合案例(动态柱状图)
    【C++篇】AVL树
    暴力递归转动态规划(二)
    面向计算思维培养的PBL教学模式设计以模式识别课程为例
    error LNK2001: 无法解析的外部符号 “public: __thiscall std::
    第八章《Java高级语法》第2节:补码
    C++内存管理:其三、new和delete的行为拆分
    Redis key操作实战(全)
    Nginx的请求时间限制(如周一到周五可以访问)
  • 原文地址:https://blog.csdn.net/qq_35029061/article/details/125904301