linux软路由的实现

一、前言

一套通信协议的实现除了硬件编/解码与信号传输之外,其余的部分均可以有所选择的由软件或者硬件实现。好比最普通的RS232协议,如果你的硬件系统集成了相关模块,CPU直接从缓冲区读写数据即可,否则就要自己模拟时序,深入到协议细节里去。TCP/IP协议也一样,一般的通信芯片都会集成两层和三层的转发控制,MAC表和路由表都存在通信芯片的寄存器里(片内ram区),用户只要将关键信息写入寄存器即可实现转发。

至于如何平衡软件控制与硬件控制,由项目的实际需求与工程师的具体经验决定。在通信行业,一个庞大的项目会面临巨大的均衡负载的问题。此时,一个好的架构/解决方案也许卖得比一套产品还贵。而对于一个相对较小的项目,比如SOHO级别的家用路由器,压缩单个产品的成本就显得至关重要。动辄几十美刀的通信芯片显然太贵,于是主芯片只集成wifi模块,其余大部分协议用软交换实现的路由器芯片就有了用武之地。

接下来我想分析一下linux软路由的实现方式,顺便回忆一些过去的工作。

二、主要架构分析

路由器可以简单得抽象成一个图灵机,即在输入给定封包的情况下,输出处理过后的封包。但同时要实现一定的用户接口,一旦用户通过用户接口输入命令后,图灵机的内部算法就应该有所改变。大致的模型如下图:

linux软路由的实现_第1张图片
用户接口可以由网页和命令行来提供,也可以由远程的TR069封包来实现。之所以用linux,是因为linux内核里实现了tcp/ip协议,并有相当丰富的文档和开源代码,大部分代码都无需重构,只需要稍作修改即可。

linux软路由的实现_第2张图片

三、具体工作

一般来说,芯片供应商会提供该芯片的linux版SDK,不同的厂商会对SDK进行不同层次的移植。

用户接口层

有些公司将SDK上的网页改上自己的logo就立马上市,这样产品的研发周期的确很快。缺点是不能对路由器的功能进行定制,而且很难让不同的产品形成统一的界面风格,产品也更加难以迭代。假如使用风格统一的界面,再重写web接口,实际上这样做会使每个产品都需要再验证每个功能的稳定性,工作量非常大。

APP层

这些公司有一套已验证的APP,在这些APP之上是风格统一的web界面。他们可以对相应的产品定制不同的功能,主要的工作量集中在硬件相关的代码移植上,特别是wifi模块的驱动。

驱动层

厂商提供的SDK驱动一般不会修改,除非板卡使用了非标准配件而进行少数修改。如果需要对SDK的驱动去做优化,一般在国内只有华为会做这样的事,因为只有华为用的芯片是他们自己的。

内核层

很遗憾,linux内核是有崩溃的可能的,而且内核级别的BUG极难重现和解决。凡是在这一层进行了大量工作的公司,路由器的稳定性一定会提升很多,但相应的边际成本也会很高。

编译器级别

有些极变态的公司,为了优化部分核心算法,会直接查看编译后的汇编代码,然后一条一条得优化。当然会这样的做的只是一些经常被调用的模块,或者开机时加载的模块。

四、openwrt

openwrt无疑是现有开源路由器固件里的佼佼者,据说03年的时候思科的一款路由器被发现使用了linux系统,出于压力,思科公开了该路由器的源码。openwrt就是基于这套代码扩展的,要复习路由器的相关知识,在一个路由器上DIY一个开源的openwrt是一个不错的选择。就连小米路由器,也是用openwrt来改的,并且可以刷上原生openwrt固件。我想选一款tp-link的路由器,刷一个openwrt。在github上专门有人为用openwrt在路由器实现自动写了应用,不仅可以玩而且很实用。

你可能感兴趣的:(嵌入式,web开发)