转载自:https://www.zhihu.com/question/30121257?sort=created

如何自己制作一个路由器?

硬件方面需要哪些?路由器上的一些协议也自己实现,有哪些资料参考?

关注者

167

被浏览

30,194

4 个回答

Andrew Song

华为技术有限公司 硬件工程师

我建议题主先写下要求,比如转发容量是多少?出多少端口,时候需要支持灵活插卡。你描述的越详细,回答会越贴近你的要求。

下班后详细回家你这个问题。

----------------------------------------------------------------

下班更新:

我还没有回答,就开始点赞/感谢的人,我表示你们太抬举我了,我定不负你们的支持。

我对路由器的研究也有一段时间了,随未称为路由器专家,但也小有心得,给题主提供个参考。

一下实现按难以程度逐步递增:

1.刷路由器类

硬件:购买家用路由器,支持openwrt 等各个wrt

软件:刷openwrt等软件。

实现:自己写一些APP或者如果有能力看懂或实现简单的协议。

优点:目前主流的路由器玩法,硬件容易购买,软件开源,目前比较火爆,各种教程充斥网络,上手容易。

详细可参考:

如何从零开始学习OpenWrt? - 无线路由器

开发openwrt,除了需要懂linux外,还需要哪些技能? - Linux

不再赘述

2.低端集成网口的单片机类:

硬件:带网口的单片机,如TI 的LM3S8962(当年我玩的东西)

软件:一般这类单片机不带MMU,无法使用linux,可以使用无操作系统的lwIP,或者ucOS加lwIP等

实现:要看芯片的手册了,进来的数据包会触发什么样的中断?中断处理函数怎么写,你可以任意实现从2~7层的所有协议,比如我当年就写了个简单的ARP应答。

优点:更容易看清下数据连路层,网络层的工作方式,也可以不带OS,协议栈,完全自己写,会遇到很多问题,这时候才能看协议的精妙。

3.高端处理器开发板类

硬件:Freescale QorIQ系列 P1020WLAN

QorIQ P1 WLAN Appliance Solutions|Freescale=

软件:openwrt 或者自带的 linux都行,

实现:手册都是全的,你完全可以自由发挥。和上面一样,但是这个就可以作为一个企业级路由器的项目了。数据包处理能力也是贴近于真正的路由器的。

优点:基本能实现你所有你想要学习,实践的所有功能,只要你知识储备充足。

4.高端FPGA开发方案

硬件:多网口的FPGA

软件:linux,verilog(也算硬件吧)

实现:主要可以实现硬件上的二层三层转发。比如进来个数据包,你可以先存在你的内存里面,然后根据你FPGA里面的转发表,转发到这个数据包应该进的地方。

优点,你可以学习到数据的二三层转发。协议什么的,不是这个的关键。

下面要开大招了,下方高能量小心:

5.CPU + FPGA方案

硬件:自己画板,加工,找地方加工单板。

FPGA链接多个端口,可以使用FPGA自带的PHY,或者外接PHY,但鉴于非正式产品化,且PHY的几个供应厂家的样片,数据手册都非常难拿到,所以建议使用xilinx自带PHY功能的FPGA

软件:linux 或者 wrt

实现:现在FPGA中实现数据包进来以后,根据查找表,查找出接口,查找表由CPU通过控制通道下发到FPGA中,这个通道建议做成pcie,localbus,mdio等。

FPGA其中的一个通道连接到CPU上,作为数据包上送CPU处理的通道。

也就是说,路由表是由CPU通过控制通道发送到FPGA中,在由FPGA负责来转发到端口,还是转发给CPU

优点,已经开始实现现代路由器的架构了。

6.控制平面,转发平面分离,支持主备互相备份。

将刚才FPGA的那部分拆分出来,独立做一块单板

CPU单独做一块单板。然后每个路由器使用2块单板。

刚才说下路由器表的控制通道拆分成2部分。

CPU1-------主备通道-------CPU2

| |

|------------ FPGA------------|

既路由表可以通过CPU1下发给FPGA,也可以通过FPGA2下发。

同事FPGA上送给CPU的报文,这时候要通过FPGA自身备份下同事发给CPU1,CPU2.

路由协议报文要求CPU1,CPU2获得相同的报文,计算结果也是相同的,同事CPU1,CPU2引入主备用竞争,主备监控,平时主用CPU负责下发路由表,备用CPU只是监控,当主用CPU死掉,由备用CPU负责下发路由表,这样保证当主用的CPU失效的时候,备用CPU立即替代它的职责,保证FPGA转发不会断流量。

7.转发平面1:1备份

从上面6我们发现一些不足,就是 如果FPGA挂掉了,是不是流量就会断,我们路由器要保持稳定啊!那怎么做?聪明的你一定想到,FPGA也要备份啊。

具体:

CPU1---主备通道---CPU2

| \ / |

| \ / |

| \ / |

| X |

| / \ |

FPGA1 FPGA2

| |

|------转发卡[1:N]------|

转发卡可以通过FPGA1转发,也可以通过FPGA2转发,FPGA1和FPGA2也引入主备机制。

CPU下发的路由表要同时下发给FPGA1 FPGA2,正常情况主用FPGA负责转发,但是备用FPGA中也有同样的转发表,但是没有数据进来,当主用FPGA挂掉的时候,转发卡将数据倒到备用FPGA中,由于备用FPGA也有同样的转发表,所以可以直接转发,也不会断流量。

8.当然了,备份也少不了电源,风扇等,暂不在讨论之列

关于上面的几点说明:

1)后面提到的CPU不是只代表CPU而是代表控制平面,即路由器中的主控板MPU,里面可能有CPU,FPGA,CPLD等,但是他不负责转发数据包。

2)同理后说的FPGA已不代表只是FPGA,而代表转发平面,即路由器中的转发板LPU,或NPU板。这个单板不负责计算路由器协议,不直接接受用户命令,只接受 主控板的转发表项。

3)大家会问道为什么你不用CPU+LSW(lanSwitch)因为LSW的资料一般 博通,马威尔外面都找不到资料,不具备可行性。相比而言使用FPGA简单灵活,便于后续功能扩展。

需要学习的资料:

硬件相关的就不说了,因为如果你使用前几种,估计是你是不感知硬件的。

软件方面:

TCP/IP详解 第一卷 讲的是各种原理,必须要看的。基础知识要牢固

TCP/IP详解 第二卷 具体讲代码,将数据结构的设计,建议你根据第一卷自己先尝试实现,遇到问题再回来看,你会发现他们的代码是经过深思熟虑的。

如果要实现各种协议,各大厂商的教程(目前正式出版的好像只有思科)会帮助你快速理解,当然如果想深研究,得看各种IEEE 802协议了,RFC,G.xxxx这些东西。

最后的建议,如果想搞路由器玩玩就搞使用方案1.买路由器刷 wrt,简单实惠。

如果要是想彻底研究TCP/IP,建议使用方案2.3,你可以从下到上,比如先写ARP,对方发出ARP请求,你回复个ARP Reply,在电脑上arp -a看看学没学到,然后在尝试写相应IP报文,响应ping命令等,再回头看看TCP/IP详解 第二卷 你会很有体会。

太晚了,有空继续更的详细点。明天还要上班。。。。。作于2015.05.06凌晨

编辑于 2015-05-06

如何自己制作一个路由器?相关推荐

  1. 用安信可ESP32-G开发板制作一个简易路由器

    文章目录 一.前言 二.中继路由器 三.以太网路由器 四.源码及使用方法 联系我们 一.前言 本文介绍用安信可ESP32-G开发板制作一个路由器,有两种玩法; ESP32无线连接路由器后开启热点,周围 ...

  2. 利用TCP/UDP 协议制作一个飞秋聊天工具

    视频操作演示: 利用TCP/UDP 协议制作一个飞秋聊天工具演示视频 int udp_broadcast(char const*argv[]) {//1.创建对象udp_socket = socket ...

  3. 使用html和css制作一个小米商城页面

    使用html和css制作一个小米商城页面 创作不易,可否给作者点个赞再走 html部分: /** * author 阿木木 * date 10/01 14:32 * / `<html>&l ...

  4. 如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2.1.4

    在第一篇<如何使用CCRenderTexture创建动态纹理>基础上,增加创建动态山丘,原文<How To Create A Game Like Tiny Wings with Co ...

  5. 制作一个简单的linux

    我这里是借助宿主机做的一个简单的Linux,我们只要知道一个Linux启动过程需要什么,这里制作就简单的多了.不过没有基础的也没关系,我写的很详细,没有基础的看了我写的步骤只要细心也是会做出来的,我这 ...

  6. 使用 ale.js 制作一个小而美的表格编辑器(2)

    今天来教大家如何使用 ale.js 制作一个小而美的表格编辑器,首先先上 gif: 是不是还是有一点非常 cool 的感觉的?那么我们现在开始吧! 这是我们这篇文章结束后完成的效果(如果想继续完成请访 ...

  7. html靶心制作,用PS单色填充制作一个靶心

    使用单色填充的方法制作一个靶心,属于Photoshop的入门课程,好了,喜欢的朋友可以参考本文! 步骤 1.新建图像文档.选择"文件-新建"命令,在弹出的对话框中设置"预 ...

  8. python制作解压工具_使用python制作一个解压缩软件

    python实现解压缩的重要模块就是--zipfile,其次是os 安装zipfile模块 首先得安装zipfile模块,打开cmd输入一下命令即可安装 pip install zipfile os是 ...

  9. android socket 简易聊天室 java服务器_利用Socket制作一个简易的Android聊天室

    首先制作一个客户端,界面如下: 使用方法:启动后,首先在登录编辑框输入一个昵称,然后点击登录,上面灰色区域是聊天窗,其中会显示你的登录提示,显示其他人发的消息.在的登录成功后,可以在下面的发送编辑框内 ...

最新文章

  1. 2022-2028年中国瓷砖粘结剂行业市场研究及前瞻分析报告
  2. autoconfig.xml与antx.properties一级application.properties之间的关系
  3. 【转】Android Studio系列教程一--下载与安装
  4. android判断模拟器的三种方法
  5. 正则表达式(中文表达:检查表达式符)
  6. SpringBoot高级消息-RabbitMQ运行机制
  7. 系统启动数据库服务器,linux系统如何启动数据库服务器
  8. Pygame 整活五子棋
  9. Android之解决VideoView控件的进度条位置摆放问题和打开播放黑屏问题
  10. python增强对比度_python增加图像对比度的方法
  11. EasyUi-1 拖放
  12. 2018-2019-1 20189213《Linux内核原理与分析》第五周作业
  13. 未来的云计算基础设施长什么样?
  14. 机器学习系列2---经验风险最小化原则和结构风险最小化原则与VC维问题
  15. 大数据基础之Spark——Spark pregel详细过程,一看就懂
  16. JavaScript交互式网页设计 • 【第3章 JavaScript浏览器对象模型】
  17. 2022,我们追逐群星,也在追逐AIGC的无尽可能
  18. 新鲜出炉的点菜系统(附源码)
  19. 从入门到不放弃:多浏览器的自动化测试(1)- 本地测试
  20. 管线探测仪在城市管网建设中的重要作用

热门文章

  1. ABP中缓存的使用方法
  2. USG防火墙透明模式配置
  3. Java笔记之线程池详解
  4. 2021年全球与中国病理工作站行业市场规模及发展前景分析
  5. 2022熔化焊接与热切割试题及答案
  6. Java简单代码验证三门问题
  7. DISTINCT和GROUP BY的区别
  8. oracle更改system表空间大小,收缩system表空间大小
  9. 数据结构java版之《栈和队列》
  10. 武汉理工大学计算机考研排名2015,武汉理工大学和南京理工大学计算机研究生比较一下...