Linux入门真经-048路由与数据转发过程

xiaoxiao2025-07-23  25

本节介绍的内容既有对前面内容的回顾和整合,也有一些新内容。网络知识庞大而琐碎,但是我介绍的都是最常用和基础的内容,希望读者能够记住与理解,若有不理解之处欢迎在公众号或者博客留言,以便于我进一步完善。

 

1、路由

 

根据前面的学习,你应该可以理解:

当计算机与别的主机通信时,我们需要知道目标主机的IP地址。

如果目标IP与自己在同网段,那么就会去查找arp缓存表。

如果arp缓存表有相关的条目,那么计算机就知道了目标主机的MAC地址,就会进一步封装数据帧,然后数据从网卡发出。

如果arp缓存表中没有相关条目,那么会触发arp解析,计算机会向自己同网段中的所有主机广播,以询问该IP的MAC地址。获取arp应答后,将IP于MAC的对应关系写入arp缓存表,进而可以封装数据帧发送报文。

如果目标IP与自己不在同一网段,则目的MAC为默认网关的MAC,计算机会将数据发往默认网关,由默认网关进一步处理。

 

那么默认网关如何处理呢,他怎么就知道如何到达目标IP呢?

其实默认网关内部有一张表,我们称之为路由表。网关设备一般只会对二三层的信息进行封装和拆解。他将数据流拆解至数据帧,发现目标MAC是自己,于是它进一步拆封到数据包,知道了目标IP,接下来他就会到自己的路由表里去找。要知道,网关设备一般会连接多个网络,所以它是四通八达的,路由表里也会有通往多个网络的地图。它会根据目标IP来对路由表中的条目来进行尽可能精细的匹配。让我们尽可能详细地去了解一下这个过程。网关设备通常为路由器,我们以下便以路由器为例。

 

问:路由表长什么样子

 

答:

这个其实不太好说,因为不同厂商的路由表长相不太一样。但是但凡是路由表一般都会包含以下信息:目的地址、掩码、下一跳、metric

 

比如下面是一张华为路由器的路由表

 

你无需了解每一列是什么意思,你只需要看destination/mask和nexthop,他们标注了目标在destination/mask的时候,该发往哪个IP。interface则标出了应该从哪个口发出。其中,destination为0.0.0.0的条目为默认路由,如果目标IP没有命中出默路由以外的任何路由,则会命中默认路由;如果没有命中默认路由以外的任何路由又没有指定默认路由,数据会被路由表丢弃。

所以说,路由器并不知道通往目标IP的完整路径,只知道下一跳该发给谁,路由器就是以这样一种接力的方式一跳一跳地传送,最终将数据送达目标IP。

 

事实上,不光路由器有路由表,我们普通的主机也是有路由表的。windows系统可以用route print -4来查看路由表。我centos7的虚拟机的路由表内容如下:

[root@localhost ~]# route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         192.168.0.1     0.0.0.0         UG   100    0        0 ens33

192.168.0.0     0.0.0.0         255.255.255.0   U    100    0        0 ens33

[root@localhost ~]#

 

可以看到,默认网关是192.168.0.1是默认网关。有些朋友可能会对gateway为0.0.0.0的这一条目有所疑问。其实这是表示不需要网关的意思。我的虚拟机的IP是192.168.0.110/24,你再看看这一行的destination就会明白,192.168.0.0/24这一条目所匹配的主机根本和虚拟机在同一网段中,直接走arp就可以了。

所以说,其实无论主机还是路由器,都会经历“查找路由表---》据路由表确定下一跳地址---》根据下一跳地址查找arp表”这个过程,只不过同一网段的目标IP下一跳地址不会改变,而主机非同网段的下一跳通常就是默认网关而已。不过在虚拟化横行的今天,通常服务器会连入多个网络(包括虚拟网络),所以也可能会有多个gateway。

 

问:路由表是怎么得来的

 

答:

管理员静态指定或者通过路由协议学习。主机的路由表大多都是静态指定的,比较纯粹;路由器的路由表则复杂许多,比如你可以看看下图的proto这一列:

static是管理员静态指定的,RIP、OSPF都是一种路由协议,路由器之间可以通过路由协议来学习路由,这已经不在本章讨论的范畴,有兴趣的朋友可以去了解一下RIP,OSPF、BGP、ISIS等路由协议,这一般是专业的网络工程师研究的课题。

关于linux系统路由设置相关的话题,以后会专门花篇幅去介绍。

 

问:如果目标IP能够匹配多个路由条目怎么办

 

答:

按最精确的条目匹配(匹配符合条件的destination中mask最长的),比如上图中,去往20.0.0.1时,匹配20.0.0.1/32而不是20.0.0.0/8

如果说有两条掩码长度一样的destination都能匹配目标IP,一般会有进一步的评判标准。这个标准不同的路由器厂商不太一样。比如华为,针对每种类型的路由有一个pre值,如上图,静态的是60,OSPF是10,所以在匹配精度相同的情况下,通过OSPF学到的路由会更优先。(pre值可以手动修改)如果pre值又一样,一般会再看cost值,如果方法面面都一样,则两个nexthop都会选择,也就是会采取负载均衡的策略。

 

2、数据从网卡发出之前都经历了些什么

 

这大概是个老生常谈的问题,之前也给大家简单提到过,今天再拉出来理一下,强调一下。

假设满足了发送数据的条件(知道目的MAC、IP、域名等必要条件),数据是这样整理的:

客户端向服务器发送一个http请求:

1、  首先数据通过http协议进行封装

2、  http建立在tcp协议之上,需要在数据之前增加一个TCP首部,包含了源目端口等传输层信息,以便双方在传输层层面上能够通信;添加完TCP首部之后我们可以称其为数据段

4、完成传输层的封装之后,进入网络层,在TCP首部之前再加上IP首部,包含了源目IP等网络层的相关控制信息,添加完IP首部之后我们可称其为数据包

5、在IP首部之前增加源目MAC等以太网头部信息,构成数据帧

 

6、通过网卡转换为比特流,以电信号或电磁信号的形式在网络中传输

数据发送过程大致就是如此,比特流经过交换机处理时,交换机会对比特流解封装至数据链路层,转发时再进行封装;经过路由器时,会解封装至网络层,根据路由表的情况发送给下一跳,并在封装数据帧时将目的MAC改为下一跳IP所对应的MAC,将源MAC改为自己接口的MAC;最终到达目的主机时,会一路解封装至应用层的数据,传递给应用程序处理。

 

3、NAT技术

IPV4的地址已经不够用了。IPV4地址一共有2^32=42亿个,但是现在在网电子设备的数量是这个数字的好几倍。为此,IPV4采用了一系列的措施来延缓IPV4地址用罄的尴尬。

比如私有地址和NAT:

家庭或者企业内部使用私有地址,在公网传输的时候才使用公网地址,这种地址转换技术就叫做NAT:

 

这样一来,可能几百台甚至几千台主机上网时只需要用一两个公网IP,这种方式看上去非常好,也确实起到了很好的作用。路由器上的NAT设置不在本作的讨论范畴之内,还是那个原因:这通常是网络工程师或者网络管理员做的事情,各个路由厂商的NAT设置命令也不尽相同,届时可参考设备的命令手册进行设置,或者请求对应厂商400服务的支持。

 

值得一提的是,服务器领域也常常需要做NAT转换。因为很多应用程序处于安全考虑,监听在本地的环回口(如127.0.0.1),需要主机将原本的地址转换为程序监听的地址。此外,随着虚拟化和容器技术的发展,物理服务器内部通常暗藏乾坤:物理机内部有着复杂的虚拟网络,虚拟网络采用的IP地址段很可能与物理网络不同,此时也需要进行NAT转换。在Linux主机中,这通常借助iptables防火墙规则来实现。这些内容在进阶部分会向大家详细介绍。

 

虽然NAT技术大大缓解了IPV4的用量问题,但是毕竟治标不治本,它还能撑多久呢?事实上治本的方案早就在二十年之前就提出来了,那就是IPV6。IPV6到底和IPV4有什么不同呢?为什么到现在为止,仍然没有取代IPV4呢?这些问题,下一节再和大家聊。

关注本公众号获取最新更新(公众号名:linux入门真经)

每周一、三、五更新(我尽力)

 

转载请注明原文地址: https://www.6miu.com/read-5033557.html

最新回复(0)