为什么子网掩码与网络上的单个计算机相关?


48

我了解如何使用子网掩码将网络划分为多个子网,但是,为什么网络中的每台计算机都需要知道子网掩码,而不仅仅是路由器?

我能理解,如果每台计算机都通过电线物理地相互连接,但是所有数据包仍然需要通过路由器。

假设我在网络上有一台192.168.0.0/255.255.255.0具有IP的计算机192.168.0.1

如果该计算机试图到达子网之外的计算机,可以说192.168.1.1,它将消息发送到路由器,则路由器会确定该IP在子网IP范围之外,而不是在子网中进行传输。网络,它将其传输到所连接的网络(也许是另一个路由器)。


31
计算机不需要通过路由器即可形成网络。
凌驾于

1
@Overmind:是的,但是他们可以。子网掩码确实不是严格必需的,它们是对简化路由器工作的优化。
MSalters

3
if each computer were physically connected to each other with a wire-您必须记住,tcp / ip确实是在这种情况下发明的。谷歌10-base-2。其他协议的工作方式与tcp / ip不同,但是在过去的20年中,IPv4赢得了协议之战。
slebetman

您似乎对计算机网络的工作方式有误解。我建议您观看以下视频:youtube.com/watch?
v

@Inter以如此令人毛骨悚然的声音与叙述者链接?决不。
吞噬了极乐世界

Answers:


78

您最初的假设并不完全正确。您所说的“路由器”是两个设备合二为一–一个内部连接到多端口以太网交换机的两端口路由器。(这是一个示例。)

这意味着,在计算机直接连接在第2层,并且可以将数据包发送给对方,而不通过路由器芯去-它们是由交换芯片的端口之间简单地中继。(路由器在交换机中具有自己的“端口”。)

因此,如果使用Wireshark查看数据包,您会发现它们直接使用彼此的MAC地址,而“外部”数据包始终将路由器的MAC作为目的地。

(我假设您正在谈论大多数家庭中常见的典型``无线路由器'',这是此类问题的常见原因。更大的网络将有一个单独的路由器,每个子网一个端口,几个单独的交换机(每个楼层/房间可能是一台主交换机,再加上一台),以及连接到这些交换机的数十台计算机。)

与Wi-Fi网络大致相同,不同之处在于“交换机”已替换为“无线网桥”,也称为“接入点”。在这两种情况下,连接的计算机都可以在第2层之间直接相互发送数据包,而无需通过路由器。


评论:

当我说路由器时,我实际上是指交换机。我的错。我的观点是,子网中的每台计算机不是彼此连接,而是连接到交换机,然后交换机可以将软件包传递到正确的目的地。以太网帧不包含子网掩码,因为交换机已经具备了这一知识,因此不需要它来进行正确的交换。

这又是不正确的。交换机不具备此知识;他们交换核心工作在2层,不知道什么关于IP -它转发纯粹基于“目的MAC地址”字段的以太网帧。

因此,主机需要子网掩码来确定将哪个MAC地址用作目标:

  • 如果对等点在同一子网内,则根据定义假定它是处于链接状态 –因此,以太网帧会将对等点的MAC作为目的地。

  • 对于子网外部的对等方,以太网帧将网关的 MAC作为目的地。

(这适用于默认配置。某些特殊的雪花网络会对此进行更改–例如,大多数操作系统允许为其他子网添加额外的“链接上”路由;相反,某些交换机可能配置为欺骗ARP响应,从而即使是“链接上” “流量被强制通过网关。)


谢谢,虽然链接图对我来说还不清楚,但您的解释很有意义,我学到了一些新知识。
阿德莱德爵士

7
当数据包发送到不在ARP缓存中的IP地址时,子网掩码将用于决定是否:1.发送针对目标IP地址的ARP请求,并将结果用作目标MAC地址的目标MAC地址。原始数据包 或2.使用路由器的MAC地址作为原始数据包的目标MAC地址。

6
@Orpedo:交换机不讲IP,也不了解子网结构。它们完全依赖于目标MAC字段。因此,需要使用子网掩码来确定首先要在以太网帧上放置的MAC地址(即哪个接收者主机)。
grawity

2
@Orpedo交换机是“以太网路由器”。他们使用以太网地址(MAC地址)来确定将以太网数据包发送到何处。与使用IP地址确定将IP数据包发送到何处的IP路由器相反。
user253751 '17

1
由于历史原因,@ Orpedo我们通常在以太网上运行IP,因此以太网数据包的有效负载是IP数据包,而以太网数据包的目标地址是下一个IP路由器的以太网地址。它也进一步上升。如果您在IP上运行Tor,则IP数据包的有效负载是一个Tor数据包*,是下一个Tor路由器的IP数据包的目标地址。(*为了工作
起见,

32

计算机如何知道目标地址是否在另一个的同一子网中?

检查本地地址子网掩码

让我们看几个例子:

如果我的计算机具有IP 192.168.0.1且其掩码为,255.0.0.0则表示从192.0.0.0到的任何地址192.255.255.255都在同一子网中。发送给所有其他计算机的数据包不需要通过路由器,可以直接发送。发送ARP数据包以获取目标计算机的MAC地址,然后发送该数据包。

但是,如果我的电脑有IP 192.168.0.1,掩码255.255.255.128,然后在同一个子网的计算机是从IP地址经过192.168.0.0192.168.0.127而已。它们可以直接到达(发送ARP,查找MAC地址等)。例如,192.168.0.200必须通过路由器到达任何其他地址。


1
但是,为什么需要知道它是否在同一子网中?这是这里的实际问题。
grawity

3
如果目的地在同一子网中,则计算机将直接发送数据包,否则它将发送至路由器。就这样!!!!
jcbermu

@jcbermu但他的问题基于这样一个思想,即对于大多数家庭网络而言,无论如何,数据包无论如何都确实会通过路由器—无论是何时需要将其发送到外部,还是何时需要将其重定向到任何其他本地子网设备。
吞噬了极乐世界

11

关于IP的一点不明显之处在于,每个IP设备本身都是路由器

这可以在普通PC上通过命令“ route print”看到。您已连接到两个网络:本地以太网或wifi网段以及localhost网络。每个数据包都需要决定将其放在哪个网络上。

如果将计算机放在两个网络上,例如“公用”和“专用”网络,这将变得更加明显。现在,您肯定需要子网掩码,以便决定在哪个网络上发送数据包。

许多人会意外地发现具有单个网络连接的PC可能会使用错误配置的子掩码工作:他们最终只是将所有内容发送到网关。


1
我认为他的观点是,没有必要让每台设备都成为路由器。所有非路由器设备都可以将所有内容发送到路由器,即使它与发送者在同一网络上,它也可以将其转发到目标。
Barmar

@Barmar能否请您引用回复的对象和对象,否则如果您删除了他们的评论(例如您的情况),则您的评论毫无意义。如果看到上下文,您写的内容可能会很有趣,您能提供上下文标记吗?
barlop

1
@Barmar哦,好吧,如果这是您认为尚未解决的问题或重点-..答案是拥有层次结构-交换机,路由器,以减轻路由器的负担。但是,提问者对错误的想法感到困惑,因为错误的想法是所有数据包仍会到达路由器,这是问题的根源。
barlop

1
“ iprouting”设置:您可以关闭转发功能,但是需要一个路由表来知道将哪个接口用于传出数据包,即使这些选项只有“ lo”和“ eth0”也是如此。重新“将所有内容发送到路由器”:不这样做的优点在共享的layer2网络中更加明显,但是没有人再使用10base2。
pjc50 '17

1
@Barmar:“所有非路由器设备都可以将所有内容发送到路由器,即使它与发送者在同一网络上,也可以将其转发到目标。” 没有错。那样行不通。从理论上讲,它可以。实际上,事实并非如此。路由器可能会尝试通过简单地忽略与流量可能来自同一子网的流量来优化其资源。由于这实际上是(至少是某些)路由器的工作方式,因此其他设备必须足够复杂才能知道向路由器发送流量会浪费时间,否则其他设备将无法正确通信
TOOGAM

7

我在此处的其他一些答案中都提到了这一点,但我认为这可能更清楚:在具有多个网络接口的计算机上,可以使用子网掩码根据目标IP地址自动确定要在哪个物理接口上发送 IP流量。

如果要将数据包发送到连接至其中一个接口的LAN上的设备,则要知道要在哪个接口上发送数据包(如果尚未显式配置路由),计算机可以检查这些接口以查看如果subnet_mask&destination_ip == subnet_mask&interface_ip&我的意思是按位与,并且==我的意思是主张平等),并且如果存在匹配项,则选择该接口。

这样,如果您有例如:

  • 具有192.168.1.42/24的接口A
  • 具有10.0.0.15/24的接口B
  • 具有192.168.2.97/24的接口C

并且您将数据包发送到192.168.2.123并且没有设置路由,因此可以确定应该使用接口C,因为255.255.255.0&192.168.2.123 == 255.255.255.0&192.168.2.97

如果不知道子网掩码,这将是不可能的,因此您必须为向其发送数据的每个IP地址设置一条路由。


6

TCP / IP可以按照您的建议进行设计-叶子节点会将所有内容发送到路由器,并将其转发到目标,该目标可能与发送方在同一子网中。

但这不是最佳设计,原因有二:

  1. 它使用更多的带宽:同一子网中设备之间的每个数据包都必须传输两次:一次从发送者到路由器,再一次从路由器到接收器。在路由器也是网络交换机的网络上,实际上这不是任何额外的带宽,因为它无论如何都要经过交换机。但是,并非所有的网络技术都可以那样工作。最初的以太网设计是一种总线技术,没有中央交换机或中继器。

  2. 它给路由器增加了负载。即使路由器也是交换机,它也需要做更多的工作,因为它要依靠第3层路由实现,而不是更简单的第2层交换。

体现TCP / IP设计的一般原理是,终端节点是智能设备,因此假定它们能够完成某些工作。他们不必像骨干路由器一样了解完整的网络拓扑,但是他们对本地环境了解足够,可以承担一些初始的本地vs远程路由任务。实现此简单的初始路由不需要太多代码。

此外,非路由器设备不必仅在一个子网上。您可以轻松地在PC中拥有多个网卡-许多网卡同时具有以太网和WiFi。而且每个端口都可以连接到不同的子网,地址和子网掩码用于确定要使用的网卡。如果您运行虚拟机,则可能会有一个虚拟子网将它们连接到主机系统。


同时,我认为ATM网络是按这种方式设计的(可能是因为它是面向电路的)–没有广播,路由器和交换机之间没有区别。树/星型拓扑。
grawity

@grawity的确,在70年代和80年代,电信公司和学者在设计其网络时在哲学上存在很大差异。电信公司习惯于使用带有哑终端节点的智能网络(例如电话),他们设计的网络具有由核心管理的电路交换。
Barmar

5

如果我们查看路由表(这恰好是我的台式机):

IP路由

default via 172.20.25.1 dev eth1 
172.20.25.0/24 dev eth1 proto kernel scope link src 172.20.25.33 
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.1

路线

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.20.25.1     0.0.0.0         UG    0      0        0 eth1
172.20.25.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

两种视图都传达相同的信息。子网掩码指示在该网络上可以直接访问哪些主机,并使用网关找到其他主机。特别是,我们必须知道网关可访问,否则我们将无法发送数据包以进行转发。

原则上,您可以通过网关主机发送所有内容。看起来像

default via 172.20.25.1 dev eth1 
172.20.25.1 dev eth1 proto kernel scope link src 172.20.25.33 

要么

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.20.25.1     0.0.0.0         UG    0      0        0 eth1
172.20.25.1     0.0.0.0         255.255.255.255 U     0      0      

我没有尝试过,但是它可以用于MAC强制转发


有时会故意使用后一种方法。请参阅MAC强制转发
grawity

2

好的,我知道如何使用子网掩码将网络划分为多个子网,但是我的问题是,为什么网络中的每台计算机都需要知道子网掩码,而不仅仅是路由器?

人们所称的路由器设备通常不仅仅是路由器。因此,人们有时会使用诸如NAPT路由器,家用路由器或消费者路由器之类的术语来暗示它并不是纯粹的路由器。为了说明它们不仅仅是路由器,这些设备可以执行NAPT(这不是路由),并且它们内置了一个交换机(一个交换机可以桥接,这不是路由-交换机和网桥之间的区别)定义不太明确-可能会说网桥通常具有2个端口并连接不同的网络介质(例如,以太网和非以太网),而交换机将具有多个端口和相同的网络介质。交换机会桥接。

如果将交换机与“路由器”分开,那么确实会更加清楚。.当IP地址位于同一网络上时,则将数据包定向到 将电缆连接到下一个物理位置,即交换机,最终到达网络上的其他计算机(除非它是托管交换机,并且您要连接到交换机,例如telnet或http,并且该交换机具有自己的ip ),并且由于该数据包没有发往其他网络,因此该数据包不会到达路由器。当将其发送到位于不同网络上的计算机时,它当然仍然会转到交换机,然后再继续到路由器,(交换机将数据包定向到路由器,并将数据包的目标MAC地址输入到交换机将是路由器的MAC地址),并且路由会将其路由到路由器的正确接口之外。

有了这些通常称为路由器的东西,它们内部具有交换机(例如,不是专业样式的cisco / juniper路由器),那么交换机就在内部。但是那只是交换机的位置。相同的网络,则将数据包寻址到交换机而不是路由器。它仅到达路由器内部的交换机,而没有到达路由器。

我能理解,如果每台计算机都通过电线物理地相互连接,

您的意思是..如果整个网络上的所有计算机都通过电线物理连接..那么我想您就不需要交换机或路由器了。您所描述的听起来有点像原始的以太网..如果它们都用电线连接,则可能不是一个很大的网络。无论如何,它不会像您过去那样扎根。它会通过“接头”将计算机一直连接到它。所以我不知道你为什么把那句话丢进去。

但无论如何,所有数据包都需要通过路由器。

因此,您的意思是将所有计算机与没有路由器的电线连接起来的想法搁置一旁。

而且,即使在您的家庭中,它们也不会每次都经过路由器。即使使用“家庭路由器”,也可以将其称为互联网盒。他们去那里的开关。

假设我有一台计算机在网络192.168.0.0/255.255.255.0上,其IP为192.168.0.1。

如果该计算机尝试访问子网外部的计算机(例如192.168.1.1),则它将消息传输到路由器,

到交换机,然后从交换机转到路由器

路由器确定该IP在子网IP范围之外,并且与其将其传输到所连接的网络(也许是另一台路由器),而不是在子网中进行传输。

路由器可以很好地识别出它的网络接口。它从一个接口发送到另一个接口。一个区别-除了哪个接口,是网络是否直接连接。它可以先发送到交换机,然后发送到计算机。或者它可以发送到计算机。或者,如果网络没有直接连接,它将转到另一个路由器。

而你的最后一句话是

它将消息发送到路由器,

然后,您突然决定停止写作了吗?

路由器确定该IP在子网IP范围之外,并且与其将其传输到所连接的网络(也许是另一台路由器),而不是在子网中进行传输。

好吧,我不会那样说。路由器上的每个接口都有不同的IP范围。

但是,使用您的家用路由器或家用路由器时,发生的事情就像是一台具有两个接口的路由器,您一侧连接了一个交换机。并且多个端口是交换机的端口。

因此,如果您从路由器部分的角度考虑,这不像哦,这是在子网内部,而在子网之外,因为可能存在许多网络。每个界面上都有一个。而且路由器不会将其传输回来自其的同一网络。它之所以首先到达路由器的原因恰好是因为交换机(它首先到达)看到了MAC地址,因此看到的不是路由器的MAC地址。

发送该数据包的计算机将检查该数据包的目标IP是在其自己的网络上还是在同一网络上,然后根据该地址选择相关的MAC地址。它要发送到的计算机的MAC地址(即,如果计算机位于同一网络上)。或者(如果计算机在路由器的另一个接口上),则它将是路由器的MAC地址。我猜想这可能会很直接地回答您的问题的标题,即计算机为什么需要知道子网掩码。.在TCP / IP系统中,它就是这样。计算机选择相关的第2层地址,例如用于以太网的MAC地址。


1
答案比较简单,但是还可以。如果您认为那是我的最后一句话,则说明您的浏览器无法加载整个页面。
Orpedo

@Orpedo好的,我没有注意到。我已经删除了询问您是否停止写作的那行,并且我已经加入并答复了该段的其余部分。这实际上是相当关键的一段,很有趣,因为它回答了您所问问题的主题。
barlop

回复:开关VS桥。交换机通常用于透明网桥,即具有数据库(转发信息库IIRC)与MAC和端口相关联并通过从以太网帧中的源MAC中学习MAC来填充FIB的网桥。与其他类型的网桥相反,例如代理ARP网桥。交换的另一个含义是更通用的,它可以表示任何层的设备,例如L7交换基于应用程序级元数据路由连接,路由器也可以称为L3交换,...​​ </ lexicographic rant>
ninjalj

回复:路由器不会向其来源的同一网络传输任何东西:的确可以,并且还将传输ICMP重定向并告知来源:“嘿,目标在您的网络中,您可以直接与它通信”
ninjalj

@ninjalj我想如果您将集线器连接到路由器,则路由器将收到发往该网络的数据包。.但是如果您有交换机(我想人们现在除了出于诊断目的,很少有集线器了。 )..如果该数据包注定要通过该交换机返回到其起源的网络,则该交换机将不会向路由器发送数据包。当然,根据定义,将路由器和交换机组合在一起的盒子中就有一个交换机。没有将路由器和集线器结合在一起的盒子。
barlop

1

但是,当不需要计算机/设备时,为什么要为其提供子网掩码呢?– Orpedo 3月22日13:45

计算机/设备确实使用子网掩码来计算IP广播地址。

不处于混杂模式的IP接口被配置为响应IP广播地址以及它们自己的IP地址。


已经标记了答案,但这实际上是一个简短而有用的答案。
Orpedo

1
我相信这几乎是完全错误的。网络接口对IP一无所知。他们响应(并自动应用)MAC地址。这就是为什么要使用ARP:因此,如果我知道本地网络上一台计算机的IP地址,则可以了解其MAC地址并将其用于与该计算机进行通信。嗯,有一个广播MAC地址,所有广播都使用该地址。广播IP地址的存在只是为了保持一致。
G-Man说'Resstate

-1

我想创建一个帐户只是为了回答这个问题,因为我认为其他人已经使子网掩码的角色变得过于复杂。

子网掩码确定主机将与网络上的哪些其他计算机进行通信。如果主机位于我的子网之外,那么我将尝试通过网关与该计算机通信。如果该主机在我的子网内,那么我将直接与该主机通信(无需网关)。此外,如果主机子网外部的计算机尝试与其通信,则这些数据包将落入耳聋,并立即被丢弃。

为什么这与您有关?因为如果我们不使用网络掩码,则尝试与Google的DNS服务器(8.8.8.8)进行通信将需要您(以及与之通信的其他所有主机)知道其物理地址(MAC地址)。这将导致您的计算机和所有其他计算机都需要为您与之交谈的每台互联网计算机创建ARP条目。由于机器的物理地址超出了所需的范围,这将浪费您的RAM并降低所有网络的速度。


前面我曾说过,如果我们不使用网络和网关会发生什么,我的意思是如果我们不使用网络掩码会发生什么。如果我们不使用网关和网络...。互联网将是一个巨大的扁平网络,为了与Google的DNS服务器进行通信,您将不得不在整个互联网上广播数据包,并查看Google是否响应。互联网将立即与所有人进行这种广播通信而中断。
Szeraax

1
两种没有子网掩码的工作模式–主机尝试直接访问L2上的所有内容,或者使用L3网关来处理所有内容。您以为前者是唯一的选择,但是事实并非如此-最初的问题和所有其他答案更多地是关于后者的模式,后者甚至在某些网络中得到了实际使用。
grawity
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.