网络基础
TCP/IP、DNS 与排查。
网络基础
这一课你将能做到
- 查看本机 IP、路由、DNS 配置,说清一个请求从服务器发出到外网的完整路径
- 用 ss/netstat 查看端口监听状态,10 秒内回答「8080 端口是谁在监听」
- 用 ping、curl、dig、tcpdump 分层排查网络问题:是服务没起、防火墙拦了、还是 DNS 挂了
为什么要学
后端开发的本质是网络编程。本站架构里,浏览器 → Nginx(80/443)→ Spring Boot(8080)→ MySQL(3306)/ Redis(6379),每一跳都是 TCP 连接。线上「接口不通」的报警背后,可能是进程没监听端口、防火墙没放行、安全组没配置、DNS 解析错了 IP。不会网络排查,你连「问题出在哪一层」都说不清。
面试中「TCP 三次握手」「如何查看端口占用」「ping 通但 curl 不通是什么原因」是网络题的高频三件套。
先建立图像
本站请求链路(一次 API 调用的旅程):
浏览器
│ ① DNS 解析 codeforge.example.com → 服务器公网 IP
│ ② TCP 三次握手 → 443 端口
▼
Nginx(监听 443,终止 TLS)
│ ③ 反向代理:转发到 127.0.0.1:8080
▼
Spring Boot(监听 8080)
│ ④ JDBC 连接 MySQL(3306)、Lettuce 连接 Redis(6379)
▼
MySQL / Redis
网络排查的金字塔(从下到上逐层验证):
第 1 层:网卡有 IP 吗? ip addr
第 2 层:能出去吗? ping 网关 → ping 8.8.8.8
第 3 层:DNS 正常吗? dig baidu.com
第 4 层:目标端口通吗? curl -v / ss -tlnp
跟着做
步骤 1:查看本机网络配置
# 网卡与 IP(ip 是现代命令,ifconfig 已淘汰)
ip addr
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>
# inet 10.0.12.5/24 ... ← 内网 IP,/24 是子网掩码
ip route # 路由表:default via 10.0.12.1 是默认网关
ip link # 网卡链路状态(UP/DOWN)
# DNS 配置
cat /etc/resolv.conf
resolvectl status 2>/dev/null | head # Ubuntu 18.04+ 的 systemd-resolved
步骤 2:端口查看——ss 是核心武器
# 查看所有 TCP 监听端口(排查「服务起没起」第一命令)
sudo ss -tlnp
# State Recv-Q Send-Q Local Address:Port Process
# LISTEN 0 511 0.0.0.0:80 users:(("nginx",pid=1000))
# LISTEN 0 128 0.0.0.0:3306 users:(("mysqld",pid=1200))
# LISTEN 0 100 127.0.0.1:6379 users:(("redis-server",pid=1300))
# LISTEN 0 100 127.0.0.1:8080 users:(("java",pid=1400))
# 参数记忆:t=tcp l=listen n=数字端口(不解析服务名) p=显示进程
# 谁占用了 8080?(端口冲突排查)
sudo ss -tlnp | grep 8080
sudo lsof -i :8080
# 看所有 ESTABLISHED 连接(当前有哪些活跃连接)
ss -tn state established
# 统计各状态连接数(排查 TIME_WAIT 堆积)
ss -tan | awk '{print $1}' | sort | uniq -c
关键细节:Redis 监听 127.0.0.1:6379 意味着只接受本机连接——外网连不上是设计如此(安全),不是故障。想让 Spring Boot 容器连另一台机器的 MySQL,MySQL 必须监听 0.0.0.0 或具体网卡 IP。
步骤 3:连通性测试三件套
# ping:测网络层连通性(ICMP 协议)
ping -c 4 8.8.8.8 # 通 = 网络层 OK
ping -c 4 baidu.com # 通 = DNS + 网络层都 OK
# ping 不通 IP → 网络断;ping 通 IP 但不通域名 → DNS 问题
# curl:测应用层(HTTP)——后端工程师的主力
curl -v http://localhost:8080/api/health # -v 看握手细节
curl -I https://codeforge.example.com # 只看响应头
curl -w "\n总耗时: %{time_total}s\n" -o /dev/null -s https://baidu.com # 测延迟
# telnet/nc:测传输层端口通不通(TCP 握手能不能完成)
sudo apt install -y netcat
nc -zv 127.0.0.1 3306 # 测 MySQL 端口
nc -zv 10.0.12.6 6379 # 测另一台服务器的 Redis