包处理的艺术(1)-从大自然中学习
这是一个系列,关于Packet Processing的思考。我通常会半开玩笑的说,网络的创新是最容易做的,因为反正自己定义一个包格式处理着玩就行了,然后搞不定就说行业巨头拉帮结派就好了。
事实上,这是一门艺术
,很少有人精通的艺术。
在某司
十多年
做过运营商做过
企业网,做过无线,也做过语音,
做过
路由器,
也在上面搞
了大量安全的功能,
基本上常见
的
包处理需求都
门清了,才有一点点的
能力来写这个。
这个系列大概的提纲如下:
-
从大自然中学习
-
控制面协议设计
-
RTC vs Pipeline
-
RTC设计细节
-
Pipeline设计细节
-
报文编码的艺术
-
关于NPU和智能网卡芯片设计的思考
第一篇只是一个序,开个头说点最简单的事,先从大自然中学习说起,最根本的原因就是给读者一个判断技术路线对错的最根本的方式.
大概在2009年IETF主席Fred Baker有一个讲座介绍IETF的时候是这么说的:
在IETF组织产生以前,所有的通信都是在电路交换方式下进行的。在电话网中,每两点之间都有一条固定的通路,这条电路实际上就像一个管道,管道内承载的是电话信息,只要管道没有问题,沿着管道就一定能将电话信息送抵目的地。打个简单的比方,就好像在北京到上海之间只有一条道路,如果有几辆卡车需要从北京到上海,那么沿着这条路走就能一直到达上海。但是如果在这条公路上有一处断裂的话,那么卡车显然就无法到达目的地了。怎样解决这一问题呢?KlemRock博士有一天突发奇想,我们为什么不能在这两点之间建立一个网络来取代惟一的一条固定通路呢?这就好像在北京到上海之间修建一个公路网,如果其中的一条路断掉的话,那么熟悉这个公路网的卡车司机就会自动地寻找出另一条通路到达目的地。这也就是所谓的分组交换。分组交换和电路交换相比而言,每一个分组承载的信息更多。如果仍将分组比作卡车,就意味着在分组交换中卡车司机的头脑中要有更多的智慧,因为他需要在网络中去寻找通路。 |
互联网的基石就是在分组交换的基础上进行的,而一开始就是借鉴大自然的法则,公路系统经过百年的演化,有太多值得我们学习和借鉴的地方。只是魔幻的世界里,总有一些人不尊重大自然的选择。IPv9和十进制网络的荒唐事暂且不说,先来看其它几个事情。
1. ATM的教训ATM以路为中心,设计了精巧严密的方案,可控性和可管理性都非常优秀,但是通信网络本身的复杂度非常高,而通信终端相对简单。而IP网络设计的思路则是以车为中心,承认通信网络本身的不可靠,把通信中的大量工作交给了车(终端)来运行。
其实本质上还是两种思维的冲突,做通信的人在其历史演化的过程中,电路交换的思维模式在那里,给终端链路编码,信令建立链路然后构建核心网的思维演进诞生了ATM。本质上是一个Complex Core +Dummy Client的实现方式。这样的方式在诞生初期没人会认为它是错的,因为以前电话网不就是这么设计的么?
IP网络设计的原则却是截然相反的,intelligence Edge+ Dummy Core的思维方式,把尽量多的工作放在边缘去做,核心只需要傻和快就行了,这种思维方式也有它内在的原因。通常在那个年代终端计算机的CPU处理能力远超它的接入路由器,时至今日也是如此。多做一点并没什么不好的。
两种思维方式在特定的年代都有自己行业发展的延续,看上去都是对的,最终为什么ATM失败了呢?因为选择对错的是自然界的规律,人总是喜欢价格便宜量又足的东西:)
2. 重蹈覆辙的OpenFlow和SDN
但是
魔幻的故事又继续的发生着,总有人把逆自然规律的事情叫做创新。OpenFlow又一次把电路交换随路编程的事情弄出来了,同样也是做通信的人,也是在特定的年代做了看上去对的事情,控制平面复杂控制协议众多,一致性难以保证,于是搞个控制器集中管理吧。
最后搞了十年的SDN,网络设备的控制处理器越来越强大了,真是莫大的讽刺…最本质的原因就是大自然的规律又一次被破坏掉了,独裁在一些小的区域会有效,但是对于一个大规模的网络,它的Scale和配置速度都会成为瓶颈。时至今日,延续SDN思维构建SDWAN的厂商还在不停的犯错,本质原因就是你违背了大自然的规律,
社会的演化规律决定了相应的管理体制,有些管理体制在小规模的群体中会有其独特的效率,但是大了可能还是需要MZ制度,多从自然社会的体制中思考,或许你就能看到答案,而不必在错误的技术上投入太多的精力。
3. SR为什么会成功,SRv6为什么注定会失败SR的成功也来自于对大自然的借鉴,Clarence自己也说过,大概是有一次要去罗马开会,开车要做路径规划的时候诞生了这样一个想法,买机票的故事和行李牌的标签故事大家都听过就不多说了。所以SR关键中转点不会太多,最多两三个就好了。
但是为什么同样借助SR实施的SRv6会注定失败呢?因为大家又对它有了更多不切实际的期望,多跳严格路径TE是否真的需要?SFC是否有其它更好的解决方式,生搬硬凑搞出来的128bit标签数量到底要多少?本质上就像你要从上海证交所去纽约证交所,非要把地铁票公交票飞机票全部贴在行李箱上,为了统一连地铁票上都要写着
“地球.亚洲.中国.上海.浦东::陆家嘴.X -> 地球.亚洲.中国.上海.浦东::浦东机场.T2“,
这不没事找事么?当然还有更多的人说,地址长了没事,我给你压缩就好了呀,这又来了
“压缩冗余前缀、二维指针定位、G-SID拼接、多种SID混编等创新技术,在支持现有SRv6所有特性的前提下,能将包头开销压缩4倍”,好棒啊~你是压缩一时爽,你见过有谁用一张机票,每到一个检票口都改签的么?而且还要让人家读那种根本就读不懂的,为啥不拿二进制编码搞个二维码的可视化的IP头,每个包来了,先把bit流渲染成NxN的矩阵1代表染黑,然后这个矩阵构成二维码再图像扫描识别好了以后做决策啊,多牛逼啊,还能抗住误码的影响~
任何的编码不光要考虑自身的压缩有效性,还要考虑包处理器如何高效处理,运维时人如何有效阅读和排错。
4. 技术没有新旧,适者生存很多人总是不停的追逐着新的技术,总觉得新的技术牛逼,我不上SDN,我不上SDWAN我就要死了那种。其实每一种技术都有它合适的场景,有些客户就为了解决数据中心二层打通的问题可能OTV就够了,真没必要去BGP-EVPN+VXLAN搞那么复杂。正好上周做了一个OTV的case,OTV负载均衡根据奇偶VLAN做的,客户需要动态的调度和再平衡怎么做?有同事说让客户改VLAN,还有说做VLAN Mapping的,其实很多时候你从用户运维的角度考虑都会非常麻烦,最后我慢悠悠的建议OTV的ASR1000和后面的交换机之间起用一个Q-in-Q就好了,外面再套一个VLAN头骗ASR1000做奇偶,内层VLAN又可以指示客户业务,而且这个Q-in-Q多的标签只在ASR1000和数据中心交换机之间的LAN侧,传到广域网上还会剥离掉。
你们看看,这就是一个典型的例子,
不用要求研发做新的LoadBalance算法,用一个大家认为“老掉牙”的功能
就轻松的解决问题。
任何技术都有它适应的场景,生搬硬套过度追新的结果通常会死的很惨。技术上千万不能去超越自然的规律,认为一个技术好就哪儿都想用,或者认为一个技术过时了就各种排斥。
5. 多从现实中观察,从历史中多学习我一直跟同事们说设计协议是一个非常痛苦的过程,但很多人都不信,看到别人的工作不仔细思考,只会说:“不就是把xxx信息放到某个Header里么?”,网络简单,因为谁都可以编码,网络难,因为大多数人不会有效的编码。双十一期间,好几个云上的朋友都在问我DDoS清洗的事情。怎么看待这个事情呢,我们不妨看看现实社会中是如何实现的?当一堆人涌入火车站的时候,最有效的办法是什么?查票查身份证啊~,有效的过就好了。面对DDoS攻击最困难的就是来的包没有身份证还大多数都是加了密的工作证,工作证格式还不一样…如果大家都有标准的票和身份证不就好了么?这就是一个编码策略了,应用可以用一个JSON或者Cookie随意的在包里放置,但是网络如果要处理大量的数据包则是意见很麻烦的事情,
如果有一个固定的ID字段,对于网络追踪NPM和应用APM以及安全策略加载都会有好处。所以对应于DDoS攻击的实践,我会通常建议客户在协议头固定位置带上一个字段,这个字段可以是网络边界的网关产生一批OneTimePassword作为Ticket上传到ETCD中,终端可以在ETCD中申请并使用OTP出发网络边界网关打开Pinghole的方式,你看这样不就跟我们春运的时候很像了么,12306上根据开行列车生成票,乘客买票上车。常见的可编程Switch也非常容易实现1Tbps以上的检票功能,TCP Payload或者UDP Payload中构建一些固定Offset的字段供交换机Parse,处理完了销毁自己分发的Ticket,放行报文的源IP和源端口,这些对于挂载HBM的Silicon One是非常容易实现的,或者即便是用X86 NFV也可以很好的实现,所以这也是我在Ruta协议中包头定义FlowID字段的原因,就是这个用途。所以我们的运营商面对服务化网络,其实本质上把自己想成一个铁路公司或者航空公司,自然就知道正确的运营模式了,卖不同的票就好:)
其实我们生活中有很多很好的例子可以供我们借鉴思考,多观察就会看到那些反人类的设计有多么荒唐,多把一些抽像的技术带入到现实生活中来,你就能评判它的对错了,自然也就不会在技术路线上犯错了。历史的变革和社会的发展也会看到很多有趣的变化,以史为鉴方能知更替,有兴趣可以看看包处理的历史。
网络的本质其实就是快速,可靠,安全,可控,便捷,便宜的通信,无论哪个厂商设计产品,其实都是在这几个方向上做trade off,不同的时代,有着不同的软硬件选择,但人们常常因为知识受限和对客户使用场景的把握不够,做出错误的选择,或者是过分强调软件, 或者是过分优化硬件,其实从历史的长河来看,这只是一个反复迭代的过程,只希望这小小的一文能给一些在十字路口做决策的人一点点帮助
zartbot.Net,公众号:zartbot“网络编程” 还是 “可编程网络”?
另外一点建议就是做通信的人大胆的去看看应用的变革,毕竟网络最终还是一个以应用为中心的承载面,我做过网页前端,也写过AI算法,也做过流处理引擎,每做一块时都会劝自己,哪有一个人把什么活都干了的,但是你不了解这些,设计东西的时候就会犯错,顾此失彼。多一些了解自然能够明白更多的意义,那种点连成线的感觉真的非常奇妙:
《包处理的艺术(1)-从大自然中学习》来自互联网,仅为收藏学习,如侵权请联系删除。本文URL:http://www.bookhoes.com/2068.html