计算机网络手册

速查向 · TCP/IP 分层、TCP 可靠传输与握手挥手、HTTP 演进、HTTPS 与 TLS、DNS、常见问题解析

1. 分层模型与基础

1.1 OSI 七层 vs TCP/IP 四层

OSI 七层TCP/IP 四层协议举例
应用层 / 表示层 / 会话层应用层HTTP、HTTPS、DNS、FTP、SMTP、SSH
传输层传输层TCP、UDP
网络层网络层IP、ICMP、ARP、OSPF
数据链路层 / 物理层网络接口层以太网、Wi-Fi、PPP
数据封装:应用数据 → 加 TCP 头(段 Segment)→ 加 IP 头(包 Packet)→ 加帧头帧尾(帧 Frame)→ 比特流。

1.2 输入 URL 到页面展示(经典)

  1. DNS 解析:域名 → IP(浏览器缓存 → 系统缓存 → hosts → 本地 DNS → 根/顶级/权威)。
  2. 建立 TCP 连接:三次握手。
  3. TLS 握手(HTTPS):协商密钥、验证证书。
  4. 发送 HTTP 请求,服务器处理并返回响应。
  5. 浏览器渲染:解析 HTML → 构建 DOM → CSSOM → 渲染树 → 布局 → 绘制。
  6. 断开连接:四次挥手(HTTP/1.1 默认 keep-alive 会复用连接)。

1.3 地址与端口

2. TCP 核心机制

2.1 TCP vs UDP

维度TCPUDP
连接面向连接(需握手)无连接
可靠性可靠(确认、重传、排序)不可靠,尽最大努力
传输方式字节流数据报(保留边界)
首部开销20-60 字节8 字节
速度慢(有拥塞控制)快(无拥塞控制)
一对多只支持一对一支持广播/组播
场景文件传输、HTTP、数据库视频直播、DNS、游戏、VoIP

QUIC/HTTP3 为什么用 UDP?——在用户态实现可靠传输与拥塞控制,避免 TCP 队头阻塞,且握手更快(0-RTT)。

2.2 三次握手

  1. SYN:客户端 → 服务端,SYN=1, seq=x,进入 SYN_SENT。
  2. SYN+ACK:服务端 → 客户端,SYN=1, ACK=1, seq=y, ack=x+1,进入 SYN_RCVD。
  3. ACK:客户端 → 服务端,ACK=1, seq=x+1, ack=y+1,双方 ESTABLISHED。
Q:为什么是三次而不是两次? 防止已失效的历史连接请求突然到达服务端,导致服务端建立无用连接、浪费资源。
本质是双方都要确认对方的收发能力,两次无法确认客户端的接收能力。
Q:第三次握手可以携带数据吗? 可以。第三次握手时客户端已确认服务端收发正常,可以携带数据。

2.3 四次挥手

  1. FIN:主动方 → 被动方,FIN=1, seq=u,主动方进入 FIN_WAIT_1。
  2. ACK:被动方 → 主动方,ACK=1, ack=u+1,被动方进入 CLOSE_WAIT,主动方进入 FIN_WAIT_2。
  3. FIN:被动方处理完数据后 → 主动方,FIN=1, seq=w,被动方进入 LAST_ACK。
  4. ACK:主动方 → 被动方,ACK=1, ack=w+1,主动方进入 TIME_WAIT,等待 2MSL 后关闭。
Q:为什么挥手是四次,握手是三次? TCP 是全双工的。握手时服务端可以把 SYN(我要连)和 ACK(我听到了)合并在一个包里;
而挥手时,被动方收到 FIN 后可能还有数据没发完,只能先回 ACK,等数据发完再单独发 FIN,无法合并。
Q:TIME_WAIT 为什么等 2MSL? ① 保证最后一个 ACK 能到达对方(丢了对方会重发 FIN,此时还能响应);
② 让本次连接的所有报文在网络中消失,避免影响下一个使用相同四元组的新连接。
MSL 是报文最大生存时间,Linux 默认 2MSL = 60 秒。
Q:大量 TIME_WAIT / CLOSE_WAIT 怎么办? TIME_WAIT 过多(主动关闭方):很正常,通常不用怕。可开启 tcp_tw_reuse 复用、增大端口范围、用连接池。
CLOSE_WAIT 过多(被动关闭方):这是 bug——说明应用收到 FIN 后没调用 close(),通常是代码没关连接或处理太慢,要查应用代码。

2.4 可靠传输机制

2.5 流量控制与拥塞控制

Nagle 算法:把小包攒起来一起发,减少网络开销,但会增加延迟(配合 TCP_NODELAY 关闭)。常见于对延迟敏感的 RPC。

2.6 TCP 粘包与拆包

3. HTTP 协议

3.1 HTTP 方法

方法语义幂等安全
GET获取资源是是
POST创建资源否否
PUT全量更新(不存在则创建)是否
PATCH部分更新否否
DELETE删除是否
HEAD / OPTIONS获取头 / 预检是是
幂等=同一请求执行多次结果相同(网络重试安全)。

3.2 状态码

码含义
200 / 201 / 204成功 / 已创建 / 无内容
301 / 302永久重定向(浏览器缓存)/ 临时重定向
304Not Modified,协商缓存命中
400 / 401 / 403 / 404参数错 / 未认证 / 无权限 / 不存在
405 / 429方法不允许 / 请求过多(限流)
500 / 502 / 503 / 504服务器错 / 网关错(Bad Gateway) / 不可用 / 网关超时
502 vs 504:502 是上游返回了非法响应或连不上;504 是上游响应超时。都说明 Nginx 到后端这条链路有问题。

3.3 HTTP 版本演进

版本关键特性问题
1.0每请求一个连接连接开销大
1.1长连接 keep-alive、管道化、Host 头队头阻塞(应用层)、头部冗余
2.0多路复用(二进制分帧)、头压缩 HPACK、服务器推送TCP 层队头阻塞(丢包影响所有流)
3.0基于 QUIC/UDP,0-RTT,无 TCP 队头阻塞兼容性、中间设备

3.4 HTTP 缓存

3.5 Cookie / Session / Token

4. HTTPS 与 TLS

4.1 为什么需要 HTTPS

4.2 TLS 握手(RSA 与 ECDHE)

  1. 客户端发 ClientHello(支持的 TLS 版本、密码套件、随机数 A)。
  2. 服务端回 ServerHello(选定套件、随机数 B)+ 证书。
  3. 客户端验证证书(CA 链、有效期、域名),生成 Pre-Master Secret,用证书公钥加密发送。
  4. 双方用三个随机数生成会话密钥(对称),之后用对称加密通信。
为什么用对称加密传数据、非对称加密传密钥?——非对称加密性能差(约慢千倍),对称加密快;但对称密钥不能明文传输,故用非对称加密安全交换。
TLS 1.3 改进:握手压缩到 1-RTT(甚至 0-RTT 恢复),废弃 RSA 密钥交换只用 ECDHE(前向安全:私钥泄露也不能解密历史流量),只保留 AEAD 加密套件。

4.3 证书与 CA

5. DNS 与网络排查

5.1 DNS 解析过程

  1. 浏览器缓存 → 系统缓存 → hosts 文件。
  2. 本地 DNS 服务器(递归查询)。
  3. 本地 DNS 依次问 根域名服务器 → 顶级域(.com) → 权威域名服务器,拿到 IP 返回。

记录类型:A(IPv4)、AAAA(IPv6)、CNAME(别名)、MX(邮件)、NS(域名服务器)、TXT。

DNS 用 UDP 53(查询),响应超长时用 TCP;区域传送用 TCP。

5.2 常用排查工具

工具用途
ping测试连通性与 RTT(ICMP)
traceroute逐跳跟踪路由
netstat / ss看端口监听与连接状态(ss -lntp)
tcpdump抓包分析(tcpdump -i eth0 port 80)
curl -v / -I看请求响应全过程 / 只看响应头
dig / nslookupDNS 查询
mtrping + traceroute 结合,持续观察丢包

5.3 常见问题定位

现象可能原因
Connection refused端口没监听 / 防火墙 reject
Connection timeout防火墙 drop / 路由不通 / 服务假死
ping 不通但能连ICMP 被禁,不代表网络不通
DNS 解析慢DNS 服务器慢 / 未配缓存 / 走了 IPv6 超时
偶发 502后端 GC 停顿 / 连接池耗尽 / 上游超时

6. 速查清单

主题一句话答案
TCP vs UDP可靠有序有连接 vs 不可靠无连接快
三次握手防历史失效连接;双方确认收发能力
四次挥手全双工,被动方可能还有数据要发,ACK 与 FIN 不能合并
TIME_WAIT等 2MSL 保证 ACK 到达 + 旧报文消散
CLOSE_WAIT 多应用没 close,是 bug
快速重传3 个重复 ACK 立即重传
拥塞控制慢启动 → 拥塞避免 → 快重传 → 快恢复
流量控制滑动窗口防压垮接收方
粘包字节流无边界,用长度前缀/分隔符解决
HTTP/2多路复用、头压缩,但仍有 TCP 队头阻塞
HTTP/3QUIC/UDP,解决队头阻塞,0-RTT
强缓存Cache-Control max-age,命中不发请求
协商缓存ETag/Last-Modified,命中返回 304
HTTPS非对称换密钥 + 对称传数据 + 证书认证
TLS 1.31-RTT、ECDHE 前向安全
502 vs 504上游非法响应 vs 上游超时
CORS同源策略,复杂请求先 OPTIONS 预检