目录
使用远程桌面时,被控端的画面经过编码后,需要通过网络传送到主控端。
以我们熟悉的快递举例,快递发出后,要经过站点集散中转、道路运输,最终才能送到目的地。不管是道路的拥堵,还是站点货物的积压,都会使得快递晚到。
同理,远程桌面的传输也面临着网络线路拥堵、路由节点数据积压等诸多难题,导致端到端延时大幅提高。
为提高网络传输的质量,OTT SD-WAN技术应运而生,它就像是我们手机里的“行车导航”,实时探测所有节点的网络质量并选择最优传输路线。本篇就将深度拆解Zuler OTT SD-WAN。

OTT SD-WAN(Over-The-Top Software-Defined WAN),即顶层软件定义广域网。
广域网,是指覆盖较大范围的网络,比如全国、全球的网络。而在某一区域(如家庭、学校、工厂)内多台计算机互联成为的计算机组则为局域网。
软件定义,是指我们通过软件来管理这个超大网络上的数据传输。全球有大量的运营商,不同运营商网络之间一直缺乏信息交流和统一管理。OTT SD-WAN 就是在运营商网络之上搭建一个统一平台,解决应用层的互联互通问题。

运营商网络本身不具备全局视野,每个路由器只能基于局部信息尽力传输。这种方式就像开车没有导航,只能看着沿途的路牌走,无法避开前方拥堵和事故路段。
SD-WAN则给网络带来了“智能导航”,能够提前发现拥堵路段、自动规划最优路线,保障传输的高速稳定。
此外,SD-WAN的“转控分离”架构还能降低网络的处理延时:网络机房负责转发,控制机房负责线路规划和资源调配。二者分工明确,把各自的硬件效率最大化,共同实现更低延迟。

除了速度,远程桌面的网络传输更要追求稳定。网络波动带来的抖动和丢包会造成卡顿和画质损坏,严重影响操作连贯性。
SD-WAN能够实时探测全域网络的延时、丢包和抖动情况,主动绕开不稳定线路,从源头上规避网络抖动与丢包。即使遇到突发波动,也可以实现毫秒级的快速线路切换,把网络波动的影响降到最低。
SD-WAN和网络优化是一项高度复杂的系统性工程,既需要大规模组网技术,又需要海量数据训练和实战经验积累。
ToDesk团队具备4亿月活规模、超10年的全球网络优化经验,将全球领先的SD-WAN服务引入远程桌面,实现全球任意两个节点间网络延时不超过120ms,终端到边缘节点延时不超过10ms。
要实现有效调度,首先就要有足够多的节点机房。ToDesk目前在全国部署的机房数量已经超过200个,覆盖密度远高于传统远控厂商。
此外,ToDesk SD-WAN采用“核心-中层-边缘”三层组网架构,信息高效共享,且骨干节点间专线直连,进一步降低传输延时。

ToDesk SD-WAN依托覆盖全国的节点机房和千万级在线终端,可以精准感知全国网络状况。
节点之间的骨干线路好比“高速公路”,从用户终端到节点的接入线路好比“最后一公里”。网络质量探测对二者都要兼顾,才能确保全程畅通。
– 对于接入线路,在线终端会定时向节点机房发送探测信号,并选出最快速的接入点,确保数据顺畅进入骨干线路。
– 对于骨干线路,节点之间会互通彼此之间的线路状况,并把信息汇总到SD-WAN控制系统,获得网络质量的全局感知。

基于实时探测到的信息,ToDesk SD-WAN进行全局计算,选出最佳接入节点和最佳转发路线。
计算过程基于QoE(Quality of Experience)算法,对丢包、延时、抖动等大量指标进行优化平衡。当用户选择不同的流畅度、还原度、资源占用配置时,算法结果也会发生相应变化。

相较传统路由系统的局部路线选择,SD-WAN站得更高,看得更远,不会因为眼前的路好走而陷入前方的拥堵。规划好路线后,SD-WAN会在数据包出发的第一时间就给它带上“导航”指令,每到一个节点都会按指令走向下一个节点,直至终端。
ToDesk开发了基于最新SRv6的高效IP承载协议,解决了传统IP承载网的孤岛问题,协议结构更精简,解析和转发更迅速。
就像快递在集散中心分拣要花时间一样,数据包在机房转发时也有处理时间。如果处理不及时,还会增加数据包的排队时间。

为了提升转发速度,ToDesk在SD-WAN机房中采用了自研的用户态网络转发协议栈,能从两个方面提升处理速度:
相比于传统机房的Linux内核级转发,ToDesk的用户态转发速度提升5~6倍,单次转发用时低于1ms。
基于实时探测到的网络情况,对负载较高的网络线路进行智能分流,提前预防网络拥塞的出现,维持系统整体的稳定通畅。
—————————————————
SD-WAN网络和视频编解码技术共同奠定了ToDesk优质体验的基础。ToDesk还将RTC实时传输技术应用到远程桌面传输中,不断拔高低延时、无卡顿的极致用户体验。
下一期,我们将深度拆解RTC技术,一起聊聊远控业内首创的ToDesk RTC引擎带来的全新变革。
敬请期待!
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or