基本的网络知识
一、为什么 Java 开发要学网络知识?
很多刚入职的同学会觉得: “我是写 Java 的,又不是搞运维的,为什么还要学网络?”
因为在实际工作中,你经常会遇到这些问题:
- 前端说:接口访问不了
- 测试说:环境调不通
- 运维说:服务端口没开
- 你自己发现:数据库连不上、Redis 连不上、调用其他服务超时
这些问题表面上看像“代码问题”,实际上很多时候是网络、环境、端口、配置的问题。
所以,作为 Java 开发,网络知识不需要学得特别深,但一定要掌握最基础、最常用、工作中最容易遇到的部分。
二、网络区域划分
2.1 什么是网络区域划分?
网络区域划分是将网络按照安全级别和访问权限划分为不同的区域,每个区域有不同的安全策略和访问控制规则。这种划分可以有效保护内网核心资源,同时为外部用户提供必要的服务。
2.2 三大网络区域
| 区域 | 全称 | 说明 | 安全级别 |
|---|---|---|---|
| 内网 | Intranet | 组织的核心网络,用于内部员工和资源之间的通信 | 最高 |
| 外网 | Public Internet | 公共互联网,连接到组织网络的最外层区域 | 最低 |
| DMZ区 | Demilitarized Zone | 介于内网和外网之间的隔离区,也称”非军事化区” | 中等 |
2.3 各区域详细说明
2.3.1 内网(Intranet)
定义:内网是组织内部使用的私有网络,只有经过授权的用户和设备才能访问。
特点:
- 位于防火墙内部,与外网隔离
- 存放核心业务数据、数据库、内部应用服务器
- 使用私有IP地址(如:10.x.x.x、172.16.x.x、192.168.x.x)
- 安全性最高,外部用户无法直接访问
访问方式:
- VPN(Virtual Private Network):虚拟专用网络,通过加密通道从外网安全访问内网
- 堡垒机:统一的安全入口,所有对内网的访问都需要通过堡垒机进行审计
注意:VPN 和堡垒机不是必须一起使用的。不同公司安全策略不同,有的只需要 VPN,有的需要 VPN + 堡垒机双重认证。
典型应用场景:
场景一:只需 VPN在家办公 → 连接VPN → 访问内网资源
场景二:VPN + 堡垒机在家办公 → 连接VPN → 通过堡垒机认证 → 访问内网资源2.3.2 外网(Public Internet)
定义:外网就是公共互联网,是全球互联的网络环境。
特点:
- 任何人都可以访问
- 安全风险最高,容易受到攻击
- 使用公网IP地址
2.3.3 DMZ区域(了解)
定义:DMZ是介于内网和外网之间的隔离区域,用于放置对外提供服务的服务器。
特点:
- 从外网可以访问DMZ区
- 从DMZ区不能直接访问内网(需要特殊授权)
- 即使DMZ区被攻破,内网仍然安全
典型架构:

DMZ区常见服务:
- Web服务器(Nginx、Apache等)
- API网关
- 邮件服务器
- FTP服务器
- VPN服务器
三、IP、端口、域名等
3.1 IP
IP地址是网络上设备(网络接口)的唯一标识,类似于我们的家庭地址。通过IP地址,可以找到网络中的某台具体设备。严格来说,IP地址对应的是设备上的网络接口,一台设备可以有多个网卡、多个IP地址。
简单理解:
一台主机可以有多个网卡 ↓就像一栋楼可以有多个门 ↓每个网卡对应一个IP地址 ↓就像每个门有一个门牌号 ↓通过门牌号找到门,通过门进入大楼IP地址分类:
| 类型 | 说明 | 示例 |
|---|---|---|
| IPv4 | 32位地址,常用格式 | 192.168.1.100 |
| IPv6 | 128位地址,新一代 | 2001:0db8:85a3:0000:0000:8a2e:0370<7334>7334> |
私有IP地址范围(内网使用):
| 地址范围 | 用途 |
|---|---|
| 10.0.0.0 - 10.255.255.255 | A类私有地址 |
| 172.16.0.0 - 172.31.255.255 | B类私有地址 |
| 192.168.0.0 - 192.168.255.255 | C类私有地址(最常见) |
3.2 端口
端口是应用程序与网络通信的通道,一个IP地址可以有65535个端口(范围是0-65535,其中0是保留端口,实际常用的是1024以上的端口)。
简单理解:
一个IP地址对应一台主机 ↓一台主机可以运行多个应用 ↓每个应用使用不同的端口 ↓通过IP+端口可以找到具体的应用生活类比:
IP地址 = 公司地址(如:北京市朝阳区xx大厦)端口 = 部门/房间号(如:8080房间)
要找到具体的人,需要:地址 + 房间号要访问具体的应用,需要:IP + 端口常见服务默认端口:
| 服务 | 端口 | 说明 |
|---|---|---|
| MySQL | 3306 | 数据库服务 |
| Redis | 6379 | 缓存服务 |
| Tomcat | 8080 | Java Web服务器 |
| Nginx | 80/443 | Web服务器/反向代理 |
| SSH | 22 | 远程登录服务 |
| HTTP | 80 | 超文本传输协议 |
| HTTPS | 443 | 加密的超文本传输协议 |
3.3 域名
域名就是给 IP 起的更容易记忆的名字。
例如:
www.baidu.comapi.test.company.com
因为用户和开发都不方便记 IP,所以通常通过域名访问服务。
3.4 DNS
DNS 的作用就是: 把域名解析成 IP 地址。
比如你访问:
api.test.company.com系统会先通过 DNS 找到它对应的 IP,然后再去访问目标机器。
DNS 解析顺序(了解):
浏览器缓存 ↓ 未命中操作系统缓存 ↓ 未命中hosts 文件 ↓ 未命中本地 DNS 服务器 ↓ 未命中上级 DNS 服务器(递归查询) ↓ 最终返回拿到 IP 地址,发起访问当 ping 域名不通,但 ping IP 能通 时,就可能是域名解析有问题。
3.5 hosts 文件
hosts 文件可以手动指定“某个域名对应哪个 IP”。
例如:
192.168.1.20 api.test.company.com意思是:访问这个域名时,直接去找这个 IP,不再走 DNS。
常见作用:
- 本地调试
- 临时切换环境
- 测试域名解析问题
注意:如果 hosts 配错了,会导致你访问到错误的服务。
四、127.0.0.1、localhost、0.0.0.0 的区别
这个是 Java 开发必须知道的基本点,必须弄清楚。
理解这三个地址,要从两个角度来看:
- 服务端角度:你的服务启动时,监听在哪个地址?(决定了谁能连进来)
- 客户端角度:你要访问本机的某个服务,地址该填什么?(决定了你能不能连上)
4.1 127.0.0.1
表示本机回环地址,只能本机访问自己。
服务端角度 — 监听:
如果服务监听在 127.0.0.1:8080,那么只有当前机器自己能访问,其他机器访问不了。 A mysql 127.0.0.1 B
服务监听:127.0.0.1:8080 ↓本机能访问:✅其他机器访问:❌客户端角度 — 访问本地服务:
在本地开发时,你的代码需要连接本机的服务,地址就填 127.0.0.1。这是最常见的用法:
# application.yml 连接本地数据库spring: datasource: url: jdbc:mysql://127.0.0.1:3306/mydb
# 连接本地 Redisspring: redis: host: 127.0.0.1 port: 63794.2 localhost
通常表示本机,本质上一般会解析到 127.0.0.1。
所以大多数情况下,localhost 和 127.0.0.1 可以理解成一样。
客户端角度 — 访问本地服务:
localhost 和 127.0.0.1 在使用上基本等价,都可以用来访问本机服务:
http://localhost:8080/api/testhttp://127.0.0.1:8080/api/test
jdbc:mysql://localhost:3306/mydbjdbc:mysql://127.0.0.1:3306/mydb细微区别(了解即可):
localhost需要经过 DNS 解析,而127.0.0.1是直接写死的 IP。极少数情况下localhost可能解析失败,写127.0.0.1更稳妥。
4.3 0.0.0.0
表示监听所有网卡地址。
服务端角度 — 监听:
如果服务监听在 0.0.0.0:8080,那就意味着:
- 本机可以访问
- 局域网其他机器也可以访问
- 外部机器是否能访问,还要看防火墙、安全组、白名单等限制
服务监听:0.0.0.0:8080 ↓本机能访问:✅局域网其他机器访问:✅(前提:防火墙放行)外部机器访问:取决于防火墙、安全组等4.4 两个角度的总结
| 地址 | 服务端监听时 | 客户端访问本机服务时 |
|---|---|---|
| 127.0.0.1 | 只允许本机访问 | 填这个地址,连接本机服务 |
| localhost | 同 127.0.0.1 | 和 127.0.0.1 基本等价 |
| 0.0.0.0 | 允许所有网卡访问 | 一般不填这个,它只用于监听 |
注意:
0.0.0.0是监听地址,不是访问地址。你不会在配置文件里写host: 0.0.0.0去连接某个服务,它只在服务端启动时指定”监听所有网卡”。
五、常见网络工具
工具速查表:
| 场景 | 推荐工具 | 说明 |
|---|---|---|
| 测试网络是否可达 | ping | 检测 IP/域名是否能通 |
| 测试端口是否开放 | telnet | 检测目标端口是否能连通 |
| 测试 HTTP 接口是否可用 | curl | 模拟 HTTP 请求,查看响应 |
| 查看数据包路由路径 | tracert / traceroute | 排查网络中间节点问题 |
| 查看端口监听情况 | netstat | 确认服务是否在监听 |
| 查看端口占用详情 | lsof | 确认哪个进程占用了端口 |
| 查看 Java 进程 | jps / ps | 确认 Java 服务是否启动 |
| 结束进程 | kill | 停止异常进程 |
5.1 ping
作用:测试目标 IP 是否可达。
ping 192.168.1.10ping www.baidu.com说明
- 能 ping 通:说明网络层大概率可达
- 不能 ping 通:说明网络可能不通、被禁 ping、域名解析失败等
注意
ping 通 ≠ 服务可用
因为 ping 只说明 IP 层可能通,不代表应用端口一定通。
5.2 telnet
作用:测试某个端口能不能连通。
telnet 192.168.1.10 3306telnet 192.168.1.20 8080说明
- 连得上:说明这个端口是通的
- 连不上:可能是服务没启动、端口没监听、防火墙没放行
Windows开启telnet功能:
控制面板 → 程序 → 启用或关闭Windows功能→ 勾选"Telnet客户端"→ 确定并等待安装完成
5.3 curl(了解)
作用:测试 HTTP 接口是否可用。
说明:日常开发中推荐使用 Postman 等图形化工具测试接口。curl 的主要使用场景是 SSH 到服务器上排查问题时,服务器上没有 Postman,只能用命令行。
注意:Windows 10 及以上系统自带 curl,较老系统可安装 Git Bash 后使用。
作用
- 测试 HTTP 接口是否能访问
- 查看响应头、响应体
- 模拟 GET/POST 请求
5.3.1 访问一个 GET 接口
curl http://127.0.0.1:80805.3.2 查看响应头
curl -i http://127.0.0.1:80805.3.3 发送 POST 请求
curl -X POST -H "Content-Type: application/json" -d '{"id":1}' http://127.0.0.1:8080/api/test5.3.4 查看详细请求过程
curl -v http://127.0.0.1:8080可以看到完整的请求头、响应头、TLS 握手等信息,排查问题非常有用。
5.3.5 只看 HTTP 状态码
curl -o /dev/null -s -w '%{http_code}' http://127.0.0.1:8080/api/test输出示例:200、404、500,快速判断接口是否正常。
注意
ping看 IP 通不通telnet看端口通不通curl看 HTTP 接口是否真的可用
5.4 tracert / traceroute(了解)
作用:查看数据包经过哪些路由节点到达目标机器。
Windows A B
tracert www.baidu.comLinux
traceroute www.baidu.com场景
当你怀疑网络路径中间某一跳出了问题时,可以用它做辅助排查。
5.5 netstat
作用:查看端口监听情况。
Windows
netstat -ano | findstr 8080Linux
netstat -tunlp | grep 8080场景
- 查看某端口是否已启动
- 查看端口是否被占用
- 查看服务是否在监听
5.6 lsof
Linux 中查看端口占用、文件占用很常用。
lsof -i :8080注意:
lsof是 Linux 专属命令,Windows 上没有对应工具,可使用netstat -ano | findstr 端口号代替。
场景
排查:
- 端口被谁占用了
- 某服务是不是在监听该端口
5.7 ps / jps
ps
查看 Linux 进程
ps -ef | grep javajps
查看 Java 进程
jps场景
- 确认 Java 服务是否启动
- 找到对应进程 ID
5.8 kill
结束进程。
kill -15 12345kill -9 12345注意
kill -15:正常停止kill -9:强制杀死,谨慎使用
六、访问控制:防火墙、安全组、白名单与中间链路策略
6.1 访问控制
-
访问控制可以理解为:
控制“谁可以访问谁”、“通过什么方式访问”、“哪些访问要被拦截”的一整套规则。
对于 Java 开发来说,访问控制并不只是“服务器上有没有开端口”这么简单。 一个请求从源头到目标服务,中间可能会经过多层限制,例如:
- 服务器本机防火墙
- 云平台安全组
- 白名单限制
- 中间链路上的网络设备或安全策略
所以你要建立一个意识:
服务访问不了,不一定是代码问题,也不一定只是目标机器本身的问题,访问链路上的任意一层控制策略都可能拦住请求。
6.2 常见的访问控制位置
实际工作中,常见的访问控制可能出现在以下几个位置:
6.2.1 服务器本机防火墙
(1)firewalld
这是很多 CentOS 7 / RHEL 7 系统默认使用的防火墙管理工具。 特点是:
- 命令相对简单
- 比较适合日常管理
- 现在企业里比较常见
常用命令
#查看防火墙状态systemctl status firewalld#关闭防火墙systemctl stop firewalld#重启防火墙systemctl restart firewalld#永久开放端口firewall-cmd --permanent --zone=public --add-port=161/udpfirewall-cmd --permanent --zone=public --add-port=3306/tcp#永久关闭端口firewall-cmd --zone=public --remove-port=3306/tcp --permanent#刷新配置,立即生效firewall-cmd --reload#查看防火墙firewall-cmd --zone=public --list-all(2)iptables
这是 Linux 里更底层、更经典的防火墙工具。 特点是:
- 功能强大
- 规则更灵活
- 配置更复杂一些
很多老项目、老服务器,或者某些运维场景里仍然会看到它。
常用命令
#查看防火墙状态systemctl status iptables#关闭防火墙systemctl stop iptables#重启防火墙systemctl restart iptables#查看防火墙策略iptables -L#编辑防火墙策略vim /etc/sysconfig/iptables#允许访问3306端口-A INPUT -p tcp --dport 3306 -j ACCEPT-A OUTPUT -p tcp --sport 3306 -j ACCEPT注意:iptables 修改后需要保存并重启才能永久生效:
# 保存规则service iptables save# 或iptables-save > /etc/sysconfig/iptables
# 重启 iptables 使配置生效systemctl restart iptables6.2.2 云平台安全组
如果服务部署在云服务器上,还可能有云平台提供的安全组策略。 即使服务器本机已经开放端口,如果安全组没放开,外部仍然访问不了。

6.2.3 白名单
白名单就是:
只允许特定来源访问,其他来源一律拒绝。
常见于:
- 数据库
- Redis
- MQ
- 第三方接口回调
- 管理后台
典型现象
- 你本机能连,别人机器不能连
- 测试环境能访问,开发环境不能访问
- 某台服务器能调通,另一台服务器调不通
这种情况就要考虑是不是来源限制导致的。
6.2.4 中间链路策略
很多同学一想到访问控制,只会想到服务器上的 firewalld 或 iptables。 但真实公司网络里,中间链路也可能有访问控制。
常见中间链路策略
- 网络防火墙设备
- 路由器 ACL
- 交换机访问控制策略
- 网关访问策略
- 负载均衡访问控制
- WAF 拦截规则
6.3 作为 Java 开发,你最该记住什么
这一节你不用去背复杂规则,但至少要记住下面这几点:
1)服务访问不了,不一定是代码问题
有可能是:
- 端口没开放
- 防火墙拦截了
- 安全组没放行
- 白名单没加
- 中间链路有墙
2)先确认服务是否真的启动、端口是否监听
比如先查:
netstat -tunlp | grep 8080lsof -i :8080如果服务都没监听,那就不是防火墙问题,而是服务本身没起来。
3)防火墙和安全组可能同时限制访问
你不能只看服务器本机。 如果在云环境里,还要考虑云平台的安全组规则。如果网络中间经过其他有墙的设备,也要考虑这个中间链路设备的墙。
4)生产环境不要随便改防火墙
线上环境改防火墙规则一般要按公司流程走,很多公司由运维统一处理。 你要做的是:
- 能意识到这是排查方向
- 知道怎么和运维沟通
- 能提供清楚的信息:IP、端口、协议、环境
6.4 和运维沟通时怎么说更专业
比如你可以这样说:
“服务已经正常启动,8080 端口也在监听,本机访问正常。麻烦帮忙确认一下测试环境这台机器的防火墙/安全组是否已放行 8080 端口。”
或者:
“我这边怀疑不是代码问题,可能是网络访问策略限制,麻烦帮忙看下目标机器的端口开放情况和白名单配置。”
这样沟通会比“接口不通,帮我看看”更专业很多。
七、服务访问与网络连通性问题的排查顺序(重要)
遇到下面这类问题时:
- 服务访问不了
- 数据库连不上
- 接口调不通
- 服务间调用失败
建议优先按下面这个顺序查,不要一上来就怀疑代码,也不要一上来就只看网络。
第一步:先确认目标信息是否正确
先确认最基础的信息有没有写错:
- IP 对不对
- 端口对不对
- 域名对不对
- 接口路径对不对
- 当前是不是对应环境(dev / test / pre / prod)
- 配置文件里填的是不是正确地址
很多问题其实在这一步就能发现,比如:
- 连错环境
- 连错机器
- 端口写错
- 域名写错
- 调错接口路径
第二步:确认目标服务/应用是否真的存在、是否正常运行
这是非常关键的一步。如果服务本身都没启动,后面的网络排查意义就不大。
使用第五章介绍的 netstat、lsof、ps、jps 命令,确认两件事:
- 应用有没有启动
- 应用有没有监听目标端口
如果服务没启动或端口没监听,那问题优先就不是网络,而是服务本身。
第三步:看网络是否可达
使用第五章 5.1 介绍的 ping 命令:
ping IP:看目标机器网络层是否可达ping 域名:看域名解析和网络是否正常
如果 ping IP 通,但 ping 域名不通,优先怀疑 DNS 或 hosts 配置问题(见第三章 3.4、3.5)。
注意:ping 通不代表服务一定可用。ping 只说明 IP 层大概率可达,不代表目标端口一定开放。
第四步:看端口是否可达
如果目标机器可达,使用第五章 5.2 介绍的 telnet 命令测试目标端口:
telnet IP 端口如果端口不通,常见原因有:
- 服务没启动或没监听该端口(回到第二步确认)
- 服务只监听了
127.0.0.1,外部无法访问(见第四章) - 本机防火墙拦住了(见第六章)
- 云安全组没放开(见第六章)
- 白名单没加(见第六章)
- 中间链路策略拦截了访问(见第六章)
如果确认是端口被其他进程占用,可参考第八章的方法解决。
此时可以找运维人员,确认一下端口是否放开,然后再继续后续排查。
记住:本机能访问,不代表别人机器也能访问。 检查服务是否监听在
0.0.0.0而非127.0.0.1(见第四章)。
第五步:看 HTTP 接口是否真的可用(仅限 Web 服务 / HTTP 接口)
注意:如果目标是数据库、Redis、MQ 等非 HTTP 服务,端口通了就说明连通性没问题,可以跳过这一步。
如果是 Web 服务或 HTTP 接口,最好不要只停留在”端口通不通”,使用第五章 5.3 介绍的 curl 命令继续确认接口本身是否可用:
curl http://IP:端口/接口路径如果 curl 不通,要继续排查:
- 服务日志
- Nginx 配置
- 网关配置
- 服务监听地址
- 接口路径 / 请求方式是否正确(GET / POST)
第六步:最后结合应用日志进一步判断
很多问题表面上像“网络不通”,实际上可能是应用内部问题。
常见情况
- 服务启动失败
- 配置错误
- 数据库连接异常
- Redis/MQ 连接异常
- 应用内部抛异常
- Nginx/网关转发失败
所以排查时一定不要脱离日志。 网络排查和日志排查通常要结合起来看。
八、常见端口占用问题排查
问题场景:启动应用时提示”端口已被占用”
原因:该端口已被其他进程使用
以下涉及的命令(
netstat、lsof、ps、jps、kill)用法详见第五章。
8.1 Windows 系统
第一步:查看端口占用情况(使用 5.5 介绍的 netstat)
netstat -ano | findstr 8080输出结果最后一列数字就是进程ID(PID)。
第二步:查看进程详情
tasklist | findstr 12345第三步:结束占用端口的进程
方式1:使用taskkill强制结束
taskkill /PID 12345 /F方式2:打开任务管理器 → “详细信息”标签页 → 找到对应PID → 右键结束任务

8.2 Linux 系统
第一步:查看端口占用情况(使用 5.5 的 netstat 或 5.6 的 lsof)
netstat -tunlp | grep 8080# 或(推荐)lsof -i :8080第二步:查看进程详情(使用 5.7 的 ps / jps)
ps -ef | grep 12345# 或查看Java进程jps第三步:结束占用端口的进程(使用 5.8 的 kill)
kill 12345 # 优雅结束(推荐)kill -9 12345 # 强制结束支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!














