使用Gns3和EXOS进行网络模拟

gns3是一个开源的网络模拟器,类似PacketTracer。它支持很多种设备,可以把Docker container、Virtual box、VMware以及思科各种系列(除了Nexus系列)的交换机和路由器导入到模拟器中,进行网络组网测试。目前有很多家公司都在用它来进行网络模拟。它也可以用于CCNA考试里的网络模拟。 安装 gns3可以安装在多个操作系统中,支持Windows,Linux,OSX等,具体安装文档参见这里。它分为两部分,一部分是模拟器的核心部分,另外一部分是Gui作为客户端,是用Qt写的。直接安装的话就是安装它的all-in-one的版本,将两个部分安装到一起。 当然,这两个部分也可以分别安装。我比较推荐的是将模拟器核心安装到虚拟机中,官方提供了VirtualBox和VMware的Ovf文件,可以直接作为模板导入到虚拟机中。安装时不推荐安装到VMware player中,一定要安装在Vmware Workstation里面,因为Player的网络功能太差,很多东西功能后面没法用。可以直接到这里下载对应版本的客户端和服务器。它对Ubuntu系列的支持比较好,Redhat系列支持不太好,很多包都还是不可用,不推荐在CentOS下安装。 它同时还可以将服务器部分部署到ESXi中,具体我没试过,如果主机是Doker的话,在ESXi中应该很方便。但是如果主机是VirtualBox或者Vmware的话,ESXi可能便利性可能没那么高。 安装完成之后就可以按照文档提示导入相关的镜像和主机即可,所有的配置都在GNS3 preferences中完成。 如果你觉得思科的交换机用的不爽,有一些高级功能没有的话,你可以试试EXOS的交换机镜像。安装方法在这里。这个文档总结了Gns3常用的安装方法,可以看看。 在配置Docker时,如果是在虚拟机里面,则需要去虚拟机里面安装Docker images。EXOS包含很多高级功能,如LLDP,DCBX。 ...

2016-08-15 · qhsong

[leetcode]Search In Rotated Sorted array 解题报告

问题描述 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherwise return -1. You may assume no duplicate exists in the array. ...

2016-07-02 · qhsong

MongoDB 中文检索的优化

问题描述 最近在给甲方做项目的时候,30W商品信息的检索需要5-10s,数据库是MongoDB。这让我有点大跌眼镜,MongoDB的速度再慢,也不能慢到这个量级,然后这个事情就非常奇怪,经过我几天的折腾,总算把时间量级下降到500ms左右,达到了一个能接收的范围。 ...

2016-06-10 · qhsong

使用Gitlab CI构建持续集成

本文主要讲述使用Gitlab配合Gitlab CI进行自动化部署的过程。本方案是2015北京GDG DevFest中水羽哲演讲的内容的一个简单实现,适合的是我们自己随手搭建主机的实现方案。 使用gitlab 8.2.3 构建,这个版本的Gitlab已经将CI直接融入到了UI中,不再是以前的两个版本的方案了,所以使用的时候请看清楚软件版本。 ...

2015-12-21 · qhsong

本站实现全面https化

前几天一直说要把我的博客实现https化,一直没空。后来昨天被ichon一说,鼓动了一下,就把博客实现了https化。使用的是startssl SSL证书,把所有的http请求全部换成了https请求,妈妈再也不用担心我被劫持了。 然后是由于用的多说插件,多说评论的头像获取并不是https,导致文章页面浏览器显示的不是绿色,强迫症看了略蛋疼。凑合用用吧,等我的go语言版本的博客上线了,就干掉多说。 感谢ichon。

2015-08-07 · qhsong

使用Linux搭建一个VPN网关

最近一直在用OpenVPN通过IPv6将连接到我的linode服务器进行科学上网和免流量。然后要上图书馆查文献的时候又需要关了OpenVPN,倍感麻烦。一开始是在自己电脑上加路由表,但是觉得这样也不方便,不同网络环境还要写不同脚本。然后自己校内还有一堆可以面流量的服务器,于是就像自己做一个PPTP的网关,我通过PPTP连接到校内的服务器,然后校内的服务器作为网关再智能选择走国内学校自带的线路还是走OpenVPN连接到外网。这个拓扑图大概是这样: user<--PPTP 192.168.8.0/24--->校内服务器<----正常上网 10.*.*.*---->Internet ^ | OpenVPN IPv6 192.168.5.0/24 | | v 国外服务器 ...

2015-07-17 · qhsong

使用golang将Doxygen生成Dash Index

最近在研究Dash,一直在做DPDK,最近在看API文档的时候发现DPDK的API文档优化做的不太好(也有可能是我不会用),然后心血来潮的打算自己制作一个文本放到Dash中。 在制作Dash中有一个步骤是要生成Index文件,手动生成明显不现实,所有就用golang写了一个脚本来生成index文件。写了大概两天,还好。 地址是https://github.com/qhsong/DoxygenToDash 在写的时候这个脚本考虑的是可以使用多线程,尝试了使用golang中的一些新特性,chan、go、select,感觉go性能不错。也有可能是我换了SSD的原因,SSD果然是提升体验的神器。 如果你觉得速度不够快,可以修改代码,多生成几个goroutine就行了。刚刚把DPDK的文档提交到github上,等作者审核。 最近计划更新博客的外观,一直没有很好的博客模板。学习一下Hugo,老感觉Hugo在生成预览的时候还是有点问题的,仔细研究一下。

2015-06-26 · qhsong

构建之法——现代软件工程(1)

单元测试 单元测试应该在最低功能和参数上验证程序的正确性 单元测试必须由最熟悉代码的人来写(程序作者) 单元测试过后,机器状态不变 单元测试要快 单元测试应该产生可重复一直的结果(不要用随机数) 独立性,单元测试不依赖别的测试 单元测试应该覆盖所有代码路径 单元测试英国集成到自动化测试框架中 单元测试必须和产品代码一起保存发布和维护 效能分析 效能测试->分析->改进->再进行效能测试 不要未经分析过早的进行效能提高 个人开发流程 PSP2.1 工程师在接到任务时,应该怎么做? 不依赖于某种技术 不依赖于考试 小型团队无法找到高质量项目需求 PSP依赖数据 PSP目的纪录工程师如何实现需求的效率

2015-06-22 · qhsong

DPDK Programmer's Guide(1)

介绍 Roadmap 本文主要讲述 软件体系结构和如何使用它,尤其是在linux环境下 DPDK的内容、编译系统(包括可以在root下使用Makefile去编译开发工具和程序)、移植程序的准则 软件中的优化和在一个新的开发中需要重新考虑的问题 相关的出版物 下列的文档中使用DPDK开发应用程序: Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide 概述 这部分对DPDK给了一个全局的概述. DPDK主要的目标是去提供一个简单、完整的框架在数据平面的程序中快速的进行数据包处理。用户可能使用代码去理解一些已经应用的技术去部署上层的原型系统或者构建他们自己的协议栈。这些在使用DPDK的程序中的生态系统中都有可替代的产品。 这个框架通过环境抽象层(EAL)生成了一系列的库来对于一些特定的环境进行屏蔽,这可能是Intel 架构(32位或者64位)、linux下编译器或者一些特定的平台。这些环境通过使用makefile和configuration file来进行配置。一旦EAL被生成用户就可以使用这个库文件来创建他们自己的应用程序。在EAL之外的库,例如hash,LPM(longest prefix match)和rings库也在DPDK中提供。样例程序也对用户提供帮助,并向他们展示如何使用多种多样的DPDK的特点。 DPDK实现运行一个完整的包处理模型,所有的资源在调用前必须被提前分配,程序运行就像执行单元一样在逻辑CPU核心上运行。这个模型不支持任务调度并且所有的设备需要通过轮询的方式进行访问。不使用中断的主要原因是中断处理的性能开销大了。 开发环境 DPDK项目安装需要Linux和相关的工具链,如一个或者更多的编译器、汇编器、make工具、编辑器和多种库文件来生成DPDK的组件和库。 指定的环境和构架的库文件生成好后,就可以用来创建用户数据层的应用程序。 在Linux用户空间中生成一个程序,glibc库是需要使用的。对于DPDK应用程序,编译之前需要有两个环境变量(RTE_SDK 和RTE_TARGET)被配置。下面是如何配置这个环境变量的例子: export RTE_SDK=/home/user/DPDK export RTE_TARGET=x86_64-native-linuxapp-gcc `` 具体参考_DPDK Getting Started Guide_ 来如何建立开发环境 + EAL(环境抽象层) EAL提供一个普通的应用程序接口来隐藏不同环境的差异,EAL提供的服务如下: + DPDK的加载和登陆 + 支持多核和多线程执行 + CPU内核指定 + 系统内存分配释放 + 原子锁操作 + 时间引用 + PCI总线访问 + 跟踪和调试函数 + CPU特点识别 + 中断处理 + 闹钟?操作 EAL更详细的描述参见第三章...

2015-05-13 · qhsong

pcap 1.6 man手册

pcap 1.6主要的函数说明指南,自己翻译了一下,贴出来共享: 打开一个可以进行读取的设备 打开设备 live capture 使用pcap_create()创建设备,并且使用pcap_activate()激活。 得到设备的list,使用pcap_findalldevs(),释放的到的list,使用pcap_findalldevs() pcap_lookupdev() 得到第一个不是loopback的设备 从文件中获得 打开一个已经保存好的文件,使用pcap_open_offline()直接输入路径,pcap_fopen_offline()输入的是FILE *类型 得到一个FILE *类型,使用pcap_file()函数 fake pcap_t 作为 pcap_open_dead() 生成一个无用句柄,仅作为写入文件和编译过滤表达式 上述函数返回一个指向pcap_t类型的指针作为抓包的句柄,要关闭这个句柄,使用pcap_close() 句柄参数设置 snapshot length 抓取数据包长度。默认抓取的是整个数据包,这将花费更多的CPU时间、磁盘空间将数据包拷贝到程序中。如果只需要部分的数据包长度,那可以设置这个数值为需要的数据包长度即可。 如果这个长度设置和snaplen相同,并且snaplen小于抓取的数据包的长度,那么第一个和snaplen长度相同的数据包将会被捕获。 65535是最大值 使用pcap_set_snaplen()来设置 premiscuous mode 混杂模式,不用多说 使用pcap_set_promisc()设置 monitor mode IEEE 802.11 wireless协议下,即时打开混杂模式也收不到别人的包。monitor model 又叫 rfmon mode(radio frequency monitor)。在这个模式下,网卡会提供802.11包头,也有可能会提供有关这个帧的伪包头。在这个模式下,网卡可能会和原有网络断开,所以这时候网卡使用不了任何无线网络。 设置monitor mode使用pcap_set_rfmon()函数,检测是否能设置这个模式,使用pcap_can_set_rfmon() read timeout 通常而言,数据包一旦到达,抓包程序就会被唤醒。这样每抓一次包,就会产生一个或多个系统调用。 但是,我们可以指定当数据包到达时,中间有一个短的延迟再进行抓包和包处理。这样在这个数据包被抓包程序捕获时,会累计了不止一个包。那么,一次程序的唤醒就能处理多个包,那么一系列的系统调用就能处理多个数据包,而不是一个包。这样极大的减少了CPU占用率。 这个数值是必须设置的,这样程序就不用等待操作系统抓包缓冲区填满了再给抓包程序,如果数据包到达的比较慢,那将会等待很长一段时间。 并不是所有的操作系统都支持这个数值,在不支持的操作系统上,这个时间是被忽略的。这个timeout设置为0,那么将会导致读取包函数无延迟的等待足够多的数据包到达。 NOTICE:read timeout值不能被用于读取一个包并在指定的一段时间内返回,因为在某些平台上,timeout并不是被支持的,在其他平台上,直到第一个包到达时,定时器才会开始计时。这就意味着read timeout是无效的,例如,在一个程序要允许包抓取的loop去周期的poll用户输入,那么这并不保证在如果没有数据包到达的情况下,即时timeout过期了,读取数据包的函数调用会返回。(PS:-1表示无延迟) 使用pcap_set_timeout()来设置read timeout buffer size 缓存buffer大小,如果buffer满了,多余部分就要丢掉,除非你的操作系统是非页式存储的操作系统(non-pageable operating system memory)。使用pcap_set_buffer_size()设置 timestamp type 时间戳格式,目前用不到 使用pcap_datalink()函数来决定数据链路层的类型,以此来确定包头的格式。返回值在http://www.tcpdump.org/linktypes.html 不要假定从一个给定的抓取或者文件中获得的数据包会有任何给定的数据链路层头。举个栗子,Linux上的’any’类型的设备在数据链路层上使用DLT_LINUX_SLL 就算在这个系统上的所有设备在这个’any’设备被打开的时候,仍然是其他数据类型,如DLT_EN10MB (以太网)。 选择一个数据链路层头来进行living capture 有一些设备不止支持一种数据类型,为了得到网卡支持的链路层头部,使用pcap_list_datalinks()在一个已经激活的pcap_t上获得数据类型。释放链表使用pcap_free_datalinks()。设置抓取的数据包头部pcap_set_datalink()。这个操作应该在设备已经激活之后,和在设备没有激活而且没有任何过滤器被编译安装之前。...

2015-05-13 · qhsong