假设我有一台带有两个以太网适配器的主机:
LAN 适配器 - 连接到 LAN,自动获取 IP 地址。
设备适配器 - IP 地址为 192.168.10.1,子网掩码为 255.255.255.0。
我也有连接到设备适配器的硬件设备,它像 TCP/IP 服务器一样工作,并配置了 IP 地址 192.168.10.2,子网掩码 255.255.255.0。
我有以下愚蠢的规则来建立主机-设备通信:将两个子网掩码设置为 255.255.255.0,并定义仅最后一个组件不同的 IP 地址。没关系,它有效。
现在我正在阅读有关 TCP/IP 通信的整个理论 (www.tcpipguide.com)。如何根据网络、子网、掩码、路由等来描述我的案例?比如主机程序向192.168.10.2、1500端口发送UDP数据报,这个数据报是如何发送给设备的?做了哪些决定,哪些网络组件参与了数据报的传递?
最佳答案
网络掩码可以被认为是 IP 地址的位掩码。
如果 (address1 & netmask) == (address2 & netmask) 那么 2 个 ip 地址被认为在同一个子网上。 (这个表达式可以有很多不同的写法...)
网络掩码只是“虚拟”划分网络的一种方式:网络掩码不是 ip header 的一部分,也不会在线路上传输。除了设备本身,没有人知道网络上设备的网络掩码。它在设备的 tcp 堆栈内部使用,以做出一些基本的路由决策。请注意,还有其他方法可以定义子网,这些方法可能不涉及网络掩码但达到相同的结果:将多个设备分组到一个“虚拟”网络中。
插入设备的路由器甚至可能对同一设备具有不同的网络掩码定义:只要路由器正确路由数据包,这并不重要。网络掩码主要用于自动计算一些众所周知的地址:例如,用于udp广播数据包的广播地址是根据设备的IP地址及其网络掩码计算的。
在您的具体情况下:
没有物理路由器,但您的计算机是路由器(它在内部将数据包路由到不同的网络接口(interface))。你的计算机包含一个路由表,它告诉特定数据包应该使用哪个传出接口(interface)(在 Windows 上,尝试 route print,在 linux 上,作为 root,尝试 route) .
通常,路由表的设置使得数据包从与目标设备位于同一子网的接口(interface)发出。计算机在每个接口(interface)上使用上述逻辑表达式来确定目标是否与该接口(interface)位于同一子网上。如果表达式为真,则数据包发出。每个条目都有一个参数(称为度量),允许在可能存在多个路由的情况下选择看似最佳的接口(interface)。
你应该注意到路由表是动态的:它可以手动修改,添加一个特定的路由(例如,如果你知道一个特定的设备可以通过一个接口(interface)访问,但该设备的 IP 地址是与此接口(interface) ip 地址/网络掩码无关)。还有一些协议(protocol)(arp、dhcp...)用于广播路由信息的本地网络,这些信息由您的系统自动处理以修改路由表。
关于sockets - 在子网掩码和路由方面的主机设备通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8575857/
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上找到一个类似的问题
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的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
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
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