![](/style/images/good.png)
![](/style/images/bad.png)
tcp/ip 协议栈中,子网掩码是存哪的?
source link: https://www.v2ex.com/t/788054
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
路由器,A 口网段:192.168.128.0/24,B 口网段:192.168.128.0/23,如果有人给 192.168.128.0/24 网段的某个机器发了个数据报,路由器怎么知道是转发给 A 口还是 B 口?
第 1 条附言 · 22 小时 1 分钟前
我的问题是:
路由器配置静态路由表,把 192.168.128.0/24 的流量全部转发到 A 口,把 192.168.128.0/23 的流量全部转发到 B 口,如果有人给 192.168.128.7 这台主机发送数据,因为数据报中没有关于子网掩码的数据,路由器怎么知道把这个数据包转发到哪个口?
看了大家回复,
1. 有人说路由器的静态路由表不允许这么配置。
2. 有人说根据最长匹配原则,192.168.128.7 这个地址可以匹配 A 口 192.168.128.0/24 这个网段的 24 位,而只能匹配 B 口 192.168.128.0/23 这个网段的 23 位,根据最长匹配规则应该会把这个数据包转发到 A 口。
到底哪个答案是正确的呢?
我之前从没配置过路由器,路由器配置界面长啥样的我记得和 linux 的终端差不多,但是谢希仁那本《计算机网络》我感觉我学的真的还算可以的啊,@raaaaaar 15 楼回复,我不记得那本书里哪里介绍了关于此知识的内容啊。 @Tianao 12 楼的回复的后半段我没看懂,请问那些知识是不是思科认证才能接触到的啊?
ThirdFlame 1 天前
路由表 路由条目根据生成方法可以分为 直连路由、静态路由、动态路由
路由器根据 A 口、B 口配置的 IP 地址 /掩码 自动生成相应的直连路由。
lolcat 1 天前
lolcat 1 天前
lolcat 1 天前
v2mm 1 天前
但是比如 192.168.129.7,则
192.168.129.7 取前 24bit == 192.168.129.0 不走 A 口
192.168.129.7 取前 23bit == 192.168.128.0 走 B 口
qbqbqbqb 23 小时 58 分钟前
Tianao 23 小时 57 分钟前 via iPhone
路由器的以太网接口等广播型三层接口(还包括但不限于 dot1q 子接口、vlan 虚接口)不允许这么配,会提示网段冲突。
如果是 loopback 口、地址借用等情况确实配上了,此时适用最长匹配原则。
qbqbqbqb 23 小时 45 分钟前
比如说 192.168.128.7/24 和 192.168.128.7/23,这就是一个 IP 地址,只能代表一台主机(绝对不能将其理解为两个网段中的两个不同主机,这是一种常见的误解,如果在相互连接的网络中这样配置两台主机的话会导致 IP 冲突),只是说配置前者的话系统会认为它的网段有最多 254 台主机这么大,配置后者的话系统会认为它的网段有最多 510 台主机那么大。
Tianao 23 小时 39 分钟前 via iPhone
总而言之,楼主现在的基础知识决定了这样纠结这个问题没有意义,只会成为“思而不学则殆”的典型。
cpstar 23 小时 15 分钟前
按道理,掩码只负责子网判定,跟 IP 无关,所以按照 LZ 描述,A 口 B 口可以同时设置 192.168.128.5,那显然这是不允许的。
CRVV 20 小时 56 分钟前
ip route add 192.168.128.0/24 dev eth0
ip route add 192.168.128.0/23 dev eth1
这么配置完,走 eth0
如果是给 interface 这么设置,Linux 上也可以配置出来,但这是很奇怪的配置,没人这么用。
网络里面通常认为一个 IP 地址对应唯一一台机器,如果设置成这样
eth0 192.168.128.1/24
eth1 192.168.128.2/23
那么 192.168.128.3 同时属于这两个网络,那么当然会认为这是一台机器而不是两个子网里的两台机器,这个数据包要怎么发给这一台机器是无所谓的事情,总能到。
子网掩码不是一个网络的属性,也不是一个地址的属性。它本身唯一的作用就是表示一组连续的 IP 地址,然后这一组 IP 地址叫做一个子网。
比如 ip route add 192.168.1.0/24 via 10.2.3.4 一次设置了 256 个 IP 地址的路由,不用一个一个加路由。
给 interface 设置的子网掩码是告诉电脑哪些 IP 地址和本机是直连的,这些直连的 IP 可以直接走数据链路层通信( ARP 协议),不用经过路由器。和本机直连的 IP 地址也不一定是连续的,你可以在一个 interface 上设置多个 IP 地址和子网掩码。和设置路由一样,一次设置一组,不用一个一个加,仅些而已。
这种事情找几台机器,至少要有一台带两个网卡的,连起来玩一下就知道了。
Tianao 20 小时 44 分钟前 3
「看了大家回复,
1. 有人说路由器的静态路由表不允许这么配置。
2. 有人说根据最长匹配原则,192.168.128.7 这个地址可以匹配 A 口 192.168.128.0/24 这个网段的 24 位,而只能匹配 B 口 192.168.128.0/23 这个网段的 23 位,根据最长匹配规则应该会把这个数据包转发到 A 口。
到底哪个答案是正确的呢?」
首先,192.168.128.0/24 192.168.128.0/23 是两个网络地址而不是主机地址,因此不能配置到普通接口上。如果 A B 两个口都是工作在三层模式的以太网接口,那么路由器不允许配置为两个接口分别配置 192.168.128.1/24 192.168.128.1/23 这样两个地址,在配置好一个之后,再配置另一个时会被拒绝并报错。
其次,假设两个地址配置成功后,路由器会自动生成去往这两个网络的直连路由。
然后,现代路由器路由器在实际执行路由转发时的直接参照是 FIB (转发信息表)而不是路由表(路由表不一定包含物理出接口,也没有下一跳的目的 MAC 地址),而 FIB 是根据全局路由表(有时候被称为系统路由表或者优选路由表)及其他表项生成的。
再然后,全局路由表是通过参照各协议路由表经路由优选后得出的。路由优选的一个原则是路由协议的管理距离优,比如,直连路由的管理距离优于手工静态路由,也就是说对于去往同一目的网络(即网络地址和掩码均完全相同)的路由,直连路由永远会在优选中胜出(除非手动干预路由协议的管理距离),也就是说,在楼主假想的这种情况下,手工配置的静态路由永远不会「成为活跃路由生效而参与 FIB 的构建进而影响最终路由选路和转发执行」。
最后,路由器在针对特定目的主机地址( 192.168.128.7 )在存储 FIB 的 TCAM (三元内容可寻址寄存器)中执行硬件查表时,才会用到并遵循最长匹配原则,此时路由器为目的主机地址 192.168.128.7 匹配到了具有最长匹配位数的 192.168.128.0/24 表项,并从此直连路由出接口送出。全程和静态路由没有半毛钱关系。
而且,以上的前提是,这两个重叠的接口地址可以被配置上去并生效。
Tianao 20 小时 32 分钟前
不是静态路由不允许这么配,是接口地址不允许这么配。静态路由可以这么配,但是配了也不会生效(成为在优选中胜出的活跃路由并被显示在全局路由表)。
www5070504 20 小时 15 分钟前
CRVV 19 小时 39 分钟前
libook 19 小时 38 分钟前
子网掩码一般都是设备自己知道,用于推算网络基本情况的,这个要么是走 DHCP,要么是静态配置,而不是在每个数据包发送过程中夹带的。
而路由器自己维护路由表,所以有自主权决定数据包怎么转发(而不是终端来告诉路由器应该发给 A 口还是 B 口,这样就变成了终端在越殂代疱了),通常的情况是路由器同时接入两个不重合的网段,根据发送者的 IP 和接收者的 IP 来看落在哪个 IP 段里,就走转发到哪个线路。所以如果两个网段是重合的,那么就得看路由器是什么策略,这个如果没有统一的标准的话就可能是不同路由器、不同配置会有不同结果。
xuanbg 5 小时 26 分钟前
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK