Jacky's blog
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)
  • 计算机基础

  • 网络

    • network category
    • 网络入门指南
    • network concept
    • HTTPS 与 TLS 握手
    • 网络高频问题
      • 📖 目录
      • 🌐 TCP/UDP 协议
        • Q1: 什么是TCP三次握手?
        • Q2: 为什么是三次握手,不是两次或四次?
        • Q3: 为什么挥手需要四次?
        • Q4: TCP 和 UDP 有什么区别?
        • Q5: 什么是 TIME_WAIT 状态?为什么需要等待 2MSL?
      • 🔒 HTTP/HTTPS 协议
        • Q6: HTTP 和 HTTPS 有什么区别?
        • Q7: HTTP/1.1 和 HTTP/2 有什么区别?
        • Q8: 什么是 HTTP 缓存?有哪些缓存策略?
        • Q9: 什么是跨域?如何解决跨域问题?
        • Q10: HTTP 状态码有哪些?分别代表什么含义?
      • 🔌 WebSocket 技术
        • Q11: WebSocket 和 Socket 有什么区别?
        • Q12: WebSocket 连接建立过程是怎样的?
        • Q13: 如何实现 WebSocket 的心跳机制?
      • ⚡ 网络性能优化
        • Q14: 如何优化网络请求性能?
        • Q15: 什么是 HTTP/2 服务器推送?如何使用?
        • Q16: 如何实现请求重试机制?
      • 🔧 常见问题
        • Q17: 网络请求超时如何处理?
        • Q18: 如何检测网络连接状态?
        • Q19: 如何实现离线缓存?
        • Q20: 网络请求失败时如何优雅降级?
        • Q21: 什么是 DNS 解析?如何优化 DNS 查询?
      • 📚 学习建议
        • 如何准备网络面试?
        • 面试技巧
      • 🎯 总结
    • 网络安全
    • java http sign snip
    • 软路由
    • DHCP
    • ACME
    • 闲置android手机充当软路由
    • 代理检测方式及绕过方式
  • 操作系统

  • Shell

  • 安全

  • 设计模式

  • cs
  • network
Jacky
2024-12-01
目录

网络高频问题

# 📌 网络高频面试问答

适合人群:准备网络面试的开发者、网络学习者
问题类型:TCP/UDP、HTTP/HTTPS、WebSocket、网络协议
标签:FAQ - 快速回顾高频问题

阅读方式:本页保留面试简答与独有案例;HTTP 版本、缓存、状态码和 Server Push 的详细说明集中在 HTTP 基础,TLS 与证书集中在 HTTPS 文档。

# 📖 目录

  • TCP/UDP 协议
  • HTTP/HTTPS 协议
  • WebSocket 技术
  • 网络性能优化
  • 常见问题

# 🌐 TCP/UDP 协议

# Q1: 什么是TCP三次握手?

回答要点:

TCP三次握手是TCP协议在建立连接时的过程,用于确保客户端和服务器都准备好进行数据传输。

三次握手过程:

客户端                                  服务器
   |                                      |
   |  1. SYN (seq=x)                      |
   | -----------------------------------> |
   |                                      |
   |  2. SYN-ACK (seq=y, ack=x+1)         |
   | <----------------------------------- |
   |                                      |
   |  3. ACK (seq=x+1, ack=y+1)           |
   | -----------------------------------> |
   |                                      |
   |        连接建立 (ESTABLISHED)          |
1
2
3
4
5
6
7
8
9
10
11
12

详细步骤:

  1. 第一次握手(SYN)

    • 客户端发送 SYN 包(同步序列号)到服务器
    • 客户端进入 SYN_SENT 状态
    • 携带初始序列号 seq = x
  2. 第二次握手(SYN-ACK)

    • 服务器收到 SYN 包,发送 SYN-ACK 包
    • 服务器进入 SYN_RCVD 状态
    • 确认号 ack = x + 1
    • 携带自己的初始序列号 seq = y
  3. 第三次握手(ACK)

    • 客户端收到 SYN-ACK 包,发送 ACK 包
    • 客户端进入 ESTABLISHED 状态
    • 确认号 ack = y + 1
    • 序列号 seq = x + 1
    • 服务器收到 ACK 后也进入 ESTABLISHED 状态

状态转换图:

客户端状态:  CLOSED -> SYN_SENT -> ESTABLISHED
服务器状态:  CLOSED -> LISTEN -> SYN_RCVD -> ESTABLISHED
1
2

代码示例(Python Socket):

import socket

# 客户端
def tcp_client():
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # connect() 内部完成三次握手
    client.connect(('localhost', 8080))
    # 此时连接已建立(ESTABLISHED)
    
    # 发送数据
    client.send(b'Hello Server')
    
    # 接收数据
    data = client.recv(1024)
    print(f"收到: {data.decode()}")
    
    client.close()

# 服务器
def tcp_server():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(('localhost', 8080))
    
    # 开始监听(LISTEN状态)
    server.listen(5)
    print("服务器等待连接...")
    
    # accept() 完成三次握手的服务器端处理
    conn, addr = server.accept()
    # 此时连接已建立(ESTABLISHED)
    
    print(f"客户端已连接: {addr}")
    
    # 接收数据
    data = conn.recv(1024)
    print(f"收到: {data.decode()}")
    
    # 发送响应
    conn.send(b'Hello Client')
    
    conn.close()
    server.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

抓包示例(Wireshark):

1. 客户端 -> 服务器: [SYN] Seq=0 Win=65535 Len=0
2. 服务器 -> 客户端: [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0
3. 客户端 -> 服务器: [ACK] Seq=1 Ack=1 Win=65535 Len=0
1
2
3

# Q2: 为什么是三次握手,不是两次或四次?

回答要点:

三次握手的首要原因是为了 防止旧的重复连接初始化造成混乱。具体原因包括:

  1. 阻止重复历史连接的初始化(主要原因)

    • 在第二次握手时,客户端通过上下文对比,期望收到的 ACK 与实际收到的 ACK NUM 是否一致
    • 如果不一致,则发送 RST 报文中止连接
  2. 同步双方的初始序列号

    • 确保双方都能正确识别数据包的顺序
  3. 避免资源浪费

    • 防止无效连接占用服务器资源

参考链接: 三次握手详解 (opens new window)

三次握手示意图

# Q3: 为什么挥手需要四次?

回答要点:

四次挥手的原因:

  1. TCP 是全双工通信

    • 客户端和服务端都可以独立关闭自己的发送通道
    • 需要分别发送 FIN 报文来关闭各自的发送通道
  2. 服务端可能还有数据要发送

    • 服务端收到客户端的 FIN 后,可能还有数据需要发送给客户端
    • 所以先发送 ACK 确认,等数据发送完毕后再发送 FIN

四次挥手过程:

  • 客户端发送 FIN 报文,进入 FIN_WAIT_1 状态
  • 服务端发送 ACK 应答报文,进入 CLOSE_WAIT 状态
  • 客户端收到 ACK 后,进入 FIN_WAIT_2 状态
  • 服务端发送 FIN 报文,进入 LAST_ACK 状态
  • 客户端发送 ACK 应答报文,进入 TIME_WAIT 状态
  • 服务端收到 ACK 后,进入 CLOSE 状态
  • 客户端经过 2MSL 后,进入 CLOSE 状态

四次挥手

# Q4: TCP 和 UDP 有什么区别?

回答要点:

特性 TCP UDP
连接性 面向连接 无连接
可靠性 可靠传输 不可靠传输
速度 较慢 较快
头部开销 20字节 8字节
流量控制 有 无
拥塞控制 有 无
应用场景 HTTP、FTP、邮件 视频、游戏、DNS

# Q5: 什么是 TIME_WAIT 状态?为什么需要等待 2MSL?

回答要点:

TIME_WAIT 状态的作用:

  1. 确保最后的 ACK 能够到达

    • 如果服务端没有收到最后的 ACK,会重发 FIN 报文
    • 客户端需要能够接收并重发 ACK
  2. 防止旧连接的数据包影响新连接

    • 等待 2MSL 确保网络中所有旧连接的数据包都消失
    • 避免新连接收到旧连接的数据包

MSL(Maximum Segment Lifetime):

  • 数据包在网络中的最大生存时间
  • 通常为 2 分钟,所以 TIME_WAIT 状态持续 4 分钟

# 🔒 HTTP/HTTPS 协议

# Q6: HTTP 和 HTTPS 有什么区别?

回答要点:

HTTPS 在 TLS 保护下使用 HTTP,提供传输机密性、完整性和服务器身份验证。80/443 是默认端口,不是唯一端口;性能取决于握手、连接复用、协议版本及网络条件,不能断言 HTTPS 总是更慢。

详见 HTTP 与 HTTPS 对比及握手。

# Q7: HTTP/1.1 和 HTTP/2 有什么区别?

回答要点:

HTTP/1.1 也能复用 TCP 连接;HTTP/2 引入二进制分帧、HPACK 和同一连接上的多流复用,但不能消除 TCP 丢包造成的队头阻塞。协议中的 Server Push 能力不等于浏览器实际支持。

详见 HTTP 版本与连接复用。

# Q8: 什么是 HTTP 缓存?有哪些缓存策略?

回答要点:

符合复用条件且仍新鲜的缓存通常可以直接使用;需要验证时,通过 ETag 或修改时间发送条件请求。no-cache 要求验证,不是禁止存储;no-store 才是禁止存储。

详见 HTTP 缓存指令、条件请求与 304。

# Q9: 什么是跨域?如何解决跨域问题?

回答要点:

跨域产生的原因:

  • 浏览器的同源策略限制
  • 协议、域名、端口任一不同即为跨域

解决方案:

  1. CORS(跨域资源共享)
  2. JSONP
  3. 代理服务器

# Q10: HTTP 状态码有哪些?分别代表什么含义?

回答要点:

按 1xx 信息响应、2xx 成功、3xx 重定向类、4xx 客户端错误类、5xx 服务端错误类分类。注意 304 用于缓存验证,不是 URL 跳转;401 与 403 也不是同一含义。

完整对照见 HTTP 状态码速查。

# 🔌 WebSocket 技术

# Q11: WebSocket 和 Socket 有什么区别?

回答要点:

特性 WebSocket Socket
协议层级 应用层 传输层
连接方式 基于 HTTP 升级 直接 TCP/UDP 连接
浏览器支持 原生支持 需要插件或 Node.js
防火墙穿透 容易(基于 HTTP) 困难
使用复杂度 简单 复杂

# Q12: WebSocket 连接建立过程是怎样的?

回答要点:

连接建立步骤:

  1. HTTP 握手
  2. 服务端响应
  3. 协议升级

# Q13: 如何实现 WebSocket 的心跳机制?

回答要点:

心跳机制的作用:

  • 检测连接是否存活
  • 防止连接被防火墙或代理服务器关闭
  • 及时发现网络问题

# ⚡ 网络性能优化

# Q14: 如何优化网络请求性能?

回答要点:

优化策略:

  1. 减少请求数量
  2. 压缩数据
  3. 使用 CDN
  4. 预加载和预连接

# Q15: 什么是 HTTP/2 服务器推送?如何使用?

回答要点:

Server Push 允许服务器提前发送客户端尚未请求的资源,但协议能力不等于客户端支持,也不保证性能提升。Chrome 自 106 起默认停用该能力,现代浏览器项目不应把启用 Server Push 作为通用优化建议。

适用限制与替代方向见 HTTP/2 Server Push。

# Q16: 如何实现请求重试机制?

回答要点:

重试策略:

  1. 指数退避

    一种在遇到失败时逐渐增加重试等待时间的策略,广泛应用于网络通信、分布式系统和 API 调用中

  2. 最大重试次数限制

  3. 错误类型判断

# 🔧 常见问题

# Q17: 网络请求超时如何处理?

回答要点:

超时处理策略:

  1. 设置合理的超时时间
  2. 提供用户友好的错误提示
  3. 实现重试机制
  4. 记录错误日志

# Q18: 如何检测网络连接状态?

回答要点:

检测方法:

  1. Navigator.onLine
  2. 心跳检测
  3. 监听网络事件

# Q19: 如何实现离线缓存?

回答要点:

缓存策略:

  1. Service Worker
  2. Cache API
  3. IndexedDB

# Q20: 网络请求失败时如何优雅降级?

回答要点:

降级策略:

  1. 缓存数据
  2. 默认值
  3. 简化功能
  4. 用户提示

# Q21: 什么是 DNS 解析?如何优化 DNS 查询?

回答要点:

DNS 解析过程:

  1. 浏览器缓存
  2. 操作系统缓存
  3. 路由器缓存
  4. ISP DNS 服务器
  5. 根域名服务器

优化策略:

  1. DNS 预解析
  2. 使用 CDN
  3. 减少 DNS 查询次数

# 📚 学习建议

# 如何准备网络面试?

  1. 理解核心协议:TCP、UDP、HTTP、HTTPS、WebSocket
  2. 掌握性能优化:缓存、压缩、CDN、HTTP/2
  3. 熟悉常见问题:跨域、超时、重试、降级
  4. 了解最新技术:HTTP/3、WebRTC、Service Worker
  5. 实践项目经验:能够结合实际项目讲解优化案例

# 面试技巧

  • 结构化回答:问题背景 → 解决方案 → 代码示例
  • 举一反三:从一个问题延伸到相关知识点
  • 实战经验:结合项目实际遇到的问题和解决方案
  • 保持更新:关注网络技术的最新发展

# 🎯 总结

这份 FAQ 覆盖了网络面试的核心考点:

  • ✅ TCP/UDP 协议:三次握手、四次挥手、流量控制
  • ✅ HTTP/HTTPS 协议:状态码、缓存、跨域、HTTP/2
  • ✅ WebSocket 技术:连接建立、心跳机制、与 Socket 对比
  • ✅ 性能优化:请求优化、服务器推送、重试机制
  • ✅ 常见问题:超时处理、网络检测、离线缓存、优雅降级
  • ✅ 实战经验:完整的代码示例和解决方案

通过这些高频问题的准备,你将能够自信地应对网络相关的技术面试!🚀

#FAQ#network#interview#cs-fundamentals
上次更新: 2026/10/18, 22:14:48
HTTPS 与 TLS 握手
网络安全

← HTTPS 与 TLS 握手 网络安全→

最近更新
01
Codex 使用与会话管理指南
10-17
02
Tailscale 入门:让自己的设备跨网络互联
10-15
03
GitHub CLI(gh)工作流与 CI 排查
10-08
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式