网络基础
OSI、HTTP/TLS 与代理。
网络基础
这一课你将能做到
- 画出一次 HTTPS 请求的完整链路:DNS → TCP 三次握手 → TLS 握手 → HTTP 请求 → 响应
- 用 curl、ping、telnet、dig 四个命令定位「网站打不开」的故障层
- 配置本站的 Nginx 反向代理:负载均衡、TLS 终止、超时与缓冲
为什么要学
线上问题里至少一半是网络问题,而网络问题的排查完全依赖分层思维。「接口超时」可能是 DNS 解析慢、TCP 握手失败、TLS 证书过期、网关超时、后端真的慢——不懂网络分层,你只能重启碰运气。
人话:网络分层像快递系统。你寄一个包裹(HTTP 请求),快递单写的是收件人域名(DNS 查地址),卡车运输要保证不丢件(TCP),贵重物品要保险箱(TLS 加密),最后驿站代收分发(反向代理)。
先建立图像
OSI 七层与实际协议对照:
OSI 七层 TCP/IP 四层 本站实际组件
─────────────────────────────────────────────
7 应用层 ┐
6 表示层 ├─→ 应用层 HTTP / DNS / TLS
5 会话层 ┘
4 传输层 ──→ 传输层 TCP / UDP(端口在这里)
3 网络层 ──→ 网络层 IP / ICMP(ping 在这层)
2 数据链路层 ┐
1 物理层 ┴─→ 链路层 网卡 / 交换机
一次请求的封装过程:
[HTTP 数据] → +TCP头(端口) → +IP头(地址) → +MAC头(网卡) → 网线
跟着做
步骤 1:逐层排查「本站打不开」
# 第一层:DNS 解析是否正常?
dig coderoadmap.cn
# 期望看到 A 记录指向正确 IP。失败 → DNS 配置/本地 hosts 问题
# 第二层:网络可达吗?
ping 47.x.x.x
# 不通 → 网络链路/防火墙/安全组问题
# 第三层:端口通吗?
telnet 47.x.x.x 443
# 不通 → 服务没监听/防火墙拦截/安全组没放行 443
# 第四层:HTTP 层面什么响应?
curl -v https://coderoadmap.cn/api/health
# -v 显示完整握手过程,能看到 TLS 版本、证书、响应头、耗时分布
curl -v 输出里藏着金矿:Connected to 前是 TCP 耗时,SSL handshake 是 TLS 耗时,> 开头是发出的请求,< 开头是收到的响应。
步骤 2:理解 TCP 三次握手(面试必考)
客户端 服务端
│ ──── SYN(seq=x) ────────────→ │ 「我想连接,序号从 x 开始」
│ ←── SYN+ACK(seq=y,ack=x+1) ── │ 「好的,我的序号 y,期待你的 x+1」
│ ──── ACK(ack=y+1) ──────────→ │ 「确认,开始传数据」
为什么是三次不是两次?
两次无法防止「历史失效连接」:客户端发的第一个 SYN 在网络里迷路,
客户端超时重发并完成了通信;之后迷路的 SYN 又到达服务端——
如果两次握手,服务端会为这个失效 SYN 白白建立连接浪费资源。
步骤 3:配置本站 Nginx 反向代理
upstream backend {
least_conn; # 最少连接数算法
server 10.0.1.11:8080 max_fails=3; # 失败 3 次摘除
server 10.0.1.12:8080 max_fails=3;
keepalive 32; # 到后端的长连接池
}
server {
listen 443 ssl;
server_name coderoadmap.cn;
ssl_certificate /etc/nginx/cert.pem;
ssl_certificate_key /etc/nginx/key.pem;
ssl_protocols TLSv1.2 TLSv1.3; # 禁用过时协议
location /api/ {
proxy_pass http://backend;
proxy_connect_timeout 3s; # 连接后端超时
proxy_read_timeout 30s; # 等后端响应超时
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}