摘要

本白皮书提议OpenFlow:一种供研究者在日常使用的网络上运行其实验性协议的方法。OpenFlow基于以太网交换机,增加一个内部流表,以及用来增、删流表中流表项的接口。我们的目标是促进网络生产商将OpenFlow添加到他们的交换机产品中,并部署在校园主干网及配线间。我们相信,OpenFlow是一种务实的妥协:一方面,它允许研究者以统一的方式,在由各种异构交换机组成的网络上运行其实验,以获得一个高线速、高端口密集度的实验环境。另一方面,生产商无需暴露交换机的内部工作。除了允许研究者在真实的网络流量中评估其想法,OpenFlow还能在已经发起的大规模实验平台例如GENI中充当有用的组件。很快,斯坦福大学的两栋建筑将会使用商用交换机及路由器运行OpenFlow网络,同时,我们会努力促进其它学校及个人在大学网络中部署OpenFlow。

一、可编程网络的必要性

在我们的商务、家庭、学校中,网络已经成为关键基础设备的一部分。这种成功对于网络研究人员来说,既是祝福也是诅咒。他们的工作更加贴近现实,但对现实网络施加影响的机会却变得渺茫。网络创新对真实世界影响的降低,是因为巨量已安装的设备与协议,以及对在真实流量中展开实验的不情愿,由此导致对于网络创新的高准入门槛。目前,对于新网络协议(例如各种路由协议、IP替代协议等),几乎没有现实可行的方法使其能够在足够真实的环境中被验证,以便获取大规模部署所必需的信心,结果导致很多网络研究社区提出的新想法无法被充分的实验与测试。因此,人们普遍相信,网络基础设施已经僵化。

基于对此问题的认识,一些网络社区正在努力研发可编程网络,例如GENI,一个研究新型网络架构与分布式系统的机构。可编程网络倡导可编程交换机、路由器(使用虚拟化技术实现),能够同时处理属于多个相互隔离的不同实验网络的包。例如,在GENI中设想如下场景:将整个网络资源的一个“分片”分配给某个研究者,“分片”由网络中部分链路、包处理节点(例如路由器)、终端主机组成。通过编程研,研究者按自己意愿控制分片的行为。一个“分片”可贯穿主干网、接入网、校园网、实验室、配线间、无线网、传感器网等。

虚拟化可编程网络可以降低新想法付诸实践的门槛,增加网络基础设备的创新变革速度。但此计划庞大且代价高昂,在数年内很难完成部署。

本白皮书专注于短期、迫在眉睫的问题:作为研究者,如何在校园网络中开展实验?如果能找到解决方法,我们将快速推广此技术致其它校园,进而惠及整个社区。

为了迎接这个挑战,有几个问题需要回答,包括:在早期,校园网管理员如何舒适平滑的将实验设备(交换机、路由器、接入点等)加入到他们的网络?如何使研究者通过一种方法控制本地网络的一部分,同时又不影响依赖于此网络的其它人?确切的说,网络交换机需要那些功能来保证实验的展开?我们在这里的目标是提出一种交换机的新特性,允许将“可编程化”扩展致大学校园的配线间。

一种方法,我们不会采纳。说服商用网络设备的知名生产商,在其路由器、交换机中提供一个开放、可编程、虚拟化的平台,研究者可在其上实验新协议,而网络管理员大可放心不会受到影响。这个成果几乎不可能在短期内达成。典型商用交换机、路由器不提供开放软件平台,更不必说虚拟化他们硬件、软件的方法。真实商用网络的标准对外接口很窄(如,只是转发包),交换机内部构件的所有灵活性被隐藏。不同生厂商之间的内部构件各不相同,没有标准的平台供研究者实验他们的新想法。生厂商对于开放内部接口的顾虑是可以理解的。一方面他们当然不希望将自己花费数年时间研究部署的新协议、算法暴露在外。另一方面,他们担心新的实验可能会导致整个网络的崩溃。当然,开放的平台也会降低新竞争者加入的门槛。

数个开放软件平台已经出现,但不能满足我们对转发速率与端口密集度的需求。最简单的例子是带有数个网络接口卡及操作系统的PC。包可以在PC的网络接口卡之间路由,开源软件实现了现存的所有标准网络协议,在大多数情况下,通过多种方法修改操作系统对包的处理是可行的。当然了,问题是性能。PC达不到实验所需的每台设备的端口密度(每台100个端口)及数据转发速率(每秒100G),并且两者在性能上的差距日益变大。

现存的具备线速处理专用硬件的平台,不太适合应用于大学的配线间。例如,华盛顿大学正在进行的SuperCharged PlanetLab Platform项目,它是基于ATCA的虚拟化、可编程路由器,可以使用网络处理器线速处理来自很多接口的包。这种方法长远看是可期待的,但其暂时以大型交换中心为目标并且在校园配线间广泛部署过于昂贵。另一个极端是NetFPGA,其专注于教学与研究实验室。NetFPGA是一种低成本的PCI卡,拥有一个可编程的FPGA用来处理包,以及四个千兆以太网卡,所不并不值得在校园配线间部署。

由此看来,商业解决方案过于封闭、刻板,不是性能不足就是成本太高。包含完整一般性的实验网络的解决方案,看起来不太可能克服其在性能及本成方面的限制。更加可行的方法是在一般性上的妥协以及某种程度上更加灵活的交换机,它们是:

  • 可接受的高性能、低成本
  • 支持广泛研究的能力
  • 确保隔离实验与商用流量
  • 符合生产商的封闭需求

本文描述的OpenFlow交换机规范,是对满足以上四个目标的初步尝试。

二、OpenFlow交换机

基本想法很简单,我们利用了一个事实,那就是大部分现代交换机、路由器都包含流表(一般由TCAM创建),流表线速运行,实现防火墙、NAT、OoS以及收集统计信息的功能。虽然不同生产商的流表有所区别,但是我们已经从很多交换机、路由器中识别出一个有趣的共同功能集合,而OpenFlow就利用了这个共同功能集合。

OpenFlow提供一个开放的协议,以便对不同交换机与路由器中的流表编程。网络管理员负责划分全部流量中的商用流及实验流。研究者可以控制属于他的包,为其指定路由、对接收到的包进行处理等。在这种方法中,研究者可以试验新的路由协议、安全模块、寻址方案,甚至是IP协议的替代品。在同一个网络中,商业流量仍然按原来的方式处理。

OpenFlow交换机中的数据通路由一个流表,以及流表中流表项的关联“行为”组成。流表项的“行为”可扩展,但接下来我们描述的是对所有交换机的最小要求。为了达成高性能低成本的目标,数据通路必需仔细描述但又不失一定程度的灵活性。这意味着放弃对每个数据包进行特定控制的能力,转而寻求一种受到更多限制,但是仍然有用的、一定范围内的“行为”。因此,本文接下来的部分,为每个OpenFlow交换机定义了一个必需的基本“行为”集合。

OpenFlow交换机至少由三部分级成:(1)一个流表,其中包含每个流的“行为”,告诉交换机如何处理这个流。(2)一个连接交换机与远程控制器的安全通道,用来在两者之间传输命令与数据包。(3)OpenFlow协议,交换机与远程控制器之间通信的开放标准。通过此协议,交换机流表中的流表项可以在外部被定义,从而避免研究者对交换机编程。

很有必要对交换机进行分类,一种是OpenFlow专用交换机,不支持标准的二层、三层网络处理。另一种是OpenFlow通用交换机,支持标准的二层、三层网络处理,同时具备OpenFlow的新特性。

OpenFlow专用交换机。在此场景下交换机是一个哑的数据通路,仅仅按远程控制器的定义在端口之间转发数据,包的转发完全由控制器决定,如图一所示。


           图一
在此场景下,流的定义是宽泛的,并且只受限于流表的特定实现及其能力。例如一个流可能是一个TCP链接,或者所有来自特定MAC地址、IP地址的包。也可能是所有相同VLAN标签的包,或者是来自同一交换机端口的包。对于试验中涉及到的非IPv4包,流可以被定义成与某种特定的头部(非标准)匹配的所有包。

每条流表项有一个与之关联的简单行为,以下是三个最基本的(所有OpenFlow交换机必需支持):

  1. 转发流的数据包到一个或者多个端口,允许此流通过网络。在多数交换机中,转发是线速的。
  2. 封装并转发此流的数据包到控制器,数据包首先被投递到安全通道,在这里被封装并最终发送给控制器。典型应用是某个流的第一个包,控制器可以决定是否将此流添加到流表中。或者是在某些实验中,此行为可能被用来将所有数据包都转发给控制器进行处理。
  3. 丢弃流的数据包,主要出于安全目的。如遏制拒绝服务攻击,减少来自于终端的伪广播发现流量。

流表中的每条流表项包含三个字段:(1)头部:定义流。(2)行为,定义如何处理流的包。(3)统计,追踪流中包的数量及字节数,以及最后一个包与流表项匹配的时间(以便于排除非活跃流)。

在第一代“Type 0”交换机中,流表项头部是一个10元组,如下表一所示。

            表一
可以用全部的10个字段指定一个TCP流,而一个IP流的定义应该不需要转发端口。流表项头部中的每个字段都可以通配从而允许流的聚合。例如,只定义VLAN ID一个字段代表属于此特定VLAN的所有流量。

有关OpenFlow交换机的详细要求在《OpenFlow Switch Specification》中定义。

OpenFlow通用交换机。一些商用交换机、路由器、接入点设备通过添加对流表、安全通道、OpenFlow协议的支持进行功能强化,从而具备OpenFlow新特性(第五章节列出一些示例)。典型情况下,流表将会重用已有的硬件如TCAM,安全通道与OpenFlow协议转移到设备的操作系统中实现并运行。下图二展示了一个网络的OpenFlow通用交换机与接入点。

             图二
本例中,所有的流表由同一控制器管理。当然,OpenFlow协议允许一个交换机被多个控制器管理,以提高性能与鲁棒性。

我们的目标,是使实验能够在已有的商用网络中展开,并能够与网络中常规的流量以及应用并行。为了赢得网络管理员的信任,OpenFlow通用交换机必需隔离实验流量,而商用流量依然由路由器的标准二层、三层协议管道处理。有两种方法实现隔离。一种是增加第四种“行为”:
    4.转发流量包到交换机的常规处理管道。
另一种方法是为商用流量与实验流量分别定义VLAN集合。两种方法都允许将商用流量隔离出来并按交换机的常规方式处理。要求所有OpenFlow通用交换机必需支持两种方法中的一种或者两种都支持。

额外特性。如果支持上文提到的流表项头部格式与四种基本行为,则称其为“Type 0”交换机。此外,我们期望交换机能够支持更多的额外行为,例如重写部分包头(NAT,中间链路地址混淆),数据包的优先级映射等。或者使流表项能够与任意格式包头的字段匹配,从而允许非IP协议的实验。我们将会定义一个特殊的此类额外特性的集合,称此类交换机为“Type 1”交换机。

控制器。控制器通过对流表中流表项的增、删控制实验流量的行为。例如,一个静态控制器,也许只是一个简单的运行在PC上的程序。在实验的时候,负责在一组互联的计算机之间静态创建流。在此用例中,流类似于当前网络中的VLAN,提供简单的机制隔离实验流量与商用流量。从这个角度看,OpenFlow可以是广义上的VLAN。

在进一步的实验中可以设想一种复杂一些的控制器,动态的添加、删除流。其中一种应用模型,研究者可以完全的控制OpenFlow网络,自由地决定如何处理全部的流。一种更加复杂的控制器,能够支持多个研究者,每名研究者有不同的账号与权限,能够分别在不同的流集合上展开多个独立的实验。流在某个特定研究者的控制之下被识别(例如,通过运行在控制器中的策略表),并被投递到某个研究者的用户级控制程序中,在这里决定是否需要向网络中的交换机添加新流。

三、使用OPENFLOW

一个简单的使用OpenFlow的例子。假设研究者Amy发明了Amy-OSPF,一种代替OSPF的新路由协议。她想在不改变交换机软件的情况下,在OpenFlow网络中实验新协议。Amy-OSPF运行在一个控制器中,对于每个新的实验流,Amy-OSPF控制器从一系列的OpenFlow交换机中为其选择一条路由,然后在这种路由的每一台OpenFlow交换机的流表中为其添加新的流表项。在她的实验中,Amy决定对从她的桌面电脑进入OpenFlow网络的流量使用Amy-OSPF中由协议,所以不会干扰到其它的网络流量。艾米的桌面电脑与网络中某个特定OpenFlow交换机的端口相连,于是她将所有从此端口进入网络的流量定义为一个流,并在这个特定OpenFlow交换机的流表中添加流表项,流表项的“行为”指出,将此流的包全部封装并转发到Amy-OSPF控制器。Amy-OSPF收到包,表示网络中产生了新流,它首先为此流选择路由,然后在所选路由经过的所有交换机中添加新流的流表项。此流后续的包将不再转发给Amy-OSPF控制器,而是沿着已经由流表确定好的路由快速的线速转发。

控制器在实验过程中动态的增、删流时,关于其性能、可靠性、可扩展性是几个合乎情理的疑问:中心化的控制器可以足够快的处理新流以及管理交换机中的流吗?如果一个控制器失效会发生什么?这些问题一定程度上在一个名为Ethane的原型中得以解决,它使用简单的流交换机与一个中心控制器。初步结果表明,一个运行于桌面PC的Ethane控制器每秒可以处理10000个新流,足够应付一个大型的校园网。当然,新流的处理速率还取决于实验所要求的处理复杂度,但不管怎么说,它给了我们能够运行有意义实验的信心。关于扩展性与可靠性,使控制器无状态,以及在多个独立的设备之间做简单的负载均衡是可行的。

三.一、在商用网络中实验

变化是Amy要在很多用户使用的商业网络中测试她的新协议。因此要求网络具备两个新的额外属性:

  1. 属于普通用户而非Amy的流量应该按路由器中运行的,常规的、经充分测试过的协议转发。
  2. Amy仅能够控制属于自己的流或者是网络管理员允许她控制的流。

OpenFlow通用路由器即可实现第一个额外属性。在实验中,所有并非来自Amy电脑的流量默认均按常规方式处理。属于Amy的流量允许其自由控制。

第二个额外属性有赖于控制器。应该将控制器看作一个平台,允许研究者在其上展开各种实验,同时通过合适的许可或者其它方法限制各个研究者控制流的权限。确切的这类许可机制依赖于控制器的具体实现,我们预期将会出现多种类型的控制器。控制器具体实现的一个例子:作为Ethane的后续工作,一些开发者正在致力于研发一款名为NOX的控制器。通过扩展GENI管理软件到OpenFlow网络,可能会出现一个十分不同的控制器。

三.二、更多示例

正如任何实验平台,可能的实验将超出前期的预计--OpenFlow网络中的大多数实验仍然没有被考虑。这里,我们提供一些示例,演示如何使用OpenFlow网络实验新的网络应用或者架构。

示例1:网络管理与访问控制。首先我们使用Ethane作为第一个例子,正是因为它的研究才启发了OpenFlow,事实上OpenFlow可以看作是Ethane的普遍化。Ethane使用特殊实现的控制器,适用于网络管理与控制,通过它管理流的准入与路由。基本思路是这样的,允许网络管理员在中心控制器上定义适用于全网的策略,控制器利用此策略中定义的规则控制交换机,从而控制流的准入与路由。策略中的规则可能是诸如“允许访客使用http但必需经过某个代理”或者是“不允许VoIP电话与便携电脑通信”等。控制器通过绑定名称服务与地址服务等实现数据包与发送者的关联。本质上控制器接管了DNS、DHCP与认证服务,当一个用户接入网络时追踪其MAC地址、所连接的交换机端口或者接入设备、是否认证等信息。这些特征值被用来在定义策略时匹配一个用户的包。试想对Ethane的一种扩展,在控制器中指定一条策略,指示网络将特定的流发送给某个用户进程,从而实现研究者指定的特殊处理。

示例2:VLANs。OpenFlow能够很容易的为用户提供独立网络,就像VLAN一样。最简单的方法是创建一系列的流,这些流的包从特定端口进入网络,然后在流表的流表项中为其指定行为,行为会为这一系列的流添加指定的VLAN ID。或者是通过端口及MAC地址标识单个用户并为其指定VLAN ID。

一种更动态的方法可能是像Ethane所作的一样,跟踪某个用户接入网络的过程,从而可以知道其具体的位置信息,进而在运行时动态的标识其流量。

示例3:移动终端的VOIP客户端WIFI网络切换。用户使用手机中的VOIP客户端通话时,通过一个特别实现的控制器跟踪其位置,当用户从一个WIFI网络移动到另一个WIFI网络时,VOIP客户端重新与新的接入设备建立链拉,而控制器通过OpenFlow功能控制其路由,从而实现通话不中断的无缝切换。

示例4:非IP网络。目前为止,我们的示例都发生在IP网络中,但OpenFlow并没有对包的具体格式提出任何要求,只要包头能与流表中的流表项能够匹配即可,这就允许对新的名称、寻址、路由方案展开实验。OpenFlow通用交换机有数种方法支持非IP流量。例如,通过以太网桢的头部(源、目的MAC地址)以及一个新的以太网桢类型,或者是在IP层为数据包指定一个新的版本号。更一般的,我们希望将来的交换机允许控制器创建通用掩码(偏移+值+掩码),允许包按研究者指定的方式处理。

示例5:处理包而非流。以上示例都涉及到流,当流开始时由控制器决策如何处理。当然,也存在一些有趣的实验,要求每一个包都被处理。例如,检测每一个包的入侵侦测系统,一个显式拥塞控制机制,或者修改包内容:将其从一种格式转换成另一种格式。

在OpenFlow通用交换机网络中有两种处理包的方法。首先,也是最简单的,强制所有流的包通过特定控制器。这样做的话,控制器不会向流表中添加任何一条流表项,只是默认交换机将所有的包转发到控制器。这种方法相当灵活,但需以性能为代价。它可能为新协议的实验提供了一种有效的途径,但不大可能在大型网络中部署。

第二种处理包的方法是将它们路由到可编程的交换机中,例如基于NetFPGA可编程路由器,并在那里进行包处理。好处是包能够以用户定义的方式被线速处理,如下图三所示,本质上OpenFlow通用交换机充当了允许包到达NetFPGA的一块插板,某些情况下NetFPGA板(PCI板,可直接插入到计算机的卡槽中)有可能与OpenFlow通用交换机一起放置在配线间,更有可能是实验室。

图三

四、OpenFlow联盟

OpenFlow联盟旨在推广OpenFlow与维护OpenFlow交换机规范,联盟由大学、学院的科研人员及网络管理员组成,他们相信如果OpenFlow交换机在他们的网络中部署将会助力他们的研究任务。

联盟成员向全世界范围的学校、学院、大学、政府开放,OpenFlow联盟欢迎不受雇于生产路由器、交换机、接入设备的厂商以及参与销售的独立人士加入(出于保护联盟独立性的目的)。要加入,发送邮件致join@OpenFlowSwitch.org。

联盟网站包含OpenSitch交换机规范、联盟成员列表以及交换机实现参考。

授权模式:OpenFlow规范可免费用于所有商用非商用目的(详见网站)。声称支持OpenFlow的交换机、路由器必需满足OpenFlow Type 0交换机的要求。OpenFlow是斯坦福大学商标,并受联盟保护。

五、部署OpenFlow交换机

我们相信,出售支持OpenFlow功能的交换机给研究社区,对网络设备生产商而言将会是一个市场机遇。成千上万大学、院校的每栋建筑里都有配线间,交换机、路由器、接入设备也遍布校园。

我们正积极与几家交换机和路由器生厂商一起工作,在现有硬件基础上实现流表,从而使其产品具有OpenFlow功能,无需修改硬件。安全通道软件可运行在交换机在现有的处理器上。

多数网络设备供应商对添加OpenFlow功能持开放态度,愿意在不暴露自己产品的内部工作机制下支持研究社区。

我们正在斯坦福大学的计算机科学与电气工程学院,部署大型OpenFlow网络。在两栋楼中,通过运行OpenFlow交换机,取代原有的网络。最终,所有的数据流将通过OpenFlow网络运行,真实流量和实验流量将在网络管理员的控制下,被隔离在不同的VLAN中。研究者能够控制自己的流量,并能够增、删除流表。

我们也希望能够通过研究组织,开发多种不同的OpenFlow交换机。在OpenFlow的网站中,“Type 0”交换机在几个不同的平台被设计:Linux操作系统(软件),OpenWRT的(软件,接入点),和NetFPGA(硬件,4个端口每GE)。随着越来越多的设计出现,我们将会在社区里发布。我们鼓励开发人员对照参考设计,测试他们的交换机。
所有张贴在网站上的,关于OpenFlow交换机的参考实现将是开源和免费的,可以用于商业和非商业用途。

六、结论

我们认为,OpenFlow的是一个务实的妥协,允许研究者以统一的方式,在各种交换机和路由器上进行实验,无需厂商暴露他们产品的内部工作原理,或者逼迫研究人员编写只适用以某个特定供应商的控制软件。
如果在我们的校园里成功部署了OpenFlow网络,我们希望OpenFlow将逐渐出现在其他大学,以增加支持实验的网络数量。我们希望新一代控制软件的出现,使研究人员能够在其他人的工作基础上,重复利用控制器进行实验。随着时间的推移,我们希望在不同大学的OpenFlow网络,能够通过隧道和覆盖网络进行互联,或者也许在骨干网络上运行新的OpenFlow网络,连接彼此的校园网。

本文为《OpenFlow:Enabling Innovation in Campus Networks》一文的译文,所有解释权归原文作者所有。

OpenFlow:Enabling Innovation in Campus Networks 译文相关推荐

  1. OpenFlow: Enabling Innovation in Campus Networks

    文章名称:OpenFlow: Enabling Innovation in Campus Networks 文章来源:Mckeown N , Anderson T , Balakrishnan H , ...

  2. 论文阅读笔记 1.《Open Flow: Enabling Innovation in Campus Networks》(2022.12.22)

    论文阅读笔记 1.<Open Flow: Enabling Innovation in Campus Networks>(2022.12.22) 一.论文主要内容 二.对 OpenFlow ...

  3. Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks -译文

    使用多任务级联卷积网络进行联合人脸检测和对准 摘要:由于各种姿势.光照或遮挡等原因,在无约束环境下的人脸检测和对齐是一项具有挑战性的问题.最近的研究显示,深度学习方法可以在这两项任务上取得令人瞩目的效 ...

  4. OpenFlow和SDN的历史和原理介绍

    OpenFlow相关的历史.新闻:http://blog.csdn.net/jincm13/article/details/7825754 起源与发展 [https://36kr.com/p/5035 ...

  5. [转]SDN与OpenFlow技术简介

    http://blog.163.com/s_zhchluo/blog/static/15014708201411144727961/ 本文是2012年文章,对Openflow的发展.规范.应用和SDN ...

  6. SDN与OPENFLOW 简介

    本文对Openflow的发展.规范.应用和SDN的提出及相关应用做出较为客观全面的介绍.笔者希望通过本文对OpenFlow/SDN做一个初步介绍,以期帮助大家能够进一步深入了解和学习OpenFlow/ ...

  7. SDN和Openflow flowvisor NOX

    目录(?)[-] 简介 编辑本段传统路由器的设计 设计思想 虚拟化的逆袭网络虚拟化之OpenFlow和SDN Open还是Flow OpenFlow对产业链的影响 OpenFlow面临的技术难点 结论 ...

  8. OpenFlow交换机【ACM SIGCOMM顶会论文笔记】

    目录 写在前面的话 OpenFlow交换机 基本思想与工作原理 专用OpenFlow交换机(Dedicated OpenFlow switches) 启用OpenFlow的交换机(OpenFlow-e ...

  9. OpenFlow入门资料汇总(OpenFlow、SDN、NOX等,多为网络文章)

    声明:此篇文章为转载,转载原文地址为:http://blog.csdn.net/jincm13/article/details/7825754 很好的OpenFlow方向的网络文章汇总,阅读通篇能够对 ...

最新文章

  1. mysql query结果集_如何解决PHP使用mysql_query查询超大结果集超内存问题
  2. NOIP2007 字符串的展开
  3. 无任何网络提供程序接受指定的网络路径 or No network provider accepted the given network path 的解决方法...
  4. 浪点服务器芯片,浪点云服务器
  5. c#字符编码,System.Text.Encoding类,字符编码大全:如Unicode编码、GB18030、UTF-8,UTF-7,GB2312,ASCII,UTF32,Big5
  6. windows 7 与linux 双系统 安装
  7. [转]编程常用英语单词
  8. 卫星地面站空间分集的必要性及解决方案
  9. JS判断数组是否包含某个元素
  10. 用html5做心,HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
  11. leaflet实现风场动态粒子效果
  12. 受损固态硬盘(SSD)数据恢复方法
  13. C++代码审阅–ice104协议从站(5)
  14. 时间复杂度O(1),O(n),O(logn),O(nlogn)的意思
  15. 三角形的平移、旋转,在VC上实现(矩阵的应用)
  16. Linux系统编程 74 孤儿进程和僵尸进程
  17. 向上取整、向下取整与四舍五入(易理解版)
  18. 5年开发经验的阿里巴巴Java程序员分享从业心得总结,帮助还在迷茫的朋友
  19. csapi matlab,Matlab函数csapi与papi的区别是什么
  20. 区别 |Python的 open() 和with open() as

热门文章

  1. 手机备忘录每个月的10号定时提醒怎么设置
  2. 图形验证码+短信验证码【Java应用实例】
  3. 情人节如何含蓄向女友说分手
  4. 数学建模论文六大获奖技巧总结(想得奖的进来看)
  5. MathWorks MATLAB R2023a for Mac/Win 激活版
  6. Python学习2,拆分plist图集,还原成小图
  7. java8Stream流的使用2--终止操作(分组,分区)
  8. MYSQL查询后出现中文乱码怎么办
  9. 索尼电视android屡次停止,索尼电视应用助手目前暂停使用怎么办 教你解决
  10. 林仕鼎谈数据中心计算(一):整体大于部分之和