基本的网络知识

5452 字
27 分钟
基本的网络知识

一、为什么 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区被攻破,内网仍然安全

典型架构

3
3

DMZ区常见服务

  • Web服务器(Nginx、Apache等)
  • API网关
  • 邮件服务器
  • FTP服务器
  • VPN服务器

三、IP、端口、域名等#

3.1 IP#

IP地址是网络上设备(网络接口)的唯一标识,类似于我们的家庭地址。通过IP地址,可以找到网络中的某台具体设备。严格来说,IP地址对应的是设备上的网络接口,一台设备可以有多个网卡、多个IP地址。

简单理解

一台主机可以有多个网卡
就像一栋楼可以有多个门
每个网卡对应一个IP地址
就像每个门有一个门牌号
通过门牌号找到门,通过门进入大楼

IP地址分类

类型说明示例
IPv432位地址,常用格式192.168.1.100
IPv6128位地址,新一代2001:0db8:85a3:0000:0000:8a2e:0370<7334>

私有IP地址范围(内网使用):

地址范围用途
10.0.0.0 - 10.255.255.255A类私有地址
172.16.0.0 - 172.31.255.255B类私有地址
192.168.0.0 - 192.168.255.255C类私有地址(最常见)

3.2 端口#

端口是应用程序与网络通信的通道,一个IP地址可以有65535个端口(范围是0-65535,其中0是保留端口,实际常用的是1024以上的端口)。

简单理解

一个IP地址对应一台主机
一台主机可以运行多个应用
每个应用使用不同的端口
通过IP+端口可以找到具体的应用

生活类比

IP地址 = 公司地址(如:北京市朝阳区xx大厦)
端口 = 部门/房间号(如:8080房间)
要找到具体的人,需要:地址 + 房间号
要访问具体的应用,需要:IP + 端口

常见服务默认端口:

服务端口说明
MySQL3306数据库服务
Redis6379缓存服务
Tomcat8080Java Web服务器
Nginx80/443Web服务器/反向代理
SSH22远程登录服务
HTTP80超文本传输协议
HTTPS443加密的超文本传输协议

3.3 域名#

域名就是给 IP 起的更容易记忆的名字。

例如:

  • www.baidu.com
  • api.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
# 连接本地 Redis
spring:
redis:
host: 127.0.0.1
port: 6379

4.2 localhost#

通常表示本机,本质上一般会解析到 127.0.0.1

所以大多数情况下,localhost127.0.0.1 可以理解成一样。

客户端角度 — 访问本地服务:

localhost127.0.0.1 在使用上基本等价,都可以用来访问本机服务:

http://localhost:8080/api/test
http://127.0.0.1:8080/api/test
jdbc:mysql://localhost:3306/mydb
jdbc: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.10
ping www.baidu.com

说明

  • 能 ping 通:说明网络层大概率可达
  • 不能 ping 通:说明网络可能不通、被禁 ping、域名解析失败等

注意

ping 通 ≠ 服务可用

因为 ping 只说明 IP 层可能通,不代表应用端口一定通。

5.2 telnet#

作用:测试某个端口能不能连通。

telnet 192.168.1.10 3306
telnet 192.168.1.20 8080

说明

  • 连得上:说明这个端口是通的
  • 连不上:可能是服务没启动、端口没监听、防火墙没放行

Windows开启telnet功能

控制面板 → 程序 → 启用或关闭Windows功能
→ 勾选"Telnet客户端"
→ 确定并等待安装完成

1
1

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:8080

5.3.2 查看响应头#

curl -i http://127.0.0.1:8080

5.3.3 发送 POST 请求#

curl -X POST -H "Content-Type: application/json" -d '{"id":1}' http://127.0.0.1:8080/api/test

5.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

输出示例:200404500,快速判断接口是否正常。

注意

  • ping 看 IP 通不通
  • telnet 看端口通不通
  • curl 看 HTTP 接口是否真的可用

5.4 tracert / traceroute(了解)#

作用:查看数据包经过哪些路由节点到达目标机器。

Windows A B

tracert www.baidu.com

Linux

traceroute www.baidu.com

场景

当你怀疑网络路径中间某一跳出了问题时,可以用它做辅助排查。

5.5 netstat#

作用:查看端口监听情况。

Windows

netstat -ano | findstr 8080

Linux

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 java

jps

查看 Java 进程

jps

场景

  • 确认 Java 服务是否启动
  • 找到对应进程 ID

5.8 kill#

结束进程。

kill -15 12345
kill -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/udp
firewall-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 修改后需要保存并重启才能永久生效:

Terminal window
# 保存规则
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables
# 重启 iptables 使配置生效
systemctl restart iptables

6.2.2 云平台安全组#

如果服务部署在云服务器上,还可能有云平台提供的安全组策略。 即使服务器本机已经开放端口,如果安全组没放开,外部仍然访问不了。

2
2

6.2.3 白名单#

白名单就是:

只允许特定来源访问,其他来源一律拒绝。

常见于:

  • 数据库
  • Redis
  • MQ
  • 第三方接口回调
  • 管理后台

典型现象

  • 你本机能连,别人机器不能连
  • 测试环境能访问,开发环境不能访问
  • 某台服务器能调通,另一台服务器调不通

这种情况就要考虑是不是来源限制导致的。

6.2.4 中间链路策略#

很多同学一想到访问控制,只会想到服务器上的 firewalld 或 iptables。 但真实公司网络里,中间链路也可能有访问控制。

常见中间链路策略

  • 网络防火墙设备
  • 路由器 ACL
  • 交换机访问控制策略
  • 网关访问策略
  • 负载均衡访问控制
  • WAF 拦截规则

6.3 作为 Java 开发,你最该记住什么#

这一节你不用去背复杂规则,但至少要记住下面这几点:

1)服务访问不了,不一定是代码问题

有可能是:

  • 端口没开放
  • 防火墙拦截了
  • 安全组没放行
  • 白名单没加
  • 中间链路有墙

2)先确认服务是否真的启动、端口是否监听

比如先查:

netstat -tunlp | grep 8080
lsof -i :8080

如果服务都没监听,那就不是防火墙问题,而是服务本身没起来。


3)防火墙和安全组可能同时限制访问

你不能只看服务器本机。 如果在云环境里,还要考虑云平台的安全组规则。如果网络中间经过其他有墙的设备,也要考虑这个中间链路设备的墙。


4)生产环境不要随便改防火墙

线上环境改防火墙规则一般要按公司流程走,很多公司由运维统一处理。 你要做的是:

  • 能意识到这是排查方向
  • 知道怎么和运维沟通
  • 能提供清楚的信息:IP、端口、协议、环境

6.4 和运维沟通时怎么说更专业#

比如你可以这样说:

“服务已经正常启动,8080 端口也在监听,本机访问正常。麻烦帮忙确认一下测试环境这台机器的防火墙/安全组是否已放行 8080 端口。”

或者:

“我这边怀疑不是代码问题,可能是网络访问策略限制,麻烦帮忙看下目标机器的端口开放情况和白名单配置。”

这样沟通会比“接口不通,帮我看看”更专业很多。

七、服务访问与网络连通性问题的排查顺序(重要)#

遇到下面这类问题时:

  • 服务访问不了
  • 数据库连不上
  • 接口调不通
  • 服务间调用失败

建议优先按下面这个顺序查,不要一上来就怀疑代码,也不要一上来就只看网络。

第一步:先确认目标信息是否正确

先确认最基础的信息有没有写错:

  • IP 对不对
  • 端口对不对
  • 域名对不对
  • 接口路径对不对
  • 当前是不是对应环境(dev / test / pre / prod)
  • 配置文件里填的是不是正确地址

很多问题其实在这一步就能发现,比如:

  • 连错环境
  • 连错机器
  • 端口写错
  • 域名写错
  • 调错接口路径

第二步:确认目标服务/应用是否真的存在、是否正常运行

这是非常关键的一步。如果服务本身都没启动,后面的网络排查意义就不大。

使用第五章介绍的 netstatlsofpsjps 命令,确认两件事:

  1. 应用有没有启动
  2. 应用有没有监听目标端口

如果服务没启动或端口没监听,那问题优先就不是网络,而是服务本身。

第三步:看网络是否可达

使用第五章 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/网关转发失败

所以排查时一定不要脱离日志。 网络排查和日志排查通常要结合起来看。

八、常见端口占用问题排查#

问题场景:启动应用时提示”端口已被占用”

原因:该端口已被其他进程使用

以下涉及的命令(netstatlsofpsjpskill)用法详见第五章。

8.1 Windows 系统#

第一步:查看端口占用情况(使用 5.5 介绍的 netstat)

netstat -ano | findstr 8080

输出结果最后一列数字就是进程ID(PID)。

第二步:查看进程详情

tasklist | findstr 12345

第三步:结束占用端口的进程

方式1:使用taskkill强制结束

taskkill /PID 12345 /F

方式2:打开任务管理器 → “详细信息”标签页 → 找到对应PID → 右键结束任务

4
4

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 # 强制结束

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
基本的网络知识
https://study-docs-158.pages.dev/posts/基本的网络知识/
作者
我的学习小铺
发布于
2026-08-01
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
我的学习小铺
学而时习之
分类
标签
最新动态
站点统计
文章
44
分类
8
标签
9
总字数
126,514
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.15.3
文章许可
CC BY-NC-SA 4.0