即使我们身处乡村小镇,但打开的某个手机 APP,其服务器可能在数千公里外的机房里。是什么组成了这个庞大的互联网?可以说是无数个网络设备以及更庞大的软件组成的。在这些网络设备(比如集线器,二层交换机,路由器,网关,防火墙等)中,又以路由器最为常见,比如现在家庭宽带用户一般都会配置一个无线宽带路由器。
路由器,其英文为 Router,从名字上就能看出其核心功能:路由。这个很好理解,上千公里甚至更远的距离,不可能会有这样两台机器直接互联,因为信号不管使用哪种方式传输,距离一旦长了,就会出现信号失真。而这个过程,正是通过路由器等设备接力完成的。
维基百科上对路由器的定义是这样的:
路由器(英语:Router,又称路径器)是一种电讯网络设备,提供路由与转送两种重要机制,可以决定数据包由来源端到目的端所经过的路径( host 到 host 之间的传输路径),这个过程称为路由;将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行),这称为转送。路由工作在 OSI 参考模型的第三层——即网络层,例如网际协议(IP)。
路由控制
上面维基百科中提到路由器的两大功能:路径路由和数据传输。而互联网基本上又是由路由器连接的网络组合而成,所以为了保证数据包能以正确的方向传送到目的主机,中间经过的每一台路由器都要进行正确处理才行。这种向正确的方向转发数据所进行的处理,就是路由控制或路由。
需要说明的是,这里我们讨论的 OSI 参考模型的三层网络路由。而针对局域网的二层路由,下文也会进行简单的说明。
那路由器又是如何进行控制的呢?答案是路由表(Routing Table)。
每个路由器都是一个嵌入式设备,其内部软件中会维护一张表格,表格记录了某一类 IP 地址下一站应该去哪个路由器。所以,这也要求路由表必须配置正确,如何错误配置了一条,那么数据包可能无法到达目的主机。
路由表
下图是笔者家中华硕路由器的系统后台,可以看到其路由表配置:
不只是路由器,每一台计算机终端(拥有 IP),也有路由表,因为终端要把数据发送出去,也得知道路由。
在 Linux 或 Windows 上都可以通过 netstat -r
(或 netstat -rn
,n 表示使用 IP 地址形式查看)查看[1]:
# CentOS Linux release 8.4.2105
➜ ~ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default _gateway 0.0.0.0 UG 0 0 0 eth0
10.120.74.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
➜ ~
➜ ~
➜ ~ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.120.74.1 0.0.0.0 UG 0 0 0 eth0
10.120.74.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
➜ ~
Windows 下基本也类似,如下截图为 Windows10 上的执行结果:
这里以 CentOS 上的结果为例,说明一下相关参数[2]:
- Destination:目的地址,一般只配置网络号部分,主机号部分为 0。其中 0.0.0.0(或default)表示默认路由,即匹配不到其他路由(因为对应的子网掩码为 0.0.0.0,表示匹配的网络号长度为 0,即不匹配),则走这一条。
- Gateway:表示下一跳的网关,如果匹配这条路由,数据包会通过
Iface
对应的网卡发送到该网关对应的 IP 地址。 - Genmask:子网掩码,因为路由表匹配时会按照网络号进行匹配,所以需要知道 IP 地址前面多少位是子网,这就是子网掩码的作用。
- Flags:U 表示 Up(The route is up),G 表示 Gateway(经过远程另一个路由器),H 表示 Host(路由的目的地是一个特定的主机)
- MSS:TCP 连接默认的 maximum segment size。
- Window:TCP 连接默认窗口大小。
- irtt:Initial RTT (Round Trip Time),初始往返时间。
- Iface:对应的网卡,如果匹配这条路由,则表示数据包走这个网口出去。
- Metric:到达目的主机的距离(一般是跳数),当匹配到多条路由记录时[3],会使用距离短的路由进行发送。
路由配置
在以直观的方式查看完路由表的模样后,紧着的问题就是如何维护这张表?
这就涉及到静态路由和动态路由:
- 静态路由:即由网络管理员事先配置好路由器或主机中的路由信息,比如使用
ip route add
命令增加一条路由规则。 - 动态路由:网络管理员配置好当前路由器与其交互的相关路由器的 IP 后,接着配置路由协议。根据对应的路由协议,两台相邻的路由器会自动进行路由信息交换。如此一来,新增一条路由,只需要在对应的路由器上设置即可,其他路由器不需要设置。通过路由协议,这条路由信息会自动传播出去。很快,周围相关的路由器上就都有这条路由规则了。目前主要的动态路由协议包括:RIP,OSPF,BGP 等。
不论哪种路由配置方式,有优点也有缺点。静态路由手工配置不仅容易出错,涉及大一点的网络,更是一场灾难。而动态路由相对来说就省事多了,但动态路由因相邻之间的路由器要互换路由信息,这就不可避免的要占用一定的网络带宽。
但不论哪种路由配置方式,都有其使用场景,需要结合起来。
路由控制范围
接入互联网的组织成千上万,如家庭,企业,学校,政府单位,网络运营商等。不同组织,不同区域,不同国家,网络的接入方式都可能有区别。下图引用自《图解TCP/IP(第5版)》,其描述了互联网的连接形态,这里笔者进行一个简单的总结:
- ISP 可以理解为网络运营商,比如中国移动,中国联通,中国电信等。
- 运营商之间通过 IX(互联网交换中心) 连接。运营商之间可以直接连接,为何要加一个中心设备?简单来说,如果各个运营商之间都互相连,就会变成一个网状结构,复杂又麻烦,而通过 IX 则避免了该问题。
- AS 自治系统,可以是一个区域网络,也可以是一个运营商下的网络,指的是可以自己制定路由策略的一个或多个网络群体的小型单位,也叫路由选择域(Routing Domain)。
- 各个小的组织机构叫 POP(Point of Presense,接入点),这些 POP 通过 NOC 连接到骨干网络。
- NOC(网络运行中心)是运营商的核心设备,汇集从 POP 传送过来的网络包,并将其转发到其他 POP 或其他运营商(依赖于网络包的目的地)。
- EGP 与 IGP 是根据路由控制范围进行区分的两类协议,AS 内部用 IGP(内部网关协议),AS 之间用 EGP(外部网关协议)。二者都是不可或缺的,少了 EGP,世界上各个不同的组织机构就无法通信,少了 IGP,机构内部也无法通信。
- 属于 EGP 的协议有:BGP(Border Gateway Protocol,边界网关协议)[4];属于 IGP 的协议有:RIP(Routing Information Protocol,路由信息协议),RIP2,OSPF(Open Shortest Path First,开放式最短路径优先)等。
二层网络与路由
前面主要是针对三层网络(即 IP 地址)的路由描述,其实在局域网内部,二层网络之间也是有路由的。这里笔者主要对集线器和二层交换机进行一个简单的梳理。
以前传统局域网连接方式如下所示[5]:
- 集线器:这种设备会将收到的信号广播到集线器的所有端口上,所有设备收到信号后根据 MAC 地址判断是否是发给自己的,如果不是,则将网络包丢弃[6]。
- 交换机:它会根据网络包中的 MAC 地址进行路由,即交换机中有一个 MAC 地址表,会将每一个接收到的网络包,根据其 MAC 地址判断走哪个端口出去。
需要说明的是,交换机有自学习特性,MAC 地址表的生成流程一般是这样的:
当某个主机 A 的数据包从端口 C 进入交互机时,此时它会将主机 A 的 MAC 地址与端口 C 进行绑定,并生成一条记录插入到地址表中。当局域网中交换的数据包越来越多,这个地址表也就逐渐补齐了所有节点的 MAC 地址与端口的映射关系。
可能有人会问,第一次发包,目的主机的 MAC 地址不在交换机路由表中,会不会造成数据包丢失呢?答案是不会,因为找不到这台主机时,交换机会将数据包发给除源端口外的所有端口中,而只有 MAC 地址符合的机器会返回响应包,此时交换机就可以将这台目的主机的 MAC 地址与对应的端口记录到地址表了。
另外,集线器是半双工的工作模式,数据包同时发和收是不行的,会出现信号碰撞,此时只能将其中一个停掉。而交换机是全双工的工作模式,可以同时发送和接收数据。这底层的原理涉及到交换机,集线器,双绞线的内部构造,以后有机会,笔者将会对其进行总结梳理。
参考资料
- 图解TCP/IP(第5版),by [日]竹下隆史 / [日]村山公保 / [日]荒井透 / [日]苅田幸雄
- 网络是怎样连接的,by [日] 户根勤
在之前的文章中有对比
net-tools
和iproute2
,而netstat
命令属于net-tools
,后续文章将会使用ip route
进行路由查看。 ↩︎不同厂商生产的路由器,其输出字段可能会有差别。这里通过
man netstat
会指引到man route
,然后查看 OUTPUT 下的内容,有详细的说明。 ↩︎为了应对网络故障风险,可能会有备用路由器,所以有多条匹配记录是正常的。 ↩︎
如果没有支持 BGP 的路由器,可以使用 BIRD 软件进行模拟:https://bird.network.cz 。 ↩︎
现在家庭和企业不使用集线器了,而交换机,一般情况下,家庭也不使用。目前,大多数家庭都只有一个互联网接入路由器(房子大,内部组网除外),其与互联网接入商提供的 Modem(光猫,也即宽带上网调制解调器)配合使用。 ↩︎
有个例外,交换机端口的 MAC 模块不具有 MAC 地址,所以它会无视接收方 MAC 地址,把发给它的包都接收下来。 ↩︎