深色模式
IP 地址与端口
概述
网络排错里最常见的一个误会,是把 IP 地址和端口当成同一种东西。比如服务已经启动了,但外部还是访问不到,于是有人先去改端口;也有人看到端口通了,就以为机器地址一定没问题。实际上这两者解决的是两个不同问题。
IP 地址负责定位一台机器,端口负责定位这台机器上的一个网络服务。把两者放在一起,才是操作系统里常见的网络端点,例如 192.168.1.10:443、127.0.0.1:3000。
IP 地址是给谁用的
在 TCP/IP 网络里,IP 地址用来标识一台主机或一个网络接口。数据包先根据 IP 找到目标机器,到了机器上之后,再由传输层协议结合端口把流量交给具体进程。
日常开发里最常见的是 IPv4,例如:
127.0.0.1192.168.1.238.8.8.8
IPv6 也是正式使用中的协议,例如 ::1、2408:8000::1,只是很多入门文章还停留在 IPv4。这篇先以最常碰到的 IPv4 为主。
端口是给谁用的
端口是一个 16 位整数,范围是 0 到 65535。它不表示“哪台机器”,而是表示“这台机器上的哪个网络入口”。
可以把它理解成同一栋楼里的房间号:
IP像楼的地址- 端口像楼里的房间号
只有 IP,知道机器在哪;只有端口,知道入口编号,但不知道是哪台机器。两者拼起来,操作系统才能把网络连接准确交给目标服务。
例如:
192.168.1.10:22通常对应SSH192.168.1.10:80通常对应HTTP127.0.0.1:5432常见于本机数据库
为什么一个 IP 可以跑很多服务
一台机器通常只有少量 IP 地址,但可以同时运行很多网络服务,因为不同服务监听不同端口。
例如同一台机器上完全可以同时存在:
192.168.1.10:22,给SSH用192.168.1.10:80,给网站明文流量用192.168.1.10:443,给HTTPS用192.168.1.10:3306,给MySQL用
反过来,同一个端口在同一个 IP 上通常不能被两个进程同时监听。端口就这么大方地分给了一个进程,后来的只能报“地址已被占用”。
常见地址类型
公网地址
公网地址可以在互联网中被路由。服务器如果直接对外提供服务,通常需要公网 IP,或者至少前面要有能转发流量的公网入口。
例如:
1.1.1.18.8.8.8
私网地址
私网地址用于局域网内部,不能直接在公网路由。最常见的三个私网网段是:
10.0.0.0/8172.16.0.0/12192.168.0.0/16
家里路由器、公司内网、虚拟机网络,基本都离不开这些地址。机器拿着私网地址照样能上网,通常是因为经过了 NAT 转换,而不是因为这个地址本身能直接暴露到互联网。
回环地址
回环地址表示“本机自己”,最常见的是 127.0.0.1,IPv6 对应 ::1。
服务只监听在 127.0.0.1 时,外部机器无法直接访问;这很适合本机开发、反向代理回源、只允许本地访问的管理接口。很多“服务明明启动了但外部访问不到”的问题,最后都落在这里。
0.0.0.0
0.0.0.0 不是一个给别人访问的固定目标地址,更常见的含义是“监听本机所有可用网卡”。
例如服务监听在:
127.0.0.1:8080:只有本机能访问0.0.0.0:8080:本机所有IPv4地址都在监听这个端口
这两个看起来只差一点,实际访问范围差不少。
类地址是历史概念,CIDR 才是现在的常用写法
很多老资料会讲 A 类、B 类、C 类地址。这些内容有历史价值,但在今天的实际配置、路由和云环境里,更常见的是 CIDR 表示法。
CIDR 用斜杠表示网络前缀长度,例如:
192.168.1.0/2410.0.0.0/8172.16.0.0/12
这里的 /24 表示前 24 位是网络位,剩下的位可以用于主机地址。写成常见子网掩码,就是 255.255.255.0。
开发和运维里看到白名单、路由表、安全组规则时,基本都会直接写 CIDR,而不是先问这是 A 类还是 C 类。
端口范围怎么分
按通用约定,端口通常分成三段:
| 范围 | 名称 | 说明 |
|---|---|---|
0-1023 | 知名端口 | 例如 80、443、22、53。 |
1024-49151 | 注册端口 | 很多常见应用协议和中间件会使用这一段。 |
49152-65535 | 动态或临时端口 | 常作为客户端临时端口,也常被程序动态分配。 |
这里有两个容易混淆的点:
- 服务端口并不要求“必须是知名端口”,很多应用服务都直接跑在
8080、3000、5432、6379。 - 客户端发起连接时,自己也会占用一个本地临时端口,所以
netstat或ss里常常能看到一堆高位端口。
一个连接到底是怎么定位的
仅仅写“访问某台机器的某个端口”,对于直觉理解够用了;但在操作系统内部,一个网络连接通常会由更完整的四元组区分:
- 源
IP - 源端口
- 目标
IP - 目标端口
例如浏览器访问 93.184.216.34:443 时,本机也会随机选一个临时端口,例如:
- 源:
192.168.1.20:53124 - 目标:
93.184.216.34:443
这样系统才能区分同时发起的多条连接。否则所有访问 443 的流量都挤成一团,内核也会头大。
开发里最常见的几个排查点
服务监听在哪个地址
服务配置成监听 127.0.0.1 还是 0.0.0.0,直接决定外部能不能访问。
端口有没有被占用
程序启动失败时,常见原因之一就是端口冲突。
云防火墙和安全组
进程已经监听端口,不代表公网就一定能访问。云服务器场景下,还要看安全组、系统防火墙和反向代理配置。
地址写对了,但协议可能不对
例如某服务只监听 HTTPS 的 443,却拿 http:// 去测;或者服务实际监听的是内网地址,却拿公网入口直接连后端端口。地址和端口都没错,结果还是不通。
Linux 上常用的查看命令
查看本机监听端口:
sh
ss -lntp查看某个端口被谁占用:
sh
lsof -iTCP:8080 -sTCP:LISTEN查看本机网卡地址:
sh
ip addr查看公网地址:
sh
curl ifconfig.me或:
sh
curl cip.cc参考
RFC 1918: Address Allocation for Private InternetsRFC 4632: Classless Inter-domain Routing (CIDR)
