最近二狗子在网上冲浪的时候,不小心将 CDN 搜索成了 SDN,结果跳出来了一大堆相关的知识点。
好学的二狗子当然不会随随便便糊弄过去,于是认认真真学习了好久,终于了解了 SDN 是什么。
原来,SDN 的全称是 Software Defined Networking,是一类将网络控制平面与数据平面分开,以实现网络资源的自动化配置和基于策略的管理技术。互联网发展以来,企业网络结构的组成和管理对于许多公司来说都是一项巨大的挑战。硬件设施曾经在网络世界中占据统治地位,但是基于物理硬件的传统网络很少能满足现代公司的要求,直到出现了 SDN。
SDN 即软件定义网络,它描述了一种网络架构,可以使用软件对单个硬件组件进行集中、智能的管理和控制,使用 OpenFlow 等开放协议允许访问网络设备,如交换机、路由器或防火墙等。其核心技术 OpenFlow 通过将网络设备的控制面与数据面分离开来,从而实现了网络流量的灵活控制,使网络变得更加智能,为核心网络及应用的创新提供了良好的平台。简而言之,SDN 概念代表了基础设施及其配置的分离。
控制平面:控制平面决定数据报在端对端的路径上应该如何路由,即路由。
数据平面:数据平面决定数据报在每个路由器上该如何从 Input Port 转发到 Output Port 中,即转发。
虽然控制面和数据面分离,但数据平面仍然是网络设备中的一部分。对于 SDN 来说,它的任务是专门转发数据包,因此它需要很少的计算能力。此外,SDN 技术能够有效降低设备负载,协助网络运营商更好地控制基础设施,降低整体运营成本,成为最具前途的网络技术之一。
传统网络世界水平是标准开放的,每个网元可以和周边网元进行互联。而在计算机的世界里,不仅水平是标准和开放的,同时垂直也是,从下到上有硬件、驱动、操作系统、编程平台、应用软件等等,编程者可以很容易地开发各种应用。从某个角度和计算机对比,在垂直方向上,网络是 “相对封闭” 和 “没有框架” 的,在垂直方向创造应用、部署业务是相对困难的。但 SDN 将整个网络(不仅仅是网元)的垂直方向变得开放、标准化、可编程,从而让人们更容易、更有效地使用网络资源。
控制层上运行的 SDN 软件需要控制平面和数据平面之间的特定通信接口,以便将适当的数据包流量指令发送到嵌入式网络组件。对此最著名的解决方案就是上面提到过的 OpenFlow。OpenFlow 由开放网络基金会 (ONF)管理,是软件定义网络架构中控制层和数据层之间的第一个标准化接口。
在很多 SDN 网络中,它取代了网络设备的单独接口,也减少了对硬件厂商的依赖。
OpenFlow 是迄今为止最常见的,但绝不是唯一用于管理 SDN 的协议。一些替代方案例如 NETCONF (RFC 6241)、BGP(边界网关协议)、XMPP(可扩展通讯和表示协议)、OVSDB(开放 vSwitch 数据库管理协议)和 MPLS-TP(MPLS 传输协议)等。Cisco 和 Nicira 的一些专有协议也会用于某些架构。

一旦硬件和软件之间的通信建立起来,管理员可以通过控制层和各自的 SDN 软件快速轻松地获得网络的整体视图,并通过基于软件的中央控制来管理网络设备。这让数据流的管理效率比在各组件本身控制逻辑的网络中要高得多。路由和拓扑信息不再以片段的形式分布在所有路由器上,而是汇聚在一个中心位置,大大增加了虚拟化和资源的可扩展性。
一般来说,SDN 网络体系结构主要包括 SDN 应用和服务(应用平面)、北向接口、SDN 控制器(控制平面)、南向接口和网络设备(数据平面)五个部分。

数据平面由物理和虚拟的各种网络设备组成。数据平面的主要职责是转发。在以前的传统网络中,控制平面和数据平面都在同一个设备中。但是对于 SDN,网络设备只有数据平面。所以,这些网络设备的主要作用只是转发数据。这也提供了一种非常有效的转发机制。
SDN 控制器是 SDN 架构的中心,也是 SDN 架构组件中最重要的组件之一。换句话说,SDN 控制器是系统的大脑。所有数据平面设备的控制都是通过 SDN 控制器完成的。它还控制应用层的应用程序,通过接口与 API 通信进而控制这些上层和下层。
应用层包含组织使用的典型网络应用或功能。这些应用程序通过调用 SDN 控制器的北向接口,实现对网络数据平面设备的配置、管理和控制。
这三层使用各自的北向和南向 API 进行通信。应用程序通过其北向接口与控制器通信,控制器和网络设备使用南向接口(例如 OpenFlow)进行通信。
在数字网络变得越来越庞大和复杂的同时,虚拟化程度以及对最大灵活性和可扩展性的需求也在不断提高。SDN 相对于传统网络的优势可以总结如下:
无需配置单个设备或操作系统
整个网络的维护和管理成本低
降低硬件和运营成本
实现资源的实时动态分配和监控
对硬件制造商的依赖性低
SDN 还促成了软件定义广域网 ( SD-WAN ) 技术的出现,SD-WAN 采用 SDN 技术的虚拟覆盖方面。SD-WAN 将组织在其 WAN 中的连接抽象化,创建一个虚拟网络,该网络可以通过控制器寻找适合发送流量的相关连接。

SDN 的主要采用者包括服务提供商、网络运营商和一些大型企业,如 Facebook 和谷歌等。不过 SDN 的背后仍然存在着一些挑战。
安全:集中式 SDN 控制器会出现单点故障,如果被攻击者作为目标,可能会对网络造成极大的影响。
定义不明确:SDN 面临的另一个挑战是业界对软件定义网络确实没有统一的定义。不同的供应商提供了不同的 SDN 方法,包括以硬件为中心的模型和虚拟化平台到超融合网络设计和无控制器的方法。
由于其相对于经典网络的众多优势,SDN 对于很多场景都比较适用,包括:
开发运维。SDN 可以通过自动化应用程序更新和部署来促进 DevOps 。该策略可以包括在部署 DevOps 应用程序和平台时自动化 IT 基础架构组件。
校园网络。校园网络比较难以管理,尤其是在不断需要统一 Wi-Fi 和以太网的情况下。SDN 控制器可以提供集中管理和自动化、改进安全性和整个网络的应用级服务质量。
网络服务提供商。SDN 可帮助服务提供商简化和自动化其网络的配置,以实现端到端网络和服务管理与控制。
数据中心安全。SDN 支持更有针对性的保护并简化防火墙管理。通常,企业依靠传统的外围防火墙来保护数据中心。但是,公司可以通过添加虚拟防火墙来创建分布式防火墙系统进而保护虚拟机。SDN 集中控制和自动化还让管理员能够查看、修改和控制网络活动,以降低违规风险。
近年来,许多网络提供商都采用了 SDN ,通过消除制造商特定的限制并大大简化了网络管理,优化了硬件虚拟化的基本方法。虽然传统网络在安全、可靠性、可维护性和性能上还有很大的优势,但是随着 SDN 相关设备的发展,SDN 依靠自己的优势,一定会不断占领传统网络的领地。网络运营商应为 IT 行业的未来发展和挑战做好充分的准备。
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的
我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails
下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
我定义了一个方法:defmethod(one:1,two:2)[one,two]end当我这样调用它时:methodone:'one',three:'three'我得到:ArgumentError:unknownkeyword:three我不想从散列中一个一个地提取所需的键或排除额外的键。除了像这样定义方法之外,有没有办法规避这种行为:defmethod(one:1,two:2,**other)[one,two,other]end 最佳答案 如果不想写**other中的other,可以省略。defmethod(one:1,two:2
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据