原文:FIXING THE INTERNET FOR REAL TIME APPLICATIONS: PART II
译者:NStal
在上一篇博客里, 我提到了为什么现在的互联网网络环境对英雄联盟这样的实时应用很糟糕,以及延时和丢包是如何降低实时游戏的体验的。那么很自然的,下一个问题就是: "我说Peyton啊,那我们该怎么办?"
答案是简单又让人兴奋的: 我们打造自己的专属互联网就好啦。在你说这是白日梦之前,先让我再重新介绍一下我之前博客里面提到的互联网构架。整个互联网不是一个某个个体所管理,独立统一的系统,而是由多个组织聚合体来共同管理的。当你玩LOL的时候,数据从Riot的服务器传送到主干网络(比如Level 3,Zayo 和 Cogent),然后到ISP公司(比如Comcast,AT&T,Time Warner Cable和 Verizon) 最后到达你设置的目的地(拨号器,路由器,用户电脑),并且返回。
我们并不是第一个企图改造互联网网络的团队; Google已经公开的在美国的好几个社区里铺设了光纤。但是Google的重点放在通向家庭的光缆,我们则更关心如何像那些主干网络公司一样去创建网络。这能让我们在离玩家最近的地方得到玩家的数据并放到我们的网络里去──一个有更少路由器(和其他设备)的网络,这样丢包和其他的糟糕体验就会少的多。
总的来说我们要做的事情就是把这样的东西:
变成这样的:
挺简单的,是吧? 恩,不 ── 我们至少花了一年的努力来完成这件事情。为了让我们的服务器连上ISP,首先我们得买很多路由器,在数十个美国最大的数据中心租位置来放这些路由器(一般来说,我们管这些地方叫场地托管,等会再细谈),租用Dark fibre(暗光纤 预先建设但还没被使用的光纤)和Optical Wavelength Service(OWS 一种把并行数据分布在不同波长防止数据干扰,共享链路,从而增大光纤带宽和稳定性的服务)来连接那些路由器,最后联通所有我们能搞定的ISP。
在这篇文章里,我会进一步阐述我们是如何跟ISP们一同合作来纠正一些网络标准的,也会顺便分享一些成果。
路由器,托管,暗光纤,天啊
第一步,买路由器。这很简单。我们得在数据中心有地方给他们安家。 托管场地,有时候也叫做"中继器旅馆",指的是一种大型的建筑,能够给网络运行提供空间和能源。许多运营商都会在同一个地方设有入口,这种"扎堆"的方式让他们可以轻松的与对方互联。比如,我们在Zaya在纽约的托管场地也放了设备,这样我们就能联通那个建筑里所有的ISP了。
尽管多个网络运营商能让我们能同时连接他们,但做起来并不容易。每一个连接都需要复杂的物理设备的部署以及非常复杂的理论研究。比如,以我们之前提到的在纽约的入网点(PoP)为例子,那里 Zayo,Telx,Equinix(还有很多),都有他们的入口。与他们连接需要购买Telx和Equinix的服务,所以我们的光纤会在相关的Meet Me Rooms(托管中心的数据交换点)的Patch Panel(跳线器)离会合,我们还会让我们的设备从Zayo那儿得到Cross-Connect(不同运营商机组之间的通信)的能力。这些事情几乎要做一辈子。
我进行了一系列的背景调查,来找到最快的光纤路由,找到最好的托管场地,能够和最多的ISP相连,并且确保有Internet Exchanges(IXs,互联网数据交换)功能来进一步和更多的ISP相连。当我们在托管空间里安置和连接好了我们的路由器之后,我们还需要让那些在不同的国家的路由器相连。为了做到这件事情,我们得在每个托管点之间找到暗光纤或OWS服务。我们联系了很多公司,获取了他们的路由器信息,并且物理比较了每一个路由器。我们曾经见识过同样的地点间,一家公司的光纤路由比另一家公司的长三倍。
另外一个复杂的问题是,这些设备很可能负担过重。当我们调研从芝加哥到洛杉矶途径西雅图的路由时,我们发现路由使用了从芝加哥到西雅图的同一片设备。同时使用这两个路由方案会导致这个系统的一个单点故障 ── 如果西雅图的路由器下线了,会导致很多LoL的玩家难过。我们明白我们还得不断的寻找从芝加哥到洛杉矶的连接方案。
即使上面所有的东西都搞定了,我们还得跟那些玩家直接接入的ISP,进行长期的沟通。整个过程耗时耗力 - 一个简单的合同要花上8个月才能落地,我也是醉了── 不过我不会在这里讲这些无聊的细节。
为什么不让这些事情简单些?
考虑到我刚才描绘的那些困难重重,你也许会问,我们为什么不干脆跟AT&T,Comcast或者Level3这样的大型网络中继商签订合同,让他们帮我们搞定这些事情? 原因很简单,我们试过了,但不管用。很不幸,他们的商业模型让我们的需求很难被满足。ISP们搭建的网络更多的是公共数据传输,来尽可能的承载更多的流量。减少过程中的路由器会减少延时(对,为了LoL玩家), 但是这也会减少他们能服务的用户的数量。ISPs是根据他们的合作伙伴的需求来建立网络的,这意味着承载量的大小是根据运营商之间的关系来决定的,而不是为了优化某一类程序。
因此,打个比方,如果AT&T是我们的网络提供商,他们不会直接跟Comcast建立直接连接来让我们离Comcast的玩家更近,因为他们不是合作伙伴。他们也不会为了我们而移除中间的任何路由器来让网络变得更有效率。他们的目标站在他们的立场上来看是合理的,就像我们的要求站在我们的立场上一样,只是很遗憾双方立场相悖。我们希望让玩家的连接尽可能的快,不管玩家到底是在用哪家的网络服务,所以我们创建了一个"中立"的组织来连接所有的网络。
不仅如此,没有任何网络中继商(类似Zayo,Level 3 或 Cogent)的物理设施符合我们的需求。打个比方,想象两个中继X和Y都连接了纽约和芝加哥,而且中继X的速度更快。然而,中继X并没有连接芝加哥和西雅图,但是中继Y连接了。因此,没有哪家公司能给我们符合要求的主干网络服务。为了给玩家提供最好的游戏体验,我们需要和两家中继服务签订合约,来共同打造最好的网络。
建立标准
建立我们的主干网络只是我们一部分的工作(尽管是主要的),我们有一个更大的目标,那就是把目前的互联网优化到满足实时游戏的需求。除开物理和合同问题,我们还有许多技术挑战要克服。除了需要连接ISP们,我们还需要和他们合作一同找出那些过去互联网标准中的最佳实践。
这些标准规定了互联网流量该如何传输,并且很久没更新过了 ── 它们仍然很好的满足了多种类型的流量需求,但是不包括我们这种实时无缓存应用的需求。特别是互联网的标准路由协议,Border Gateway Protocol (BGP),让我们非常头疼。我们希望流量使用最优路径,而不是任何路径。然而BGP是为了商用路由而定制的。换句话来说,BGP认为互联网模型很简单: 如何把流量从一个网络拥有者,也叫Autonomous System(AS),传输给另一个。可是大部分的ISP在构建静态路由的时候都没很好的的优化BGP。
我们来讨论一个常用的BGP概念"会话年龄",用来描述某个路由被用了多久。想象有两个路由在Riot和某个ISP之间: 一条快速的路由A和一条慢速的路由B。如果A路由下线了,那么流量会转移到B路由──这当然是个合理的变化,因为它是此时最好的路由。问题是,如果A路由再次上线,ISP还是会继续使用B路由,仅仅是因为它被使用了更久,因此就更倾向于使用它。这一切都是协议的默认表现,对那些有大量节点的ISP来说,这比重新选择一个更好地的路由要轻松的多。因此我们必须使用一些临时方案,比如让路由B下线,来刻意的让流量回到链路由A。
在类似会话年龄这样的问题上,我们必须开始考虑应该如何接受和分发流量。在大部分情况下,ISP会基于一个地理位置,这种情况很简单。 对于那些分布在不同大陆上的ISP,我们就得联通不同的位置。比如,以Comcast为例,他们在整个国家都有路由器分布。如果我们只在芝加哥连接他们,那么玩家的流量在Comcast的入口,比如波士顿,会一直在他们的网络上直到芝加哥,绕过了我们辛辛苦苦建立的主干网络。为了解决这个问题,我们在Comcast数个地点都有接入,打造了我们主干网络的数个接入点。当我们连接Comcast莫个区域的路由器节点之后,所有从那个区域接入的Comcast流量都会直接进入我们的网络。
这里还有一个附加问题,那就是处理发往别处的流量。当BGP处理大量的数据在AS之间的传输时,他的默认状态时寻找"最近"的出口。换句话说,BGP允许流量从最好的入口进入我们的数据中心,但是它会为所有流量选择统一的出口,而不是为每个不同方向的流量选择最好的。
比如说,当我们刚建立我们的主干网络的时候,我们接入了一个位于波特兰和芝加哥的ISP。芝加哥的玩家会通过芝加哥节点进入我们的网络,当我们发送回程的流量时,它会沿着它来的路径沿路返回。然而,当波特兰的玩家从波特兰的入口进入我们的网络时,我们送出的流量还是会从芝加哥出去,而不是波特兰。会这样是因为当ISP路由节点从波特兰引导流量时,到我们的AS(6507)的最快路径入口就是在波特兰,然而当我们的服务器发送回程流量时,BGP计算出逻辑上到ISP的AS的最快路径还是从芝加哥出去。我们必须和ISP一起协作,通过使用BGP Communities或者MED对流量进行标记,来解决这个问题。这些技术让我们能够定制回程流量的规则。
上面说的这些东西的工作量可是大得很! 而且很遗憾的是,并不是所有的ISP都支持这些工作──尽管我们直接接入了一个ISP,玩家们还是无法有最好的体验。
但结果很好
根据我之前所描述的种种问题,你可能觉得我们的这次尝试可能注定会失败。然而,我们每个阶段都稳步慢行,最后的结果也是很好的。基于我们在北美所作的这一切,我们实际上构建了这块大陆上最快的网络。而且通过我们在这当中学习到的经验,我们还能大幅的改进我们所构建的网络。
但最终的效果还是要根据玩家的体验来决定。我们进行判断的一个标准是,有多少玩家游戏时的ping值在80ms以下。在我们移动到芝加哥之前,短短的9个月内我们把这个比例从31%提升到了50%,因为我们直接接入了ISP来让流量直接发送到Riot。你可以看到整个提升的过程:
这不表示所有的玩家都体验到了更好的服务,但是总的来说更多的LoL玩家有了更短的ping。当我们完成了游戏服务器到芝加哥的迁移之后,整个结果更好了。我们一夜之间把这个比例从50%提升到了80%! 在玩家体验上,我们达到了我们的内部目标。
我们还会持续集成ISP和中继点,来让玩家的整个体验变得更好,而且我们实际上在全世界范围内在做这件事情! 我们实际上已经在除了南极和非洲以外的所有的大陆都部署了这样的网络。
我们非常高兴能够持续的在世界范围内提高玩家的体验,当然我们还有很多可以做的东西。我们坚信游戏值得拥有他们的专属网络。这个系列文章的下一篇,我们会介绍一下那些在研究和构建网游环境时用到的那些新技术。