局域网是如何工作的?
IP, ARP, LAN的一些思考
Table of Contents
背景
我有一个无显示器的小主机,在家一直靠分配的静态IP地址+SSH连接。最近开学了,小主机隧跟随我回来了学校里,但是学校的网段与家里的网段是不同的,所以直接跨网段连接一直是不成功的。我就尝试将电脑的静态IP地址强制设置为与家庭网络相同的子网后,再次通过原有的静态IP地址连接到了小主机。迫于学业不精,关于为什么能行我一直没有想明白,于是就有了这篇博客。
问题描述
如下图所示,在局域网内有两个网段192.168.1.x/24
和192.168.2.x/24
,但是在192.168.1.x/24
网段中误入了两个主机C和主机D,它们的IP地址分别是192.168.2.5
和192.168.2.6
。
那么现在的问题是:
- 子网划分必须依靠路由器吗?在只有交换机的环境下可以划分子网吗?
- 主机C和主机D可否传递数据?
- 主机A访问
192.168.2.5
时,是直接与主机C建立连接还是会通过网关连接到主机H? - 主机A在
192.168.1.x/24
中发送ARP广播,主机C和主机D是否会应答? - 网关可以不与主机在同一个网段下吗?
- 一个子网可以有多个网关吗?
- 网关和路由器的关系?
- 一个网关可以连接两个网络吗?
基础知识
在回答上述问题时需要先了解一些基础知识。
网络设备
交换机(Switcher)是一个工作在第二层的设备,隔离冲突域,不隔离广播域。
路由器(Router)是一个工作在第三层的设备,隔离广播域。
通过IP主机之间传递数据
当前有主机A和主机B,其中主机A向主机B发送一个数据(A,B均代表一个IP地址,R代表路由器的地址):
- 主机A将要发送数据,源IP地址设置为A,目的IP地址设置为B;
- 主机A查询路由表,匹配默认路由,选定下一跳为R并选定相应的出口;
- 主机A将包发出;
- 路由R收到该数据包,查路由的路由表,匹配链路本地路由并选择相应的出口en1;
- 路由R处理该数据包(TTL 减一,重算 checksum),然后从 en1 发出;
- 主机B收到该数据包,并处理。
ARP
ARP(Address Resolution Protocol)是一个在IPv4协议下将IP地址转换为MAC地址(Media Access Control Address)的协议,工作于网络模型的第二层和第三层之间。1
不同于IP的广播方式,ARP广播是通过帧的形式进行广播,其发送的广播帧的目的MAC地址为FF:FF:FF:FF:FF:FF
23,因此该广播会作用于整个广播域,即位于广播域内的所有主机都会接收到该消息。
在广播帧的内部携带有IP地址,如果在广播域内的主机发现其IP与自己是相同的,则对该广播进行应答,源主机收到应答后则可以获得在该局域网下目标IP地址与MAC地址的对应关系。
路由表(Routing Table)
4路由表是是一个路由规则集合,主要用于决定一个数据包如何转发。所有采用IP方式的设备(包括路由器和交换机)都需要自己维护一个路由表。
路由表主要包含的字段5:
- Network ID: 网络标识;
- Subnet Mask: 子网掩码;
- Next Hop: 下一跳IP地址,也就是所谓的网关(Gateway);
- Outgoing Interface: 网络出口;
- Metrics: 抵达目的网段的花费。
路由表可以用于存放以下类型的路由:
- Directly Attached Network IDs
- Remote Network IDs
- Host Routes
- Default Route
- Destination
路由表的类型:
- 静态路由
- 动态路由
RIP
6RIP使用到目的地址的跳数(Hop Count)作为metrics,AD7值为120,是一个应用层协议,端口号使用520。
选择最佳的路由路径就要求跳数最小,在RIP协议中最大的跳数为15,如果跳数等于16,则认为从源地址到目的地址的网络是不可达的。
RIP的特点是:
- 定期与网络交换路由信息;
- 更新路由信息是通过广播完成的;
- 在更新路由表时会发送当前完整的路由表;
- 路由永远信任周围路由传来的信息(Routing on rumours)。
RIP版本8:
RIPv1 | RIPv2 | RIPv3 |
---|---|---|
IPv4 | IPv4 | IPv6 |
Broadcase at 255.255.255.255 | Multicast at 224.0.0.9 | Multicast at FF02::9 |
Classful routing protocol | Classless protocol, supports classful | Classless updates are sent |
Classful routing protocol在更新过程中不携带子网信息,也就是说RIPv1运行在大家子网大小相同的前提下。而且在RIPv2中采用多播的方式与邻居交换数据表,相比广播的方式更节省资源。
问题解答
子网划分必须依靠路由器吗?
是的但不准确。准确的说子网划分必须依靠网关,因为路由表的交换工作是基于网络层的,仅交换机是无法完成子网划分的。虽然这样但是不影响主机C和主机D的通讯,详见下面解答。
主机C和主机D可否传递数据?
可以。因为主机C和主机D是在同一个子网,在主机C和主机D的路由表中至少有一个条表明自己子网的ID,因此路由会认为这是本地连接而直接使用ARP去获取IP地址对应的MAC地址,上面提到了ARP广播是作用于广播域的,不受IP子网划分的影响。
主机A访问192.168.2.5时,是直接与主机C建立连接还是会通过网关连接到主机H?
连接主机H。从主机A的角度来看,它维护的路由表中首先表明与192.168.2.5不是同一个网段的,因此该数据包将会发网网关(Next Hop),在这个场景下其实就是路由器,在数据包到达路由器之后会根据路由器的路由表进行下一步转发,最终转发到主机H。
主机A在192.168.1.x/24中发送ARP广播,主机C和主机D是否会应答?
可以收到ARP广播但是不会应答,因为如果主机A发送ARP广播,必定是寻找与主机A同一子网下的其他设备,主机C和主机D由于所在的子网不同,因此不会应答。
网关可以不与主机在同一个网段下吗?
可以。大部分情况下网关必须和主机在同一个网段下,因为网关负责指定数据包的下一次转发到哪的重任。但是在利用隧道技术后,可以实现网关不与主机在同一个网段下9。
一个子网可以有多个网关吗?
当然可以。每一个网关都可以连接不同的子网,只需要在交换路由表的过程中将网络信息进行交换即可。但是对应一个主机包含一个默认网关,也就是我们在主机中设置的网关,在找不到可以用的网关时,就把数据包发给默认指定的网关,由这个网关来处理数据包。10
网关和路由器的关系?
网关是一个逻辑概念。网关实质上是一个网络通向其他网络的IP地址,是自己出口的IP地址,也是别人入口的IP地址,就像一个出入的网络关口。10
路由器=电脑+数据转发(网关功能),所以任意一台主机在加入了数据转发功能后,都可以被认为是一个路由器。
一个网关可以连接两个网络吗?
[Thanks to ByteDance]不行。首先一个网关需要一个确定的IP地址,一个IP地址要不然在子网A中,要不然在子网B中,所以即使是一个物理路由器,但是在连接两个不同子网的情况下,内部也至少有两个网关来保证数据转发的。
https://searchnetworking.techtarget.com/definition/Address-Resolution-Protocol-ARP#:~:text=ARP%20broadcasts%20a%20request%20packet,and%20proceed%20with%20the%20communication↩
https://www.ccnahub.com/ip-fundamentals/understanding-arp-broadcast-message/↩
https://www.homenethowto.com/switching/broadcasts/#:~:text=A%20device%2C%20such%20as%20a,else%20on%20that%20local%20LAN.&text=Therefore%2C%20the%20computer%20sends%20out,back%20with%20an%20IP%20address↩
https://www.geeksforgeeks.org/routing-tables-in-computer-network/↩
https://www.geeksforgeeks.org/routing-information-protocol-rip/↩
Administrative distance(AD) is the feature that routers use in order to select the best path when there are two or more different routes to the same destination from two different routing protocols. Administrative distance defines the reliability of a routing protocol.See in CISCO↩