交换机的作用:把数据包发送到正确的位置
交换机工作的方式:依照MAC地址和物理端口的关系映射表,也叫MAC地址表,通过数据包上的目标MAC地址,找到他对应的物理端口.
1.物理端口如何和MAC地址建立映射关系?
通过网线! 一个交换机本身就带有很多端口,每一个端口有自己的端口号,计算机的网卡通过网线链接到交换机的网口上,这就使得计算机上MAC地址和交换机的物理端口直接建立映射关系!
2.某个设备想要和某个MAC地址通信时,是如何做的?
首先我们知道数据包上具有与两个MAC地址:源MAC和目标MAC
a.交换机收到数据包时,首先要将源MAC和接收端口绑定,然后填入MAC地址表中
b.通过目标MAC地址,查找发出端口,如果在MAC地址表中通过目标MAC地址.如果查到了关联端口,那么交换机就将数据包从关联端口中发出;如果没有查到关联端口,那么交换机就会采取一种广播的形式,那么如果目标MAC地址连接了交换机后,就接收数据包,并且在MAC地址表中新建一条记录.
c.久而久之,就得到了一张完善的MAC地址表,就可以找到网络中所有网卡设备.

3.交换机只会关心数据包中的MAC地址,不会关心IP地址,又因为MAC地址在TIP/IP协议中处于第二层数据链路层,所以交换机也被称为二层设备.

1.我们知道路由器上有两种接口:
一种是WAN口,WAN口只有一个,用于连接运营商网络
一种是LAN口, LAN口可以有多个, 用于连接家庭网络设备,比如通过WIFI连接手机和笔记本

2.如果路由器忽略WAN口,那么路由器=交换机
如果加上WAN口,就是网关
为了说明网关,我们这里先说子网划分,子网划分=IP地址&子网掩码
按位与就是:1和谁与得谁,0和谁与都得0

1.IP地址和子网掩码按位与后的结果相同的两个IP认为是在同一个子网中
比如

3.我们通常把1的数量表示掩码,255.255.255.0因为有3*8=24个二进制1组成,所以就把它的子网掩码叫做24
4.子网的表示形式:IP/掩码 ,比如192.168.1.0/24就表示了255个IP
所以如果想增大子网中IP地址数量,只需调小子网掩码(1的数量)
5.TIP/IP协议规定:
两个不同子网的IP是不能直接通信的,如果要通信要通过网关进行转发
6.网关上有两张网卡,分别配置了属于两个子网的IP地址,可以在两个网络中转发数据包

7.举一个例子:
a.当计算机A要发送一个数据包时,他先会判断目标IP是否和自己属于同一个子网
如果是属于同一个子网,那么就将数据包从计算机A的网卡直接发出
如果不是属于同一个子网,那么先将目标MAC地址改为接收网关MAC地址,然后发送给网关
b.网关接收到数据包后,通过路由表,查询到这数据包属于子网2,将**源MAC地址改为发送网关MAC地址,目标MAC地址改为计算机B的MAC地址,**然后从网关发送出去。

8.我们将根据目标IP判断如何发送的行为称为路由,路由的WAN口接入互联网,LAN口接入本地网(内网),
WAN口和LAN口属于不同的子网,所以需要路由器来充当网关的作用,这也被称为路由!
到这里本节完结,你将自测以下问题:
1.交换机如何找到目标端口?
2.交换机和路由器有什么区别?
3.网关和路由是什么意思?
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba
路由有如下代码:resources:orders,only:[:create],defaults:{format:'json'}resources:users,only:[:create,:update],defaults:{format:'json'}resources:delivery_types,only:[:index],defaults:{format:'json'}resources:time_corrections,only:[:index],defaults:{format:'json'}是否可以使用1个字符串为所有资源设置默认格式,每行不带“默认值”散列?谢谢。
打印1:defsum(i)i=i+[2]end$x=[1]sum($x)print$x打印12:defsum(i)i.push(2)end$x=[1]sum($x)print$x后者是修改全局变量$x。为什么它在第二个例子中被修改而不是在第一个例子中?类Array的任何方法(不仅是push)都会发生这种情况吗? 最佳答案 变量范围在这里无关紧要。在第一段代码中,您仅使用赋值运算符=为变量i赋值,而在第二段代码中,您正在修改$x(也称为i)使用破坏性方法push。赋值从不修改任何对象。它只是提供一个名称来引用一个对象。方法要么是破坏性