1. 从“你家宽带断了”说起:IP地址到底在干什么
先讲个我真实遇到过的事情。有次亲戚打电话说家里电脑上不了网,我问他“你电脑IP地址是多少”,对面沉默了几秒,回了句“什么叫IP地址?在哪个地方看?”——这种对话我相信搞过运维或者帮人修过电脑的朋友都不陌生。IP地址这个东西,天天挂在嘴边,但真要解释清楚它是干什么的,很多人反而是模糊的。
其实你完全可以把IP地址理解成网络世界的“门牌号”。快递员要给你送包裹,必须知道你住在哪个城市、哪条路、几栋几号;网络里的数据包要到你的电脑上,同样需要知道你的设备在网络里的具体位置。这个位置信息,就是IP地址。
那为什么说它是“门牌号”而不是“身份证号”?因为电脑本身还有一个更底层的身份标识叫MAC地址,是出厂时烧录在网卡里的,理论上全世界唯一。MAC地址更像身份证号,你搬家了身份证号不会变,但收快递的地址必须跟着你住的地方变。IP地址就是那个可以随时变化的“住址”,它反映的是你的设备当前在哪个网络里,而不是你的设备是谁。
这个区别很重要。我见过不少刚入门的朋友,一上来就纠结“IP地址是不是就是用来标识电脑身份的”,搞反了逻辑。IP地址的核心作用是寻址和路由,它解决的是“数据该往哪儿送”的问题,而不是“这个设备是谁”的问题。这两者分工不同,缺一不可。
还有一层关系也得说清楚。我们平时上网,访问一个网站,你打的是域名,比如baidu.com,但网络底层根本不认识域名,它只认IP地址。这中间还有一个叫DNS的东西在帮忙翻译,相当于电话簿,把域名翻译成对应的IP地址。所以IP地址是网络通信里真正被路由设备理解和转发的核心标识,它的重要性怎么强调都不为过。
这篇文章不准备讲太深的路由协议,也不准备堆一堆理论,就围绕IP地址本身,把它的结构、分类、配合使用的子网掩码和网关,以及日常排查问题时的实操方法讲透。不管你是在配路由器、查服务器网络,还是复习网络基础,读完之后应该能对IP地址有个成体系的认识。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. IPv4地址的命理结构:32个二进制位是怎么编排的
2.1 点分十进制与五类地址的前世今生
我们现在最常说的IP地址,指的是IPv4地址。它本质上是一个32位的二进制数,但32个0和1连在一起人没法看,所以把它分成四组,每组8位,再把每组的二进制转换成十进制,中间用点隔开。比如 192.168.1.1,这个方法叫“点分十进制”。
为什么要分成4段?因为32位二进制分成4个字节,每个字节最大值是255(二进制11111111),所以一组数字的范围是0到255。这也是为什么你看到的合法IPv4地址,每一段不可能超过255。下次有人跟你说“我的IP是192.168.256.5”,不用思考,这地址是非法编造的,因为256这个数根本放不进8位二进制里。
在早期互联网设计时,人们把IPv4地址按照首位二进制数字分成了A、B、C、D、E五类:
- A类:第一个字节1到126,默认子网掩码255.0.0.0,用于超大规模网络
- B类:第一个字节128到191,默认子网掩码255.255.0.0,用于中型网络
- C类:第一个字节192到223,默认子网掩码255.255.255.0,用于小型网络
- D类:224到239,组播地址
- E类:240到255,保留研究用
这套分类在互联网早期很好用,网络设备看到第一段数字就知道该怎么划分网络位和主机位。但现在基本没人按这个死板的分类去规划网络了,原因很现实:A类一个网络里有1600多万个地址,小公司根本用不完;C类又只有254个地址,一个几百人的公司又不够用。如果强行按A/B/C分,要么浪费得要命,要么捉襟见肘。所以后来出现了CIDR(无类域间路由),用“IP地址/前缀长度”的方式灵活划分网络。比如 /26 就是告诉路由器,前26位是网络位,剩下6位是主机位。
2.2 公网、私网和回环地址:127.0.0.1到底是什么
很多人刚学IP地址时会被“公网地址”和“私网地址”绕晕。我打个比方:公网地址是全球唯一且可以在互联网上直接路由的地址,相当于你家在世界地图上的精确坐标,别人要跨国给你寄快递,必须靠这个坐标;私网地址是只在局域网内部使用的地址,相当于你所在小区内部的楼栋号,在小区外面没人认这玩意儿。
IANA规定了三段私网地址范围,分别是:
- 10.0.0.0/8,从10.0.0.0到10.255.255.255
- 172.16.0.0/12,从172.16.0.0到172.31.255.255
- 192.168.0.0/16,从192.168.0.0到192.168.255.255
你在家路由器上看到的IP,基本就是192.168开头的,这就是典型的私网地址。它只在你的局域网里有效,出了路由器,互联网上的设备根本不认识它。那私网地址的电脑怎么上网?靠NAT(网络地址转换),路由器把私网地址转换成自己拥有的公网地址发出去,再把回来的数据转发给对应的内网设备。这个过程就像公司前台统一收发快递,外界的快递只认公司地址,前台再按工位号分发给每个人。
还有个地址是几乎每台电脑上都存在的,就是 127.0.0.1,它叫“回环地址”,代表设备自己。你往127.0.0.1发数据包,这个包根本不会离开本机网卡,而是直接回环到本机的网络协议栈。平时我们访问localhost,解析到的就是127.0.0.1。这个地址有什么用?一是本机自测,比如你在自己电脑上装了MySQL,然后本机程序连接127.0.0.1,验证服务有没有正常监听;二是开发调试,本机跑个Web服务,浏览器访问127.0.0.1就能测,不需要经过局域网。记住一个特征:127.0.0.0/8整个段都是回环地址,只是大家习惯上只用 127.0.0.1。
2.3 CIDR带来的变化:为什么现在很少提“几类地址”了
前面提到A/B/C类地址是死板的“一刀切”,CIDR则把“前多少位是网络位”这件事完全灵活化了。比如 /26,意思是前26位是网络位,后6位是主机位。为什么用26?因为你需要算一下自己网络里要容纳多少个设备,然后倒推回去。
具体怎么算?主机的可用地址数用公式 2^(32-前缀长度) - 2,减掉的2个地址,一个是网络地址,一个是广播地址。我们拿热搜里那条“10.10.7.64/26 有多少个可用IP地址”来实际算一遍。
前缀长度26,说明主机位是32减26等于6位。2的6次方是64,再减2,得到62个可用IP地址。网络地址是10.10.7.64(主机位全为0),广播地址是10.10.7.127(主机位全为1),可用地址范围从10.10.7.65到10.10.7.126。这个例子里我还注意到,10.10.7.64这个网络地址本身是能被256整除的,这类地址在做子网划分时很常见,很多人会误以为它是普通可用地址,实际上它是网络号,不能分配给设备用。
CIDR带来的好处是,你可以根据自己的实际设备数量去“裁剪”地址段。假设你公司有50台设备,用 /26 刚好;如果有200台设备,那就用 /24。这种灵活的划分方式,让IP地址的利用率大幅提升,也让子网掩码这个概念彻底跟紧CIDR,变成前缀长度的另一种表达。
3. 子网掩码和网关:IP地址的两个黄金搭档
3.1 子网掩码是怎么把IP地址切成“小区+门牌”的
聊完IP地址本身,必须聊聊子网掩码。很多人刚接触网络时,看到“IP地址、子网掩码、网关”这一排配置项就头大,不知道它们之间什么关系。其实子网掩码的作用,就是帮设备划分“哪些IP和我在同一个小区”。
举个例子:你家在XX市XX区XX路XX号,如果快递员送包裹,他要知道你这个地址属于哪个街道派出所管辖、哪个居委会,这样才能高效配送。子网掩码干的就是这个事——它用连续的1表示网络位,0表示主机位。比如255.255.255.0,二进制展开就是24个1加8个0,意思就是“前24位是网络位,后8位属于小区内部的房间号”。
设备拿到一个IP地址和子网掩码后,会做一次按位“与”运算,得出网络号,然后判断目标IP和自己在不在同一个网络。如果目标IP和自己是同一个网络号,就直接在局域网内通信,不需要经过网关;如果不一样,就要把数据交给网关,让网关帮忙转发到外面的世界。
这里的判断逻辑特别重要。我排查过好多“两台电脑明明插在同一个交换机上,却互相ping不通”的案例,最后查下来全是子网掩码写错了。比如A机器是192.168.1.5/24,B机器是192.168.1.8/16,A认为B跟自己在同一个网段,但B认为A也得算自己网段内的,按理说能通信,但如果反过来,A是192.168.1.5/16,B是192.168.1.8/24,B会认为A不在自己网段内,把访问A的流量发给网关,而网关如果没配转发规则,这俩就断了。所以子网掩码必须统一规划,不是随便填的。
3.2 默认网关:出小区必须经过的那道大门
网关就是“出门的那道大门”。你在家里可以随便去隔壁邻居家串门,这属于局域网内部通信,不需要经过小区大门。但你要是想打车去另外一个小区,甚至去另外一个城市,你必须先出小区大门,走到大马路上,才能找到主干道。
网络里也一样。本机要访问外网,数据包会先看看目标IP和自己是否在同一网段。如果在同一网段,直接广播ARP请求找对方MAC地址发数据;如果不在同一网段,就把数据包扔给默认网关。默认网关通常是路由器或者三层交换机的接口地址,它负责把数据包继续往外转发。
日常配置里,网关的IP地址必须跟你的IP地址在同一个网段,而且通常是这个网段里第一个或最后一个可用地址。比如局域网是192.168.1.0/24,网关一般是192.168.1.1或192.168.1.254。为什么不能乱填?因为你的设备要跟网关通信,必须能通过ARP找到它的MAC地址,而ARP广播只能在同一个网段里进行。你填一个不在自己网段的网关,数据包根本送不出去。
还有一个常见的坑:有人以为“网关填得越多越好”,于是把DNS服务器地址也填到网关栏里。这是不对的。网关只有一个是“默认路由”的出入口,DNS是域名解析服务,两个用途完全不同。配置错了,表现为“能上QQ聊微信,但打开网页就报错”,后面我会专门说这个故障。
3.3 用10.10.7.64/26算一遍可用IP地址
前面已经用公式算出 10.10.7.64/26 有62个可用地址。这里我再用白话把完整计算过程走一遍,因为这种计算在面试、网络规划、排障中太常用了。
先看/26,说明子网掩码是255.255.255.192。为什么是192?前26位是1,转换成十进制就是255.255.255.192。你把这个掩码跟10.10.7.64做按位与运算:
- 10.10.7.64的二进制:00001010.00001010.00000111.01000000
- 255.255.255.192的二进制:11111111.11111111.11111111.11000000
- 相与的结果:00001010.00001010.00000111.01000000,也就是10.10.7.64
这个结果就是网络地址。主机位全为1的地址是广播地址,也就是最后6位全部是1,得到10.10.7.127。这两个地址都不能分配给设备使用,所以可用地址就是中间从65到126,一共62个。
我再多说一句:这个例子里十进制的64是256的1/4,正好对应/26的子网大小(64个地址)。你可以发现规律:每个子网的网络地址,都是这个子网大小的整数倍。64个地址的子网,网络地址只能是0、64、128、192这种间隔;32个地址的子网,网络地址只能是0、32、64、96、128、160、192、224这种间隔。记住这个规律,以后看一个IP加掩码,你心里马上能反应过来它属于哪个子网。
4. 动手查看和配置IP地址:Windows、Linux与国产系统实测
4.1 Windows下查看IP地址的根本方法
排查网络问题第一步永远是“先看自己的IP是多少”。Windows系统最简单的命令是ipconfig,在CMD或PowerShell里敲一下,就能看到当前网卡的IPv4地址、子网掩码和默认网关。
很多人只会看这一层,其实ipconfig还有几个进阶用法。比如 ipconfig /all,可以显示网卡MAC地址、DNS服务器、DHCP是否启用等详细信息。这个命令在排查“为什么这台机器域名解析特别慢”时很好用,能一眼看到DNS服务器是不是被填成了奇怪的东西。
另一个常用技巧是 ipconfig /release 和 ipconfig /renew。如果电脑是DHCP自动获取IP,但拿到的地址不对,或者IP冲突了,先release释放当前租约,再renew重新获取一次。这个操作能解决很大一部分“突然上不了网”的问题。
Windows上手动配置IP地址的方法也别搞混了:控制面板 -> 网络和共享中心 -> 更改适配器设置 -> 右键网卡属性 -> 双击“Internet协议版本4 (TCP/IPv4)”,这里就可以手工填写IP地址、子网掩码、网关和DNS。注意,手动配置完如果上不了网,先 ping 一下网关,ping不通说明你填的网关地址不对或者网线物理链路有问题;ping得通但上不了外网,那问题多半出在DNS或者路由器出网策略上。
4.2 Linux命令行下的排查三板斧
Linux下查IP的老命令是 ifconfig,但很多新系统已经不默认装了。如果提示找不到命令,用 ip addr 这个命令,它是iproute2工具包自带的,基本所有现代Linux发行版都有。
ip addr 输出的信息里,重点看两样东西:一个是 inet 开头的那行,后面跟着的就是IPv4地址和掩码前缀,比如 inet 192.168.1.100/24;另一个是状态 UP 或 DOWN,如果是DOWN说明网卡是熄的,需要先启用它。排查时可以先敲 ip addr 确认网卡有没有拿到地址,再敲 ip route show 看默认路由(也就是网关)配没配。
Linux配置静态IP地址,不同发行版做法不一样。Ubuntu、Debian这些用 netplan 或 /etc/network/interfaces 的,跟CentOS用 NetworkManager 的路径都不同。如果你在虚拟机里装了一个Ubuntu,配置了静态IP后用Xshell SSH连接不上,我的排查步骤一般是:先确认虚拟机能不能ping通宿主机,再确认SSH服务有没有启动,最后看是不是网卡配置文件里忘了写网关。
这里我想吐槽一个常见问题:很多人给Ubuntu虚拟机配了 192.168.x.x/24 的静态IP,但忘记把网关和DNS也填全,结果虚拟机自己能上网(或者实际上外网不通),外面怎么也连不进来。因为SSH连接是一个双向过程,不光要你的IP能通,还要能被宿主机反向访问。网关配错的话,虚拟机发出的回包找不到路,宿主机看到的就是“连接超时”。
4.3 麒麟系统和欧拉系统设置网卡IP的注意事项
之前有同事在跑麒麟系统和欧拉系统的服务器上配IP,习惯了CentOS的路径,直接在 /etc/sysconfig/network-scripts/ifcfg-eth0 里改,结果发现有的版本已经不推荐直接改配置文件,而是用 nmcli 工具。
nmcli 是NetworkManager的命令行客户端,用法其实很清晰。比如给网卡eth0配一个静态IP:
bash复制nmcli connection modify eth0 ipv4.addresses 192.168.1.100/24
nmcli connection modify eth0 ipv4.gateway 192.168.1.1
nmcli connection modify eth0 ipv4.dns "223.5.5.5 114.114.114.114"
nmcli connection modify eth0 ipv4.method manual
nmcli connection up eth0
这几条命令的顺序是有讲究的。先地址、再网关、再DNS,最后才把方式改成manual(手动)并激活。如果先改成manual再配地址,一些版本会直接清空已有的连接配置。欧拉系统上 nmcli 的用法类似,但要注意网卡命名规则,新系统网卡名不一定叫eth0,可能是ens33、eno1这种带物理位置信息的名字,先 ip addr 看清楚再动手。
纯命令行环境下,也可以用 nmtui 这个文本图形界面工具,它对不太熟悉命令行的人更友好。启动后选择“Edit a connection”,找到对应网卡,然后填写IPv4配置项,方式选Manual,Addresses填 IP地址/前缀长度,Gateway填网关,DNS servers填DNS地址。这里有个细节:Addresses那栏一定要写 /24 这种前缀长度,如果只写192.168.1.100,部分版本会自动变成 /32,等于把子网掩码配成了255.255.255.255,那这台机器就只能自己跟自己通信了。
5. 局域网日常排障中的IP地址实操
5.1 如何扫描当前网络里所有在线机器的IP
“如何查看当前网络中所有机器的IP地址”这个问题,处理办公室网络、做设备巡检时经常遇到。最土但最有效的办法是ping扫描。原理很简单:发给某个IP一个ICMP请求,如果对方在线就会回一个响应。但IP段一般有254个可用地址,一个个ping太傻了,可以写一个循环命令。
Windows下用for循环:
bat复制for /L %i in (1,1,254) do ping -n 1 -w 1 192.168.1.%i
Linux下同样可以用一段脚本:
bash复制for i in $(seq 1 254); do ping -c 1 -W 1 192.168.1.$i & done
ping完之后,再用 arp -a 命令查看ARP缓存表,里面会列出最近通信过的IP地址和对应的MAC地址。因为只要ping通过,目标主机会把MAC地址回应到你的ARP表里,所以 ping 完立刻看 arp -a 是最快的在线主机列表。
如果允许装第三方工具,nmap是最专业的,一条命令就能扫描整个网段加端口信息:
bash复制nmap -sn 192.168.1.0/24
-sn 表示只做主机发现,不扫描端口,结果会直接列出在线设备的IP和MAC地址。
还有一个需要留意的地方:有些设备默认禁ping,但不是真不在线。所以“ping不通”和“不在线”是两码事,排查时不要拿ping结果当唯一依据。想更准确,可以结合ARP响应来判断,只要一个IP在局域网里发过包,ARP表里就有它的MAC记录,即使它禁ping也能被发现。
5.2 一张网卡绑定多个IP的使用场景
一张物理网卡绑定两个甚至多个IP地址,这个需求比想象中常见。比如说服务器上有两个业务,一个跑内网管理,一个跑对外服务,但物理网卡只有一块;再比如你要临时测试一个新的IP段,不想改原有配置。
Windows下设置多IP很简单:网卡属性 -> IPv4 -> 高级,然后在IP地址列表里点“添加”,可以不断加新的IP和子网掩码。这样一张网卡就同时有多个IP在监听,应用程序可以分别绑定到不同IP上提供服务。
Linux下用 ip addr add 命令可以临时添加,重启网卡或重启系统后失效:
bash复制ip addr add 192.168.2.50/24 dev eth0
要永久生效,还是得写配置文件。以CentOS系为例,在ifcfg-eth0里增加 IPADDR1、PREFIX1 这样的字段,然后重启网络服务。
绑定多IP时有个细节容易踩坑:多个IP如果配置在不同网段,要注意路由表的走向。Linux会自动为新IP生成同网段的路由,但默认网关还是只有一个。如果你加的IP跟原IP不在同一网段,又想让它走不同的网关,那就得自己写策略路由了,这属于进阶内容,这里先提个醒。
5.3 “找不到服务器IP地址,但能聊微信”这个经典故障
这个故障几乎每个网管都遇到过:电脑能正常聊微信、刷短视频,但浏览器打开网页却报“找不到服务器IP地址”。为什么看视频行、打开网页不行?因为应用场景不同。
微信、短视频这类App,它们的服务器IP大概率已经被DNS解析过了,或者App内部直接使用了固定IP,甚至一些还用了HTTPDNS技术,根本不依赖系统DNS。而浏览器访问一个新网站,必须先从DNS服务器解析域名对应的IP地址,解析不出来,就报“找不到服务器IP地址”。
所以遇到这个问题,第一件事就是检查DNS配置。ping一下网关看通不通,通了说明网络是通的;再 nslookup baidu.com 看看能不能解析出IP。如果 nslookup 说 server can't find baidu.com,那就基本锁定了DNS的问题。
DNS修复方法不复杂:先把DNS改成公共DNS试一下,比如223.5.5.5(阿里DNS)、114.114.114.114(114DNS)、8.8.8.8。绝大多数情况下,改完DNS立刻就能恢复。改完之后记得先 ipconfig /flushdns 清一下本地DNS缓存,不然旧缓存还在,照样报错。
还有一个小概率原因是hosts文件被污染或病毒改写了静态解析条目。Windows的hosts文件在 C:\Windows\System32\drivers\etc\hosts,Linux在 /etc/hosts,用文本编辑器打开看看有没有奇怪的解析记录。以前处理过一台机器,hosts里被人写了一条 baidu.com 指向一个内网IP,结果搜索网站永远打不开,删掉那行就好了。
5.4 判断一个IP地址归属地的常规套路
“如何判断一个IP地址是不是境外的”这种问题,本质是想知道某个IP地址的地理归属。我不能展开说这个判断能用来干什么,但从技术上讲,IP地址归属地是通过IP归属数据库查出来的。
最常用的方案是开源库ip2region,它把全球IP段映射到具体的国家、省份、城市和运营商。之前我看过它的更新频率,社区维护得还算勤快,基本能覆盖日常需求。调用方式也简单,先下载IP段数据文件,然后用对应的SDK查。比如在Python里,用ip2region查询一个IP,返回的信息会包含国家、省、市,甚至ISP。
用ip2region这类工具时,有三个注意事项:一是IP数据库不是实时更新的,运营商调整地址段、新增地址段都需要时间同步,所以偶尔会查不准;二是通过代理或NAT出去的流量,看到的源IP可能不是真实客户端的IP,归属地自然就变了;三是IPv6地址的归属地查询精度通常比IPv4差一些,因为IPv6地址段的分配粒度更粗。
如果你的需求是判断某个请求来自哪个地区,而不是简单的查静态数据库,可以考虑用在线IP归属API,每次请求实时查询。不过自建的话要控制好频率,防止IP被对方封禁。更简单的做法是直接把ip2region移植到本地环境,查一次本地完成,不依赖外网接口,延迟低且不会暴露查询行为。
从我实际项目的经验来看,ip2region的本地查询精度已经足够应付绝大多数“这个IP从哪个城市来的”这类需求了,没必要再花钱去买商业IP库。但如果你的业务对归属地准确率要求极高,比如要做风控、反作弊,那还是得考虑商业库,并定期更新数据文件,避免用半年前的旧数据判断新变化的IP段,那样会误伤不少正常用户。
