本文总结的是网络包经过路由器的传输过程(其中也涉及到了路由器的知识和路由器与交换机的区别)。以下是个人学习总结,记录的是较为重要的部分,看完之后即可清楚路由器的相关知识。
网络包经由集线器和交换机后会到达路由器,并且根据情况会继续转发到网关(下一跳)。
计算机的网卡除了以太网和无线局域网之外很少见到支持其他通信技术的品种,而路由器的端口模块则支持除局域网之外的多种通信技术,如 ADSL、FTTH,以及各种宽带专线等。
路由器转发的工作原理和交换机类似,也是通过查表判断包转发的目标。不过在具体的操作过程上,路由器和交换机是有区别的。因为路由器是基于 IP 设计的,而交换机是基于以太网设计的。
认识路由器
路由器是一台设备,它有五个网口或者网卡,相当于有五只手,分别连着五个局域网。每只手的 IP 地址都和局域网的 IP 地址相同的网段,每只手都是它握住的那个局域网的网关。任何一个想发往其他局域网的包,都会到达其中一只手,被拿进来,拿下 MAC 头和 IP 头,看看,根据自己的路由算法,选择另一只手,加上 IP 头和 MAC 头,然后扔出去。
路由器的基本原理
路由器包括转发模块、端口模块两部分,其中转发模块负责判断包的转发目的地,端口模块负责包的收发操作。换句话说,路由器转发模块和端口模块的关系,就相当于协议栈的 IP 模块和网卡之间的关系。路由器在转发包时,首先会通过端口将发过来的包接收进来,这一步的工作过程取决于端口对应的通信技术。对于以太网端口来说,就是按照以太网规范进行工作,而无线局域网端口则按照无线局域网的规范工作,总之,就是委托端口的硬件将包接收进来。接下来,转发模块会根据接收到的包的 IP 头部中记录的接收方 IP 地址,在路由表中进行查询,以此判断转发目标(路由器是基于IP工作的,而交换机是通过 MAC 头部中的接收方 MAC 地址来判断转发目标的)。然后,转发模块将包转移到转发目标对应的端口,端口再按照硬件的规则将包发送出去,也就是转发模块委托端口模块将包发送出去的意思。
路由器的各个端口都具有 MAC 地址和 IP 地址。
路由表中的信息
路由器的路由表和计算机的路由表的结构相同。

路由器会将接收到的网络包的接收方 IP地址与路由表中的目标地址进行比较,并找到相应的记录。交换机在地址表中只匹配完全一致的记录,而路由器则会忽略主机号部分,只匹配网络号部分。例如,路由器在转发包的时候只看接收方地址属于哪个区,×× 区发往这一边,×× 区发往那一边。
在匹配地址的过程中,路由器需要知道网络号的比特数,因此路由表中还有一列子网掩码,通过子网掩码就可以判断出网络号的比特数。即:路由器会忽略主机号,只匹配网络号。
路由器的包接收操作
路由器的端口有各种不同的类型,以太网端口为例,以太网端口的结构和计算机的网卡基本相同,接收包并存放到缓冲区中的过程也和网卡几乎没有区别。
首先,信号到达网线接口部分,其中的 PHY(MAU)模块和 MAC 模块将信号转换为数字信息,然后通过包末尾的 FCS 进行错误校验,如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。如果包的接收方 MAC地址不是自己,说明这个包是发给其他设备的,如果接收这个包就违反了以太网的规则。
简言之:路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包, 遇到不匹配的包则直接丢弃。
路由器具体是如何根据IP来确定转发目标的?(*)
完成包接收操作之后,路由器就会丢弃包开头的 MAC 头部。MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,所以会被丢弃。
接下来,路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。转发操作开始:
查询路由表确定输出端口并判断转发目标。如果在路由表中无法找到匹配的记录,路由器会丢弃这个包,并通过ICMP消息(ICMP:Internet Control Message Protocol,Internet 控制报文协议。当包传输过程中发生错误时,用来发送控制消息)告知发送方。
如上面的图,假设地址为 10.10.1.101 的计算机要向地址为 192.168.1.10 的服务器发送一个包,这个包先到达图中的路由器。判断转发目标的第一步,就是根据包的接收方 IP 地址查询路由表中的目标地址栏找到相匹配的记录。这个匹配并不是匹配全部 32 个比特,而是根据子网掩码列中的值判断网络号的比特数来匹配相应数量的比特。看第 3行,子网掩码列为 255.255.255.0,就表示需要匹配从左起 24 个比特。网络包的接收方 IP 地址和路由表中的目标地址左起 24 个比特的内容都是192.168.1,因此两者是匹配的,该行记录就是候选转发目标之一。按照这样的规则可能会匹配到多条候选记录,图中第 3、4、5 行都可以匹配。其中,路由器首先寻找网络号比特数最长的一条记录(“最长匹配”原则)。网络号比特数越长,说明主机号比特数越短,也就意味着该子网内可分配的主机数量越少,即子网中可能存在的主机数量越少,这一规则的目的是尽量缩小范围,所以根据这条记录判断的转发目标就会更加准确。
第 3 行 192.168.1.0/255.255.255.0 表示一个子网,第 4 行 192.168.1.10/ 255.255.255.255 表示一台服务器。 相比服务器所属的子网来说,直接指定服务器本身的地址时范围更小,因此这里应该选择第 4 行作为转发目标 。
路由聚合概念:多个子网会被合并成一个子网,子网掩码会发生变化,同时,目标地址列也会改成聚合后的地址。这样也可以正确地进行转发。
找不到匹配路由时选择默认路由
子网掩码为 0.0.0.0这一行的作用就相当于把所有目标都配置好了。子网掩码 0.0.0.0 的意思是网络包接收方 IP 地址和路由表目标地址的匹配中需要匹配的比特数为 0,换句话说,就是根本不需要匹配。只要将子网掩码设置为 0.0.0.0,那么无论任何地址都能匹配到这一条记录,这样就不会发生不知道要转发到哪里的问题了。
注意:由于匹配的比特数越长优先级越高(最长匹配原则),因此子网掩码为0.0.0.0 的记录优先级是最低的,只有当找不到其他匹配的记录时,才会选择这条记录。只要在这一条记录的网关列中填写接入互联网的路由器地址,当匹配不到其他路由时网络包就会被转发到互联网接入路由器。因此这条记录被称为默认路由,这一行配置的网关地址被称为默认网关。
在计算机的 TCP/IP 设置窗口中也有一个填写默认网关的框,意思是一样的。计算机上也有一张和路由器一样的路由表,其中默认网关的地址就是我们在设置窗口中填写的地址。
包的有效期
从路由表中查找到转发目标之后,网络包就会被转交给输出端口,并最终发送出去,但在此之前,路由器还有一些工作要完成。
第一个工作是更新 IP 头部中的 TTL(Time to Live,生存时间)字段。TTL 字段表示包的有效期,包每经过一个路由器的转发,这个值就会减 1,当这个值变成 0 时,就表示超过了有效期,这个包就会被丢弃。这个机制是为了防止包在一个地方陷入死循环。如果路由表中的转发目标都配置正确,应该不会出现这样的情况,但如果其中的信息有问题,或者由于设备故障等原因切换到备用路由时导致暂时性的路由混乱,就会出现这样的情况。发送方在发送包时会将 TTL 设为 64 或 128,也就是说包经过这么多路由器后就会失去“生命”。现在的互联网即便访问一台位于地球另一侧的服务器,最多也只需要经过几十个路由器,因此只要包被正确转发,就可以在过期之前到达目的地。
路由器的维护
对路由表进行维护的方法有几种,大体上可分为以下两类:
1,由人手动维护路由记录
2,根据路由协议机制,通过路由器之间的信息交换由路由器自行维护路由表的记录, 其中第二条中提到的路由协议有很多种,例如 RIP、OSPC、BGP 等都属于路由协议.
路由器的发送操作和计算机相同
这一步操作取决于输出端口的类型。如果是以太网端口,则按照以太网的规则将包转换为电信号发送出去;如果是 ADSL 则按照 ADSL 的规则来转换,以此类推。
以太网的包发送操作是根据以太网规则来进行的,即便设备种类不同, 规则也是相同的。也就是说,其基本过程和协议栈中的 IP 模块发送包的过程是相同的,即在包前面加上 MAC 头部,设置其中的一些字段,然后将完成的包转换成电信号并发送出去。
首先,为了判断 MAC 头部中的 MAC 地址应该填写什么值,我们需要根据路由表的网关列判断对方的地址。如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址;如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址。知道对方的 IP 地址之后,接下来需要通过 ARP(地址解析协议,根据 IP 地址查询 MAC 地址的协议)根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方MAC 地址。路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。
接下来是发送方 MAC 地址字段,这里填写ben输出端口的 MAC 地址。 还有一个以太类型字段,填写 0080(十六进制)。 网络包完成后,接下来会将其转换成电信号并通过端口发送出去。