周末回了一趟老家,本来我家是两条光纤网络,对应两个Wi-Fi路由器,突然听我妈说有一个Wi-Fi最近不好用,当时我就想,作为一名"顶尖"程序员并同时兼任一名已经持证的网络工程师,连自己家的网络竟然都会出问题,这就好比在荆州城下说关云长不会用刀,就好比在许昌城下说曹孟德不会作诗,就好比......,实在是士可忍孰不可忍,顿时就来了兴趣,动手之前先确立目标:一小时内必须搞定!
首先确认下终端表现的具体问题
我们先定义正常的Wi-Fi代号为Wi-Fi-A,出现异常的Wi-Fi代号为Wi-Fi-B,当手机连接Wi-Fi-B时会显示"无IP分配",当电脑连上Wi-Fi-B时会显示IP地址为169.254.xxx.xxx,但是访问部分网站正常:
当另一台电脑连接Wi-Fi-B有线网时会显示一直在"获取地址中":
即使连接成功之后也看不到正常的IPv4地址:
分析问题,其实看到第一台电脑连接Wi-Fi-B的时候IP地址为169.254大致就可以判断出问题的原因。
当本机的IP地址显示为169开头时,这通常指示着一个特定的网络问题,主要是与DHCP(动态主机配置协议)的分配有关。具体来说,以169.254开头的IP地址是链路本地地址(也称为自动专用IP寻址或APIPA),这是由RFC 3927定义的。这类地址主要在DHCP客户端无法从DHCP服务器获得IP地址时自动生成,用于在本地网络中进行基本的通信。
为了在分析问题的过程中多学习一些,我们从头开始梳理,第一个问题:设备的IP地址从哪里来?为什么需要IP地址?
1 IP地址的缘由
随着互联网的发展,需要一种机制来唯一标识网络中的每台设备,以便实现设备间的通信。IP地址的诞生正是为了解决这一问题。
在技术上,早期的网络环境中,主机数量较少,人们可以通过主机名或物理地址来识别设备。但随着网络规模的扩大和主机数量的激增,这种方法变得不再可行。因此,需要一种统一且能够唯一标识设备的地址格式,即IP地址。
IP地址是基于TCP/IP协议(传输控制协议/互联网络协议)产生的。TCP/IP协议为互联网通信提供了基础框架,而IP地址则是该框架中用于标识设备的关键元素。
1.1 IP地址的主要作用
1)设备标识:IP地址可以唯一地标识互联网中的每个设备,包括主机、路由器、工作站等。这种唯一性确保了数据能够准确地发送到目标设备。
2)数据路由:IP地址在网络通信中起着路由的作用。当数据需要在网络中传输时,路由器会根据IP地址来确定数据的传输路径,确保数据能够按照正确的路径到达目标设备。
3)网络管理:通过IP地址,网络管理员可以对网络中的设备进行管理和监控。这包括配置网络设置、排查故障、优化网络性能等。IP地址使得网络管理员能够快速地定位到问题设备,并采取相应的解决措施。
4)访问控制:IP地址还可以用于区分不同设备的访问权限,实现网络安全机制。例如,通过IP地址过滤技术,可以限制某些设备对特定网络资源的访问,从而保护网络免受未经授权的访问和攻击。
5)地址解析:虽然IP地址在网络层是唯一的,但在数据链路层(如以太网)中,数据帧的传输是通过MAC地址进行的。因此,在实际发送IP报文时,还需要进行IP地址和MAC地址的匹配。这一过程通常由ARP(地址解析协议)完成。
综上所述,IP地址的缘由在于满足互联网通信中设备标识、数据路由、网络管理和访问控制等需求。而其作用则体现在这些方面,为互联网通信提供了坚实的基础。随着互联网的不断发展,IP地址的重要性也将日益凸显。
1.2 IP地址的构成
IP地址由“网络号”(Network ID)和“主机号”(Host ID)两部分组成。这两部分共同构成了一个完整的IP地址,用于标识网络中的每一台设备。
在IPv4中,根据地址的前几位的不同,IP地址被分为不同的类型,主要有A、B、C、D、E五类:
A类地址:范围从1.0.0.0到126.255.255.255,第一个字节为网络号,后三个字节为主机号。
B类地址:范围从128.0.0.0到191.255.255.255,前两个字节为网络号,后两个字节为主机号。
C类地址:范围从192.0.0.0到223.255.255.255,前三个字节为网络号,最后一个字节为主机号。
D类地址:范围从224.0.0.0到239.255.255.255,用于多播(Multicast)通信,即一组设备同时接收相同的数据。
E类地址:地址范围从240.0.0.0到255.255.255.255,保留用于未来发展和实验用途。
特殊地址:
- 0.0.0.0:在服务器中,表示本机上的所有IPv4地址;在路由中,表示默认路由。
- 127.0.0.1:是一个特殊的回环地址(Loopback Address),用于本机测试,代表本机IP地址。
- 255.255.255.255:是一个广播地址,用于向同一子网内的所有主机发送广播消息。
1.3 IPv4和IPv6
IPv4:是当前广泛使用的第四版互联网协议,使用32位地址空间。由于地址空间有限,IPv4总共可以分配约42亿个地址。表示方法主要是由四个十进制数表示,每个数范围为0-255,采用点分十进制表示法,如192.168.0.1。
IPv6:是IPv4的后继协议,旨在解决IPv4地址空间的限制和其他问题。IPv6使用128位地址空间,理论上可以分配约340万亿亿亿亿个地址,几乎提供了无限大的地址空间。表示方法由八个四位十六进制数表示,每个数范围为0-FFFF,采用冒号分隔的八进制表示法,如2001:0DB8:AC10:FE01::。此外,IPv6还允许使用缩写形式,如省略前导零和连续的零组。
2 设备的IP地址从哪里来?
动态分配(DHCP方式):设备可以通过与部署在网络中的DHCP(动态主机配置协议)服务器交互来获得IP地址。每次设备通过DHCP方式获取的IP地址可能是不同的,这种方式也是动态的。
静态分配:手动分配IP地址。
3 DHCP简介
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一种网络协议,用于使网络中的设备能够自动获取其IP地址和其他相关配置信息,如子网掩码、默认网关、DNS服务器地址等。DHCP简化了网络管理,特别是当大量设备需要接入网络时,它允许这些设备从DHCP服务器自动获取配置,而无需手动配置每台设备。
DHCP的主要功能和优点包括:
1)自动化配置:设备连接到网络时,会自动从DHCP服务器请求IP地址和其他网络配置信息,从而省去了手动配置的麻烦。
2)集中管理:网络管理员可以在DHCP服务器上集中管理所有设备的IP地址分配,包括分配、回收、续租等操作。
3)提高灵活性:由于IP地址和其他配置信息是由DHCP服务器动态分配的,因此可以更容易地适应网络变化,例如增加或减少网络中的设备。
4)节省IP地址:DHCP通过自动回收不再使用的IP地址,可以更有效地利用有限的IP地址资源。
5)安全性:DHCP支持一些安全特性,如DHCPv6中的隐私扩展(Privacy Extensions),可以防止用户的MAC地址在网络中泄露。
DHCP的工作流程大致如下:
1)发现阶段:新接入网络的设备(称为DHCP客户端)在本地网络上发送DHCP DISCOVER消息,请求IP地址和其他配置信息。
2)提供阶段:网络上的DHCP服务器收到DHCP DISCOVER消息后,会发送DHCP OFFER消息作为响应,其中包含IP地址、子网掩码、默认网关、DNS服务器地址等配置信息。
3)选择阶段:如果有多台DHCP服务器响应,DHCP客户端会选择一个(通常是第一个)响应的服务器,并向该服务器发送DHCP REQUEST消息,确认选择。
4)确认阶段:被选中的DHCP服务器会发送DHCP ACK消息作为确认,完成IP地址和其他配置信息的分配。
5)重新配置或续租:DHCP客户端在租约到期前会发送DHCP REQUEST消息请求续租,或者如果其配置信息发生变化(如子网掩码更新),则会请求重新配置。
DHCP是现代网络中不可或缺的一部分,它极大地简化了网络管理,提高了网络的可扩展性和灵活性。
4 为什么DHCP的IP地址会被用完?
DHCP的IP地址池耗尽通常发生在多种场景下,这些场景主要与网络规模、设备数量、配置管理以及潜在的网络安全问题相关。以下是可能导致IP地址池耗尽的几个主要场景:
1)网络规模扩大:随着网络的不断扩展,新设备不断加入网络,如果DHCP服务器的IP地址池没有相应地增加,那么当新设备尝试从DHCP服务器获取IP地址时,可能会发现地址池已经耗尽。
2)IP地址分配不合理:在网络规划阶段,如果没有合理规划IP地址的分配,例如为较小的子网分配了过多的IP地址,或者为大型网络分配了过少的IP地址,都可能导致IP地址池在实际使用中迅速耗尽。
3)IP地址浪费:如果网络中存在大量不再使用的设备,但它们的IP地址没有被及时回收(例如,由于DHCP租期设置过长或设备没有正确地从网络中注销),这些地址将被浪费,从而减少了可用IP地址的数量。
4)攻击行为:在某些情况下,攻击者可能会通过发送大量的DHCP请求来耗尽IP地址池。这种攻击方式被称为DHCP耗尽攻击或DHCP泛洪攻击。攻击者通过伪造MAC地址或改变CHADDR字段来发送大量的DHCP Discover报文,导致DHCP服务器不断分配IP地址,直到地址池耗尽。
5)配置错误:DHCP服务器的配置错误也可能导致IP地址池耗尽。例如,如果DHCP服务器被配置为对特定的客户端或设备组分配静态IP地址,而这些地址没有被正确地从地址池中排除,那么这些地址在动态分配时仍然会被视为可用,从而导致地址池的有效容量减少。
6)设备故障:网络设备(如路由器、交换机或DHCP服务器)的故障也可能间接导致IP地址池耗尽。例如,如果DHCP服务器出现故障,它可能无法正确地管理IP地址的分配和回收,从而导致地址池的有效利用率降低。
5 解决问题
分析完出现问题的主要原因后,我们开始着手解决问题。
首先重启一下路由器,确保至少有一个设备能得到IP分配,最好是使用一台连接过路由器的设备,然后我们进入设备网关地址,登录管理页面,网关地址一般会在设备说明页标识,初始的账号和密码也会一并列出。
登录上设备后台之后我们看下局域网配置中的DHCP配置,发现一个很明显的问题:IP地址池的IP数量只有14个,虽然我家的设备数量一般不会超过14个,但是一旦某天来了很多客人都连接同一个Wi-Fi的话IP地址很可能不够用。
解决方式就是将IP地址池进行扩容:从192.168.1.2~192.168.1.15调整到192.168.1.2~192.168.1.100
然后我们重启路由器:
发现Linux设备马上就有了IP地址,就是扩大后的IP地址池范围内的,网络也马上回复了正常:
同时其他有问题的设备也都恢复了网络。
6 小总结
DHCP的IP地址池用完确实是可能导致IP地址显示为169开头的原因之一。当DHCP服务器的IP地址池耗尽,即所有可用的IP地址都已被分配出去时,新加入网络的设备将无法从DHCP服务器获得有效的IP地址,因此它们会自动生成一个以169.254开头的链路本地地址(APIPA地址)进行通信。
事后我分析了一下我家的大致网络拓扑,发现确实有问题的那一台路由器(图中右侧)设备数量很多,并且由于密码相对简单,也常被作为访客Wi-Fi,但按理说当设备租约过期后它的IP地址应该被释放掉,常驻的设备应该不到IP地址池中IP地址的总数量,但为什么还是有IP地址不够用的现象?
在网上查阅资料后发现可能有如下几个原因:
1)IP地址回收不及时:
DHCP客户端在租约到期时通常会尝试续租,如果续租成功,则IP地址的租期会延长。然而,如果DHCP客户端在租约到期前未能成功续租,或者DHCP服务器未能及时响应续租请求,那么该IP地址理论上应该被释放回地址池。但在实际操作中,由于网络延迟、服务器负载过高等原因,可能导致IP地址回收不及时。
此外,当DHCP客户端关闭或离开网络时,如果没有正确地发送DHCP RELEASE报文来释放IP地址,那么该IP地址也可能不会立即被回收。
2)IP地址分配策略:
DHCP服务器的IP地址分配策略也可能导致IP地址的快速耗尽。例如,如果DHCP服务器配置了较短的租约时间,并且网络中的设备数量较多,那么IP地址的分配和释放频率就会增加,从而导致IP地址池中的可用地址数量快速下降。
3)网络故障或配置错误:
网络故障或DHCP服务器的配置错误也可能导致IP地址的分配和回收出现问题。例如,网络中的环路、DHCP服务器的配置冲突等都可能导致IP地址无法正确分配或回收。
针对这些问题,可以采取以下措施来缓解IP地址耗尽的情况:
- 延长DHCP租约时间,减少IP地址的分配和释放频率。
- 根据网络的实际需求来合理设置DHCP地址池的大小。
- 定期检查和维护网络设备,确保DHCP服务器和网络设备的正常运行。
- 使用静态IP地址分配方式为关键设备分配固定的IP地址,以减少对DHCP地址池的依赖。
- 监控网络的IP地址使用情况,及时发现并解决IP地址耗尽的问题。
其实上面还有一个问题很值得探究,为什么本机的IPv4地址为169.254.xxx.xxx还是能访问部分网站?
当IP地址为169.254开头时,能够访问部分网站可能与IPv6地址的存在有关。
现代操作系统和网络设备通常同时支持IPv4和IPv6两种网络协议。即使设备的IPv4地址是169.254开头的私有地址,无法直接访问公网,但如果该设备同时也被分配了有效的IPv6地址,那么它仍然可以通过IPv6协议访问支持IPv6的网站和服务。
许多现代设备都采用了IPv4和IPv6双栈配置,这意味着它们可以同时处理IPv4和IPv6流量。当IPv4地址无法使用时,设备可以自动切换到IPv6进行通信。
综上所述,当设备的IP地址为169.254开头时,它能够访问部分网站的原因可能是因为它同时也被分配了有效的IPv6地址,并且这些网站支持IPv6访问。然而,需要注意的是,并非所有网站和服务都支持IPv6,因此设备的互联网访问能力仍然可能受到限制。为了获得更全面的互联网访问能力,建议检查设备的网络配置和兼容性设置,并确保它们能够充分利用IPv6的优势。