说这个话题实在有点不得已,我向来不攻击别的公司的产品,市场自有检验标准,华盾公司产品要是卖不出去,那是我们学艺不精,无话可说。可是一定有人说软件vpn要替代硬件vpn的话,我倒不得不来说几句了。
说这个,倒不是我们公司没有软件vpn这个产品线,实际上我们的大型项目,象中铁快运,出于成本考虑,差不多一半左右的点都是使用软件包或者软件网关。但是软件包和软件VPN,在我们公司产品线中间是处于一个补充的作用。大家如果对软件VPN有兴趣,可以看一个VNN软件(vnn.cn),他的作者胡大侠是我师弟,以前在我们公司作软件vpn开发的。vnn是他离开以后的个人作品,算是一个非常好的个人版的vpn软件。各位要是想要实现点到点vpn连接,使用这个软件,非常合适,而且是完全免费的。
抛开技术原因不谈,先从商务的角度来看,一张光盘和一个硬件设备,对于中国人而言,有几个人能够认可光盘的价值?我自己销售出去的小型网关,客户都一再提醒我,最好外形作得更大一些,才象能够值钱一点的东西。举例来说,一个100万规模的大型VPN网络,最后买回去1000张光盘,或者半卡车硬件,不言而喻,到底哪一个对用户有说服力?尤其是中国的领导并不见得懂得技术,观念可想而知。
从技术而言,我认为硬件VPN和软件VPN开发都需要非常大的投入。倒不见得谁的技术含量一定高,谁的技术含量就一定低。所谓的硬件VPN,实际上也是一个硬件设备,灌入操作系统和应用程序。我们的开发硬件VPN,实际上也都是在作软件工作,只不过要作很多操作系统级的工作,诸如裁剪操作系统,修改内核驱动等等。现在的vpn硬件,对于一个公司而言,一般有2-3种合适的硬件平台,普通的中高端的一般使用X86工控机或者专用的网络处理芯片,硬件由台湾研华等厂家提供,中低端典型硬件有ixp 422/425等,带硬件3des加速功能,更低端的,一般就用宽带路由器一样的体系,主要是arm系列或者MIPS系列。
国内具备独立开发操作系统内核的公司并不多,即使有linux公开源代码,要根据需要更改操作系统内核,也没有几个公司能够达到,这个需要技术积累,大跃进不出来的。vpn网关是软件/硬件一体化的设备,需要比较强的研发团队和多年的技术积累才能做好。目前大量国内销售的VPN网关实际上是台湾开发的,台湾制作硬件的同时,把Linux裁剪好,提供vpn的功能,并且能够为用户定做接口和用户界面。这导致大量同质化的vpn产品充斥大陆市场,而这些产品并没有按照国内网络的特点和用户需求定做开发,因此大面积的推广应用,存在很大的困难。而国内很多软件VPN,正好弥补了这些缺点,因此也占据了一部分的市场。
但是和硬件网关相比,软件VPN自身也有很多的缺点,前面说到的商业价值认同算一个(实际上已经够致命了),其他方面还有:
1.纯软件的VPN一般运行于Windows系统之上,但是我们知道Windows系统并不是一个合适的网络操作系统平台。别的不说,每次新病毒爆发,windows往往首当其冲,而运行vpn的计算机挂在Internet之上,风险更是无形增加了很多。硬件设备,相对而言,稳定性和可靠性要高很多,价值10几万到20万以上的高端设备,其可靠性要求非常高。估计国内没有多少人能够认同windows安装一个软件就可以的。
2.VPN是基础网络,那么vpn网关起到的作用,实际上就相当于传统的路由器作用。从这个角度理解,使用一个专用硬件是很自然的事情。目前VPN的巨头,一般可以分为2类,一类是象华为、迈普那样从路由器作过来的,另外一类是象华盾、天融信这一类从安全技术领域作过来的,所以走的路线基本上都是从原有产品线延伸过来。而从事软件VPN开发的,占据的是一个细分的市场。从国外it发展成熟的情况来看,凡是某项专门的功能,能够通过一个单独的设备能够完成的,一定会使用专用的设备。以前我们公司曾经代理过一家美国的防火墙产品,基于windows nt开发的,确实很好用,但是最终这家美国的公司没有逃脱被淘汰的命运。而生存下来的美国防火墙厂家,100%都是使用硬件,再没听说哪家公司以windows为基础开发防火墙。
3.从成本而言,软件VPN可以做到价格更低,但是考虑到运行软件需要一台专用的计算机,如果要求比较稳定可靠的话,计算机的档次还不能太低。把软件和硬件的成本累加起来,其实已经不低。而一个比较够用的硬件VPN(可以带20台以上计算机),折扣下来的价格也就几千而已。我规划的明年推出的easy VPN硬件,一个硬件外加数量不限的客户端软件,零售价格不超过4500,实际上软件VPN已经优势不明显了。我自己的公司的VPN软件,除了要求使用usb-key认证的,其余的可能走上全面free的道路。
4.从功能而言,如果vpn网关是大牌厂家推出的,例如:迈普、华盾、天融信、华为(和他们交手n次)等等。除了VPN功能以外,一般都内置了这些公司之前的大量的技术积累,功能因此相当强大。除了vpn组网功能以外,一般都包括了路由模块、代理上网、包过滤防火墙、带宽管理、应用代理、双向nat、各种应用服务器(拨号服务器、DHCP服务器,l2tp server)。
说了这么多,可能对专门作软件VPN的兄弟有得罪之处,请多指正。其他兄弟,对此有不同看法的,也可以提出意见。
五环 回复于:2004-12-09 12:19:59
我赞同这位人兄的一部分观点;如中国领导喜欢看到一些实实际际的东西,软件这个东西叫他花很多钱,他感到亏;其它的观点我不能苟同.
cnadl 回复于:2004-12-09 14:11:58
目前国内VPN市场因为cisco concentrator卖不进来,所以主要的硬件设备还是nortel、juniper等厂商的产品主打。
论功能软件VPN最大的缺点是对路由协议支持得不够全面,这样如果在site2site的情况下几乎是不可能采用的。
另一方面就如同上面兄台说的(8好意思,没记住名字)软件VPN的稳定性是不可控的。
还有软件VPN的安全性也是问题,如果不考虑那种把linux装到工控机里类型的“硬件VPN”的话,硬件VPN的安全性能(尤其是防御DoS攻击的性能)要远远好于软件VPN,因为不是什么事情都发给CPU做,也没有那么多可能有隐患的进程在跑。
我个人观点软件VPN的发展前途倒是比较渺茫,因为做高端肯定做不过硬件,做低端个人用户肯付费的又不多,只有在低价位市场打,那利润就有限。不过好在IPSec和SSL协议不要钱,还是会有人开发的。也许会有大公司(比如IBM)弄出款性能很好的免费的,但是只有AIX的版本……
一家之见,欢迎回帖;可以拍砖,请勿骂人。
路由之门 回复于:2004-12-09 22:02:08
多推荐几种,供大家比较选择,各取所需。
哪里去找如此强劲的VPN网关 HiPER 3300VF
http://auction1.taobao.com/auction/0/item_detail-0db1-9f44a18d736d5357b4270fd470cb90c2.jhtml
新品上市 可建16条并发8条的IPSEC VPN网关 Hiper 3100VF
http://auction1.taobao.com/auction/0/item_detail-0db1-c4d006c7ccaab278dba8c7759387386e.jhtml
lixc_163 回复于:2005-08-12 16:33:00
学习中,好
netchen 回复于:2005-08-15 12:13:01
我觉得这块发展很好,我想做VPN和VOIP的相关产品
有厂家看到信息请发IT@HNMCC.COM请勿发病毒,感谢!
shyking166 回复于:2005-08-20 00:50:48
看了LZ写的文章,真的学习到不少,我还是刚刚毕业出来的学生,想在网络方面发展
无聊酒鬼 回复于:2005-09-19 17:03:31
好帖子,有道理,大家都没勇气顶么?
ssok0511 回复于:2005-09-23 16:52:25
不好意思刚看看 。楼主能不能发个一份过来看看,我本人起学学,正好老总也想搞个,让我先看着点。
邮:ssok00420003@hotmail.com 或ssok1@sina.com.cn
upkiller 回复于:2005-11-01 16:18:39
顶,楼主说得很有道理,不过总之,硬件维护量小,软件维护量大,抛开用windows做vpn服务器(太烂,太容易出问题了),用linux或是别的系统,不是一般的系统管理员能做到的,所以硬件还是有市场的,除非系统管理员个个都牛人
summerit 回复于:2005-11-02 13:34:26
我们的vpn能实现ipsec和ssl两种功能,并且是中文界面,适合从中小企业到大的运营商的所有应用。欢迎咨询!!!~~~相信高的性价比一定会满足您~!
summerit 回复于:2005-11-02 13:37:22
hotmail:yuqiu929@hotmail.com
qq:254616879
lc踏雪寻梅 回复于:2005-11-23 14:22:36
我也认为硬件vpn的优势要明显一些,撇开中间商的高额利润,硬件vpn设备的价格确实现在应该是比较贫民化了,稳定性和可维护性好的多,何况硬件vpn设备大多集成有防火墙功能。
anthonyfeng 回复于:2005-12-03 13:23:51
随着通用硬件的发展,专用硬件vpn的发展优势相信会越来越少,最后,是两者的完美结合。
signorino 回复于:2006-04-12 10:31:20
民用,,中小企业,soho用软件,, 企业级别肯定是硬件vpn,,这个接线可以参考防火墙
jsw7001 回复于:2006-04-13 16:14:42
从成本而言,软件VPN可以做到价格更低,但是考虑到运行软件需要一台专用的计算机,如果要求比较稳定可靠的话,计算机的档次还不能太低。把软件和硬件的成本累加起来,其实已经不低。而一个比较够用的硬件VPN(可以带20台以上计算机),折扣下来的价格也就几千而已。我规划的明年推出的easy VPN硬件,一个硬件外加数量不限的客户端软件,零售价格不超过4500,实际上软件VPN已经优势不明显了。我自己的公司的VPN软件,除了要求使用usb-key认证的,其余的可能走上全面free的道路。
华盾的技术也只能做出这个层次的产品,推出的那个三四千块钱东西还不如LINKSYS的SOHU路由器好用,售后服务又差,我们公司不过才用了两个月,配件换了两个,最后一咬牙还是丢到垃圾筒了。国内现在有很多不错的VPN产品,其实也不比什么国外的差,价格却是还不错。天融信的防火墙是不错,但是做VPN还是很欠缺的,试用了一段时间还是没有选取择,现在我们用的是sinfor的产品,先是试用一个月软件,两个月后换成SC集中管理的,说句不失偏饽的话,个人感觉还是蛮好的,华盾整天拿着那个USB KEY在那吹,可知道那是人家sinfor专利,真是大言不惭,对你失望。
老实说网管不好当,每天忙的不是到处跑就是乱桌子,用了那滥东西搞的我天天往分公司跑还挨上面骂,本来也就算了,但看到上面吹的不免来气。
jsw7001 回复于:2006-04-13 16:17:25
另外sinfor的技术支持也是一流的,免费800
hsyll 回复于:2006-04-28 08:14:58
引用:原帖由 upkiller 于 2005-11-1 16:18 发表
顶,楼主说得很有道理,不过总之,硬件维护量小,软件维护量大,抛开用windows做vpn服务器(太烂,太容易出问题了),用linux或是别的系统,不是一般的系统管理员能做到的,所以硬件还是有市场的,除非系统管理员 ...
呵呵,牛人还做管理员啊,现在国内的管理员的工资太低了吧。都会编译linux内核+配置VPN,硬件还真的可能会没有市场了。
wsgtrsys 回复于:2006-05-07 16:51:30
如果vpn server可以利用显卡的gpu来进行计算加速的话,那就肯定可以超越硬件vpn了。
jk0wg 回复于:2006-05-07 23:13:39
引用:原帖由 wsgtrsys 于 2006-5-7 16:51 发表
如果vpn server可以利用显卡的gpu来进行计算加速的话,那就肯定可以超越硬件vpn了。
这建议不错啊..:)
haskio 回复于:2007-03-22 10:59:43
软件, 一个费用, 一个是多元化,比如加在其他一台服务器上。功能多元化以及定制等
硬件,专业,各方面。就是费用,维护 ==
wheel 回复于:2007-03-23 13:24:25
显卡代替CPU的语言-BrookGpu简介
Brook是标准ANSI C语言的扩展,它是一种为人们所熟悉的高效的语言,它集成了数据并行计算和算术计算集中这两个特点。
通用的计算模型,也就是所谓的流(Stream),同传统的常规语言相比,有以下两个主要的优点:
1.数据并行:允许编程者指定如何在不同的数据上并行地执行相同的操作。
2.算术计算集中:鼓励编程者指定数据上的操作,以达到全局的通信最小而局部的计算最大!
更多的关于Brook的内容可以在Merrimac web site 找到,里面包括了这种语言的完整的说明。Brookgpu为了在GPU上使用,它实现了Brook规范的一个子集。一个Brook 程序中包含合法的C代码和声明流(streams)的句法扩展以及叫做kernels的函数。
流(Streams)
流是一个新的数据类型的扩展,代表了一系列能够被并行处理的数据。Streams的声明规则和数组很像,都是使用尖括号进行声明的。声明一个流的例子如下所示:
float s <10, 10>;
上面声明了一个2维的浮点类型的流。每个流都是由流元素组成的。在上面的例子中,s是一个包含了100个浮点类型流元素的流。流的形状就是指流的维数。在这个例子中,流的形状是10×10。流是用列优先的方式来进行描述的,同C语言中的数组类似。因此,形状为<100>的流与形状为< 1,100>和<1,1,100>的流是等同的。
尽管同C数组很类似,但Brookgpu中的流同C语言中的数组有以下的区别:
1. 在kernels函数外不允许通过下标来获得流元素(例如 s[3][2])。
2. 不允许对流进行静态的初始化,例如:
float s<100>={1.0f,2.0f,....}是不允许的。
3. 流必须是局部变量(堆栈)。
4. 流只能在核心(kernel)函数中被读写或者是通过特殊的运算符从普通的指针和versa 获得数据。
streamRead(s,data_s);
/*用*data_s处的数据对流stream s<>进行赋值*/
streamWrite(s,data_s);
/*用流s<>的数据对*data_s进行赋值*/
尽管这个操作还可能通过编译器进行进一步的优化,但是它向流中进行拷贝已经是十分高效了。
对于GPU编译过的代码,流对应于组织内存(texture memory)的区域。编译器能进行代码流分析来更好地决定什么时候什么地点来分配组织内存(texture memory),或者完全消除流变量需要暂时存储的需要。为了方便起见,brook也扩展C来包括float2,float3和float4作为基本的数据类型。这些类型同C语言中用typedef 的结构(structs)是等价的。例如:
typedef stuct {
float x;
float y;
float z;
float w;
} float4;
另外,这些数据类型能够通过使用构造函数的语法来构造:
float4 a (0.2f,1.0f,3.2f,1.0f); // x=0.2f,y=1.0f ......
核心(kernels)
核心是在流上操作的特殊函数,是应用到每个输入流元素的一种并行函数。在一系列的输入流上调用一个核心函数就在每个流元素上实施了隐含的循环,即对每一个流元素调用核心体。通过GPU带有的核心函数,流被输入进视频存储器,核心函数被编译成由其“渲染”的分段程序。除了在声明核心时,它的前面要加上关键字kernel,核心的定义和函数的定义非常的相似,返回类型通常都是void,并且其中的一个流参数要标记类型限定语'out'。全局内存空间和静态变量在kernels里无法被访问。一个kernel声明的例子如下所示:
kernel void k (float s<>,float3 f, float3 f, float a[10][10], out float o<>)
在这个例子中,输入流s的每一个元素都要调用kernel k的核心体。变量s在kernel体的内部的类型是float,为了每次隐含的调用,s被初始化为一个不同的元素。变量f是kernel中的一个常数,它在每次迭代中保持同一个值。在kernels内部,对输入流或是常数参数进行写操作都是不允许的。
变量a是一个二维数组,它可以通过标准C语言访问数组的方法来访问。a的维数并不需要被指定,然而如果指定了数组的维数,编译器可以更快地产生代码。每一个流都会以数组形式输入到一个核心(kernel)里面。
变量o是一个输出流。输出流是一个只写的参数,它的值由kernel函数体来进行赋值。在kernel体的内部,变量o的类型也是float。s的每一个元素都隐含地执行kernel体,产生输出流o的元素。注意到kernel的原型和函数体都受限于C和C++支持的cg/HLSL的子集。它们包括向量流类型,矩阵类型和标准的库函数。
想获得更多的信息,请参照CG语言规范,网址是:
http://developer.nvidia.com/attach/3722
也可以参照HLSL文档,网址是:
http://msdn.microsoft.com/library/default.asp?url=/library/en- us/directx9_c/directx/graphics/reference/Shaders/HighLevelShaderLanguage.asp
调用一个kernel函数同调用任何C函数类似。
kernel void k(float s<>, float3 f, float a[10][10], out float o<>);
float a<100>;
float b<100>;
float c<10,10>;
streamRead(a, data1);
streamRead(b, data2);
streamRead(c, data3);
// 调用 kernel "k"
k (a, 3.2f, c, b);
streamWrite(b, result);
Reductions(约简)
Brook 提供对流进行并行约简的支持。约简是指将一个流转化为维数更小的流或一个单独的值的操作。这个操作可以由一个单独的,两输入的运算符来定义的,这个运算符必须是可结合的和可交换的。考虑到这个性质,流元素可以被看成是无序的集合,在运算过程中,那些元素可以以任意顺序结合直到产生出约简的结果。
约简函数只支持那些既能结合又能交换的约简。编译器必须能够以任意的顺序来计算约简。例如,计算一个流的和既是可结合的又是可交换的:
a+b+c+d =(a+b)+(c+d)=a+b+c+d
合法约简的例子是求和、相乘、求最大值或最小值、相或、相与、异或等位操作。不合法约简的例子包括减法和相除。我们必须注意的是编译器并不验证约简函数的合法性。所以编程者必须保证约简操作是合法的。声明一个不合法的约简将会导致进入未定义的执行状态。
约简函数的声明同kernel函数的声明类似,都有一些额外的限制。下面是一个约简函数的例子,它计算了一个浮点流的所有元素的和。
void reduce sum (float a<>,reduce float result<>) {
result = result + a;
}
约简函数只能带有两个流参数,一个输入流和一个输出流,输出流前有关键字reduce,其余的参数都不能是流。另外,两个流的类型必须相吻合。为了计算两个值的约简,kernel要允许对约简参数同时进行读和写。
传递到约简kernel的约简参数可以是标量值或是流。如果约简参数是一个标量,所有的流元素都将调用约简函数来产生一个单独的值,这个值被存放在约简变量中。约简的初始值被定义成输入流的第一个值。
多维约简
如果约简的参数是一个流,那么如何进行约简操作将是由输入流的维数和约简输出流维数之间的关系来决定的。
float s<100,200>;
float t;
sum(s, t); // 求s中所有元素的和,结果放在t中
float t<100, 1>;
sum(s, t);
float t<1, 200>;
sum(s, t);
调用约简kernel来约简元素就可以将输入流转换成不同维数的输出流。例如:
float s<100,200>;
float t<50, 20>;
sum(s, t);
在这个例子中,y方向上可以被2整除而x方向上可以被10整除。每生成t的一个元素,s的2×10个元素都要调用执行约简kernel。
如果维数不互相匹配,或是约简的维数比输入流的维数更大,或是输入流的维数不是偶数,都会产生编译的错误。
使用流的形状
为了生成在当今图形硬件上能有效运行的代码,brook for GPUS并没有实现在官方Brook规范说明中大多数流的运算符
(http://merrimac.stanford.edu/brookspec-v0.2.pdf)。但是,当调用kernels和隐式执行流操作时,Brook这种语言利用了输入流和输出流的相对形状。
基于流的形状,运算符streamStride和streamRepeat结合在一起并被隐式地调用。例如:
kernel void foo (float a<>, out float b<>);
float a<10,20>;
float b<50,10>;
foo(a,b);
在这个例子中,输出流b的y方向上比输入流a大5倍,然而输出流b的x方向上只有输入流a的一半大。对于b中的每一个流元素,kernel foo只被调用一次。流a隐式地改变大小来匹配输出流的大小。在这个例子中,在y方向上通过重复元素的方式 (1,1,1,1,1,2,2,2,2,2,3,3,3,3,3....)来使维数增加,而通过在x方向上每隔一个去掉一个元素的方法 (1,3,5,7,9....)来使维数减少。每个输入流都重复上面的操作。数组参数不受影响。
重复流
重复流是一种特殊类型的流,它预先就被初始化为一系列顺序的值(1,2,3,4,...)。创建一个重复流使用iter关键字和运算符:
iter float s<100> = iter(0.0f, 100.0f);
// s被初始化成0.0, 1.0, 2.0, ..., 99.0
iter操作符的第一个参数通常是流的初始值。第二个操作符是流的数值的上限,产生完全相同的形式【初始值,上限】。流元素之间的步长等于(初始值-上限)/流中元素的个数。
iter float s<100> = iter(0.0, 1.0f);
// s: 0.00, 0.01, 0.02, 0.03, ..., 0.99
iter float s<10> = iter(2.0f, 7.0f);
// s: 2.0, 2.5, 3.0, 3.5, ..., 6.5
一维重复流也同时与float2,float3,float4类型一起使用。每一个元素都被单独的插值。
iter float2 s<10> = iter(float2(0, 0), float2(10, 5));
// s: (0,0), (1,0.5), (2,1), ..., (9,4.5)。
目前的编译器只支持一维和二维的重复流。如果流是二维的,流元素的类型必须是float2。在二维的情况下,插值稍稍有些不同。
iter float2 s<4, 4> = iter (float2(0,0), float2(4, 10))
s:
(0, 0) (1, 0) (2, 0) (3, 0)
(0, 2.5) (1, 2.5) (2, 2.5) (3, 2.5)
(0, 5) (1, 5) (2, 5) (3, 5)
(0, 7.5) (1, 7.5) (2, 7.5) (3, 7.5)
流元素的每一个部分都会根据相应维数的最大和最小值进行插值。
目前Brookgpu编译器和运行不支持二维以上的重复流,更进一步地说,如果一个重复流传递进入一个kernel,它的维数必须和输出流的维数相匹配。这些限制可能会在将来发行的版本中取消,目前重复流和数据流并不相同,因此,重复流的参数中必须包含iter这个关键字,而且将重复流做为一个输出结果传进kernel也是不允许的。这些限制可能会在将来发行的版本中改变。
ScatterOp
streamScatterOp(s, index_stream, array,STREAM_SCATTER_ASSIGN);
StreamScatterop运算符执行一个间接的写操作,流s中包含传递给Scatter的数据,索引流(index Stream)中包含在数组中要写入数据的偏移量。第四个参数是执行如下的操作:将新来的数据同已经保存在数组中的数据结合起来,这个参数可以是一个约简函数,或是枚举函数的一个组成部分,例如STREAM_SCATTER_ASSIGN执行一个将流数据直接写入数组的写操作。
GatherOp
streamGatherOp(t, index_stream, array, STREAM_GATHER_FETCH);
streamGatherOp执行一个数组上间接的读操作。它通过使用索引流来生成一个取值的流(t)。如果数组是多维的,索引流提供一个在数组内的线性偏移(基于C语言数组的列优先排列)。
第四个参数可以是任何kernel函数,这个函数包含一个单独的输出流或是一个预定义的操作符。STREAM_GATHER_FETCH参数指出Gather操作仅仅读取值并将这个值放入流中就行了。
|