6大核心主题 · 10个SVG图解 · 面试+生产双杀
| 状态 | 所在端 | 含义 | 面试常见问题 |
|---|---|---|---|
| SYN_SENT | Client | 已发SYN,等待SYN+ACK | 超时重传SYN(默认5次,间隔1s/2s/4s/8s/16s) |
| SYN_RCVD | Server | 已发SYN+ACK,等待ACK | SYN Flood攻击就是利用此状态耗尽半连接队列 |
| ESTABLISHED | 双方 | 连接建立,可传输数据 | 三次握手完成后的稳定状态 |
| FIN_WAIT_1 | Client | 已发FIN,等待ACK | 如果对面宕机,会一直等待(超时后关闭) |
| FIN_WAIT_2 | Client | 收到ACK,等待对方FIN | 如果Server不close(),Client会一直卡在此状态 |
| CLOSE_WAIT | Server | 收到FIN,已回ACK,等应用层close() | 大量CLOSE_WAIT = 代码bug(忘了close()) |
| LAST_ACK | Server | 已发FIN,等待最后ACK | 如果ACK丢失,会重发FIN |
| TIME_WAIT | Client | 等待2MSL后关闭 | 大量TIME_WAIT = 短连接过多,用连接池缓解 |
| 对比维度 | 对称加密 (AES) | 非对称加密 (RSA/ECC) |
|---|---|---|
| 密钥数量 | 1个(加密解密同一把钥匙) | 2个(公钥加密,私钥解密) |
| 速度 | 极快(硬件加速) | 慢(几百~上千倍差距) |
| 用途 | 大量数据加密 | 密钥交换、数字签名 |
| HTTPS中的角色 | 加密实际数据传输 | 握手阶段交换会话密钥 |
| 密钥分发 | 困难(如何安全传密钥?) | 简单(公钥可公开) |
| 对比维度 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 传输层 | TCP | TCP | QUIC (基于UDP) |
| 多路复用 | ❌ 不支持 | ✅ 同一TCP连接并行流 | ✅ 独立QUIC流 |
| 队头阻塞 | ❌ HTTP层阻塞 | ⚠️ TCP层仍阻塞 | ✅ 完全消除 |
| 头部压缩 | ❌ 无 | ✅ HPACK | ✅ QPACK |
| 连接建立 | TCP 1-RTT + TLS 1-2RTT | TCP 1-RTT + TLS 1-RTT | QUIC 0-1 RTT (含TLS) |
| 对比维度 | Session | JWT |
|---|---|---|
| 存储位置 | 服务端(内存/Redis) | 客户端(localStorage/Cookie) |
| 状态 | 有状态 | 无状态 |
| 扩展性 | 需共享Session存储 | 天然支持分布式 |
| 注销 | 直接删除Session | 只能等过期(或加黑名单) |
| 安全性 | SessionID泄露风险 | Payload可被解码 |
| 性能 | 每次查存储 | 只验证签名,无IO |
| 体积 | SessionID很小 | Token较大(1-2KB) |
| 适用场景 | 单体应用/需要即时注销 | 微服务/分布式/跨域 |
| 授权模式 | 安全性 | 适用场景 | Token经过浏览器? |
|---|---|---|---|
| 授权码(Authorization Code) | ✅ 最安全 | 有后端的Web应用 | ❌ 不经过 |
| 授权码+PKCE | ✅ 安全 | SPA/移动端(无client_secret) | ❌ 不经过 |
| 客户端凭证(Client Credentials) | ✅ 安全 | 服务间调用(M2M) | ❌ 不经过 |
| 隐式(Implicit) | ⚠️ 不安全 | 已废弃(OAuth2.1移除) | ⚠️ Token直接返回浏览器 |
| 密码(Password) | ⚠️ 不安全 | 已废弃(需传密码) | ⚠️ 需传用户密码 |
核心原因:防止历史连接请求导致服务器误建立连接。
假设Client发了一个SYN请求,但因为网络延迟很久才到达Server。Client以为丢了又发了一个新的SYN。如果只有两次握手,Server收到旧的SYN就会直接建立连接,浪费资源。三次握手中,Server发SYN+ACK后需要等Client确认,Client发现是旧请求就会发RST拒绝,避免建立无效连接。
两个原因:
1. 确保最后一个ACK到达对方:如果Client发的最后一个ACK丢了,Server会重发FIN。Client在TIME_WAIT状态能收到这个重发的FIN并重新发ACK。2MSL = 一个MSL用于ACK到达Server + 一个MSL用于可能的FIN重传到达Client。
2. 让旧连接的延迟报文消失:MSL是报文最大生存时间,等2MSL后旧连接的所有报文都已过期,不会影响新连接。
性能原因:非对称加密(RSA/ECC)比对称加密(AES)慢几百到上千倍。
所以HTTPS的设计思路是:用非对称加密安全地交换一个对称密钥(会话密钥),然后用这个对称密钥加密后续所有数据。既保证了密钥交换的安全性,又保证了数据传输的效率。这就是"混合加密"方案。
Session:服务端存储用户状态,通过SessionID关联。优点是服务端可随时注销;缺点是不易扩展(需共享Session存储)。
JWT:无状态,Token自带用户信息。优点是天然支持分布式、不需要服务端存储;缺点是无法主动让Token失效(只能等过期)、Payload可被解码(不能放敏感信息)、Token体积比SessionID大。
选择建议:微服务/分布式架构选JWT;单体应用或需要即时注销选Session。也可以混合使用:短期Access Token + 黑名单机制。
核心区别:Token是否经过浏览器。
授权码模式:浏览器只拿到授权码(code),code通过后端用client_secret换取Token。Token永远不会出现在浏览器URL或前端代码中,即使授权码泄露也无法获取Token。
隐式模式(已废弃):Token直接返回给浏览器,存在Token泄露风险(浏览器历史记录、Referer头等)。OAuth2.1已移除隐式模式。
预检请求(Preflight)是浏览器在发送跨域"非简单请求"之前,自动发送的一个OPTIONS请求,用于询问服务器是否允许实际请求。
触发条件(满足任一即触发):
注意:CORS是浏览器行为,服务端之间直接调用不受CORS限制。
04 - 网络与安全图解 · Java核心图解系列
从"背八股"到"看懂画面"
网络安全三原则:① HTTPS 是底线,TLS 1.2+ 证书必须覆盖全域名 → ② JWT 无状态但无法主动失效,敏感操作配合 Redis 黑名单 → ③ SQL 预编译 + 输入校验双保险,永不信前端