
我们通常想象的计算机网络涉及连接到路由器和交换机等设备的各种电缆(以太网、光纤、同轴电缆),这些电缆将数据包定向到需要去的地方。
Wi-Fi 和蜂窝数据网络的兴起已经用无线信号取代了其中一些电线,但即使是无线电波也处于物理领域,它们会连接回手机信号塔或 Wi-Fi 接入点。
在七层 OSI 网络参考模型中,所有网络设备、处理和通信都占据最低的三层:第 3 层(网络)、第 2 层(数据链路)和第 1 层(物理层)。
在虚拟网络中,所有这些活动都发生在软件中。
虚拟网络可能完全存在于一台物理机器——一台服务器中。 或者它们可能构成一个运行在物理网络之上的抽象层,其配置和拓扑可能与虚拟网络完全不同。
构建虚拟网络是一项复杂的工作,但好处是巨大的:只需更改文件即可重新配置网络,而不是通过可能涉及爬过管道系统的费力体力劳动。
要了解虚拟网络的工作原理,让我们从一个相关且更为熟悉的概念开始:虚拟机(VM)。 我们大多数人都熟悉虚拟机,这使得在一台物理机器上运行多个应用程序实例成为可能。
这些虚拟机并不真正“知道”它们是虚拟的; 他们通常与底层硬件进行的所有系统调用和其他通信都被称为管理程序的软件层拦截。 管理程序处理来自同一台机器上运行的多个虚拟机的请求,以最有效地利用底层硬件资源。
VM 甚至可以跨硬件平台翻译指令,这样 VM 就可以在 x86 机器上运行,即使它是为 ARM 处理器设计的。 管理程序能够返回 VM 期望从硬件接收的结果。
虚拟网络基于相同的原则。 软件配置为模拟具有管理员所需的特定地形的网络。 与 VM 一样,虚拟网络能够发挥其魔力,因为与其通信的操作系统和应用程序不知道(或关心)它们是在与真实交换机还是虚拟交换机(vSwitch )。
他们只是发送标头中标有特定网络路由信息的数据包,并期望收到类似的数据包作为回报。 因为这种通信是标准化的,所以很容易构建可以模拟物理网卡、交换机或路由器行为的软件,而且像 Open vSwitch 这样的工具确实可以在管理程序上运行,也可以作为物理网络硬件的控制堆栈运行。
一旦管理程序有了这些数据包,它就必须弄清楚如何将它们路由到目的地,就像物理网络硬件一样。 不同之处在于管理程序必须将有关软件定义的虚拟网络(我们的计算机“认为”它所连接的网络)的信息转换为有关实际底层物理环境的信息。
一台计算机可能认为它正在向同一局域网中的另一台计算机发送数据包,但实际上这两台计算机可能位于不同的国家 — 或者可能是在同一台服务器上运行的两台虚拟机。
管理程序通常会通过将数据包封装在标头中具有不同路由信息的另一个数据包中来解决此问题,然后将该数据包移交给物理网络基础设施。 一旦该数据包到达目的地,外部数据包就会被剥离; 接收数据包的系统将认为它是通过虚拟网络到达的,而不是它穿过的实际物理网络。
不用说,实施虚拟网络需要大量的工作和独创性。 为什么要经历这些麻烦? 对不同类型的虚拟网络的描述将提供它们有用的真实场景的感觉。
一个重要的区别是内部和外部虚拟网络。 内部虚拟网络用于连接在同一台服务器上运行的多个虚拟机。 在这种情况下,管理程序不需要封装网络数据包并将它们发送到真实网络; 它只是找出它们适用于哪个虚拟机并交付它们。
使用为计算机到计算机通信开发的协议作为在同一物理硬件上运行的两个进程进行通信的一种方式似乎很奇怪。 但请记住,虚拟化的好处之一是您可以在同一台服务器上将多个开箱即用的操作系统作为完全独立且独立的进程运行。
为此目的使用标准网络数据包和协议,以及它们相关的安全基础设施,意味着这些 VM 可以在不修改的情况下运行和相互通信。
另一方面,外部虚拟网络涉及单独的物理计算机(或 VM 和物理机的混合体)。 在这种情况下,机器通过传统的物理网络设备连接(包括通过开放互联网的连接),但网络管理员将创建一个不同于底层物理网络拓扑的虚拟网络拓扑。
虚拟网络分为三类,可以是内部的或外部的:
当您在同一硬件上运行多个虚拟机时,虚拟网络是绝对必要的——这是云计算中的常见场景。 同时,在现有物理网络之上创建 VLAN 和 VXLAN 使管理员能够快速重组网络以满足他们的需求——而且通常是在基础架构即代码时代自动进行。 通过手动重建物理网络很难或不可能做到这一点。
虚拟网络的优点包括:
这些好处都有助于提高 IT 生产力并降低管理成本,这是虚拟网络得以保留的一个重要原因。
类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