这几天在讨论组网,说了一句“软路由是坑 能不用就不要o”
(资料图片仅供参考)
就有网友回复要问软路由有什么问题,今天咱们就来系统的说一下。
要搞懂路由(Routing)咱们得从IP网络来说起IP网络协议规定了主机和子网的概念。通常我们在设置一台电脑或者其他设备让它可以连接到互联网,就需要三个基本IP网络:IP地址、子网掩码和网关。
利用子网掩码就可以区分出子网和主机,例如上面这张图片,我们就可以清楚的看出子网地址是192.168.1.0/24,主机地址是147。
在IP网络中如果是相同子网的信息传递一般的情况下会以广播的方式建立连接,并不会进入到路由器中,但是如果是一个IP的目的地址并不在子网内,也就是192.168.1.0/24的子网地址不同,就会转入到IP设定到“默认网关”内进行传递。在一个一个路由器依次传递后,数据包就可以达到在子网外的目的主机,这是IP网络的基本设计思路。
这里的一个重点词汇叫做“默认网关”,“网关”的定义是一种连接两个不同网络或协议的设备,它负责将数据从一个网络或协议转换为另一个网络或协议的格式,以实现不同网络之间的通信。
通常路由(Routing)的概念是由设备发起IP网络数据连接就开始的。所以呢,你在你的电脑上如果输入路由查看命令你会看到大致如下的返回信息:
这个东西叫做路由表,在里面确定了不同IP数据包的目标和网关的发送关系。既然有“默认网关”那么就还会有其他的“网关”。因此你如果看路由器的路由表你会发现路由器上的路由表更加复杂一些:
会根据不同的地址规则将数据发往不同的网关。在这里面就有路由器的路由决策功能使数据可以按照最优的路径进行发送。
现在咱们来说说路由器,其实世界上最早的路由器就是一台软路由。
在Internet网络的前身ARPANET建设初期,就基于霍尼韦尔的DDP-516小型机定制了一批接口消息处理机(Interface Message Processor),完全依靠软件形式来处理ARPANET中不同子网之间的数据传递。
IMP的核心代码利用汇编编写源程序也没有多复杂:
DATA SEGMENTroutingTable DB 10 DUP ("#39;)routingTableSize DW 0DATA ENDSCODE SEGMENT ASSUME DS:DATA, CS:CODEinitRoutingTable PROC MOV SI, OFFSET routingTable MOV CX, 10 MOV AL, "#39;INIT_LOOP: MOV [SI], AL INC SI LOOP INIT_LOOP MOV routingTableSize, 0 RETinitRoutingTable ENDPaddRouteEntry PROC MOV BX, routingTableSize CMP BX, 10 JAE ROUTE_TABLE_FULL MOV AL, [BP+6] MOV [SI+BX], AL INC BX MOV routingTableSize, BX RETROUTE_TABLE_FULL: RETaddRouteEntry ENDPfindRouteEntry PROC MOV SI, OFFSET routingTable MOV BX, routingTableSizeFIND_LOOP: CMP BX, 0 JE NO_ROUTE_FOUND MOV AL, [SI] CMP AL, [BP+6] JE ROUTE_FOUND INC SI DEC BX JMP FIND_LOOPROUTE_FOUND: RETNO_ROUTE_FOUND: RETfindRouteEntry ENDProutePacket PROC CALL findRouteEntry RETroutePacket ENDP MAIN PROC CALL initRoutingTable MOV AL, "5" PUSH AX CALL routePacket POP AX MOV AL, "10" PUSH AX CALL routePacket POP AX MOV AL, "1" PUSH AX CALL routePacket POP AX MOV AH, 4CH INT 21H MAIN ENDPCODE ENDS END
编译到这台小型机的可执行文件大小也仅仅只有6K字节。但这段程序的确完成了DDP-516上路由表管理、路由转发、简单的决策功能。
随着路由技术在逻辑层面的实现,基于电子电路的路由器专用处理芯片也就诞生了。之后类似于cisco一系列的硬件路由器就渐渐的诞生了。
和软件依靠存储转发所完成的路由操作不同,基于电路的硬件路由器的真正的实现了路径的转发操作,其效率仅仅和电路运行的时钟脉冲相关。如果说生动一点的比喻就是把一个杯子里的水转移到另一个杯子里面,硬件路由器是直接拿起杯子倒进去,而软件路由器则是用一把勺子从一个杯子不断的舀到另一个杯子。两者的效率大家可以自行脑补,而用更快的CPU实际上也仅仅是舀水的速度提高而已。
当然了,现代路由器功能繁多,也远远比早期的路由器复杂。本质上利用固件软件加上NPU的现代路由器也不仅仅是硬件部分,还有一系列的功能需要软件实现。但对比于现在依旧是依靠X86或者arm芯片的通用CPU来支撑起来的软路由,本身的效率优势、可靠性和成本优势都是软路由所不能比拟的。
在很多情况下可能你花费了2-3千组起来的软路由,实际上就网络性能来看仅仅相当于价格2-300块钱真正使用硬件芯片的硬件路由器。这件事实际上还是因为“舀水”的本质并没有得到改变而决定的。
不过,在目前来看普通用户所接触到的其实都是软路由。这是因为大多数尚有的电子厂商开始推出了很多的SoC(System on Chip)方案。将CPU和一些必要的网络接口电路做在了一个芯片里面。
例如最近新出的红米AX6000,就是使用了一块联发科Filogic SoC芯片做的系统级解决方案。像这类的解决方案芯片配上相应的固件就组成了一套多功能的网络路由器系统,为用户提供交换、路由、无线等一系列的功能。对于设备厂商来说大幅度的降低研发成本,只需要集中精力去搞产品外形和市场营销就好了,但对于路由器本身来看——历史的倒退又回到了“舀水”的境地。
最前面网友提到的“软路由”系统其实更坑。这也是为什么iN说非必要不尝试的一个区域了。好歹SoC的软路由方案还有部分电路做了网络加速和优化,但基于X86的计算架构搞起来的软路由实际上也就又回到了DDP-516的方案上。一切硬件设计并非为网络而优化,仅仅依靠软件让CPU搬砖来实现各种网络功能。
这类的软路由方案iN最早接触的是DDWRT。这是WRT的一个很早期版本记得是08或者09年的事情了,当时家里的网络系统、NAS等等设备清一水的采用巴福禄的方案。他家的无线路由器hp-G300h除了巴福禄的官方固件之外还可以安装官方支持的DD-WRT系统。
其余的类似软路由系统基本上都用过。这里得说的一个概念固件和系统。
这两个东西实际上差别并不是特别大,一般的来说固件存储在设备的非易失存储器内,例如这台hp-G300h的闪存中,而大部分系统都会存储在容量更大的存储介质中,例如很多X86软路由的硬盘中。它们两个的区别在于固件本身相当简陋,仅仅能响应简单的指令,甚至只提供一些必要的命令行接口,但系统就可以加载功能扩展模块并使用更多的图形界面了。
但对于一个路由器设备来说,本身的需求是开机之后不要去管也不要去看的设备实际上是没有太大的管理需求的,而很多软路由系统,不仅仅被设置了要收集数据例如(NetData)还承担着过多的广告拦截、DNS“优化”等功能,本身紧张的CPU性能用在网络数据处理上也就所剩无几了。
对于读者提到的几种软路由这里给做个分类:一类是开源系统,大部分基于Linux开发,这个和当初WRT出来的原因是一致的。另一类是私有化软件给出的免费版。
例如大家常用的OpenWRT、LEDE、潘多拉等都是基于Linux系统开发的一类软路由系统。而Vyos实际上也是基于Linux的Debain发行版进行开发,也属于Linux系统。
通常,这类的基于Linux系统的软路由系统都要事先运行一个Linux的内核,这就造成了路由系统所需要之外的开销。
另外提到的pfSense是基于FreeBSD的系统进行开发,因此也会有额外的BSD内核加载。
对于额外的操作系统内核的开销,BSD要远大于Linux内核。对于计算能力和存储能力很小的系统,这些系统开销占比就更不能忽视了。
对X86系统的软路由来说则需要加大内存和CPU处理能力这些软路由才可以真正的跑起来。但话说回来……软路由的软件都是谁开发的呢?
以WRT系列为例子,这是因为当初发现cisco的一款家用路由器使用了Linux内核,开源社区就给了Cisco压力,使之公布了WRT54G系列的路由器源代码。在此基础上开发出了openWRT,这时候大家可以理解为什么叫做“WRT”了吧?但对于开源开发者来说实际上并没有任何开发者真正的掌握和理解了路由器内部的硬件构成和硬件接口。因此虽然可以替换某些商品路由器的固件,但一些商品路由器本身基于原始固件的硬件特性也被消除。这也是为什么当初iN觉得hp-G300h的DDWRT聊胜于无的原因了。在使用了DDWRT后hp-G300h的AOSS(AirStation一键式安全系统)功能直接消失。
还有一些半官方支持的软路由系统,例如梅林,这是一个加拿大人基于华硕路由器开发的软路由系统,主要运行于华硕的路由器,在一些基于博通SoC的路由器上也可以使用。但是就是因为开发团队无法得到博通的真正接口文档导致路由器在运行的时候过热问题至今无法解决。
再有就是那种原来WRT的各种分支了。这些分支做大的不多,但是还是因为厂商支持的问题导致一些功能缺失。
例如看了一些路由器系统的源代码,至今系统上承诺对某某性能进行优化的选项到源代码里面依旧是空函数。十多年了,优化了个寂寞。
回头再看X86的软路由——简单的理解就是在一个操作系统上安装了一套有路由功能的软件。
以windows的RRA为例:
在windows server版中安装远程访问服务,其中就有Routing选项。这个服务叫做 windows Routing and Remote Access。
安装后经过设置你的windows server 就具备了路由器功能。当然了,你也可以为windows server 再加入DNS、DHCP等一系列的功能,让它看起来更像是一个家用路由器,当然了如果这台机器上还有无线网卡,你也可以开启AP功能。
代价就是明明可以利用几十块钱的小路由完成的工作,需要拖上几千块的电脑来做,而且由于优化问题其效率并不比几十块的小路由器更好。
还有一些路由器软件例如前面咱们提到的pfSense,本身是一套防火墙的操作系统。主要用于Netgate防火墙内。
有更多的功能是为了防火墙服务的。由于这个软件有一定程度的开源,同时也支持多个接口的设置和转换,因此也被很多人用来作为软路由系统来使用。本质上还是和用windows架起来一个“路由器”一样冗余不用的功能太多。实际上用户并不会在这这种软路由上获得太好的网络性能。
目前宽带进入千家万户,很多人想提高网络性能,想象着换一个软路由就可以达到让家庭网络速度狂涨的目的实际上是不切实际的,这是一个从原理上就可以知道的坑。当然了,你有其他的软路由的用途,并不以提高网速为目的还是可以用一下的。
不过,在大多数情况下,软路由还就真的不是一个家庭用户的刚需。还是之前和大家提到的,家庭网络,能不折腾就别折腾,软路由,非必要无需尝试。
对于安装软路由系统这类所谓的技巧,你看过非酋门相互讨论如何用好“并列式隔热食品输送器”吗?专门干网络的看很多数码博主讨论和评测软路由的时候就是这个感觉。