Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • shell

  • tool

  • 网络

    • network category
    • http base
    • network concept
    • https
    • 网络高频问题
      • 📖 目录
      • 🌐 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手机充当软路由
    • 代理检测方式及绕过方式
  • algo

  • compute_base

  • blog

  • growth

  • java

  • C&C++

  • ai

  • secure

  • cms

  • english

  • 生活

  • 金融学

  • more

  • other
  • 网络
Jacky
2024-12-01
目录

网络高频问题

# 📌 网络高频面试问答

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

# 📖 目录

  • 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 有什么区别?

回答要点:

特性 HTTP HTTPS
端口 80 443
安全性 明文传输 加密传输
证书 不需要 需要 SSL/TLS 证书
性能 较快 较慢(加密解密开销)
SEO 一般 更好(搜索引擎偏好)

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

回答要点:

特性 HTTP/1.1 HTTP/2
连接方式 多个 TCP 连接 单个 TCP 连接
数据格式 文本格式 二进制格式
头部压缩 无 HPACK 压缩
服务器推送 无 支持
多路复用 无 支持

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

回答要点:

缓存类型:

  1. 强缓存

    • Cache-Control: max-age=3600
    • Expires: Wed, 21 Oct 2024 07:28:00 GMT
    • 浏览器直接使用缓存,不发送请求
  2. 协商缓存

    • Last-Modified / If-Modified-Since
    • ETag / If-None-Match
    • 发送请求验证资源是否更新

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

回答要点:

跨域产生的原因:

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

解决方案:

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

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

回答要点:

状态码 含义 常见场景
1xx 信息响应 100 Continue
2xx 成功 200 OK, 201 Created, 204 No Content
3xx 重定向 301 Moved Permanently, 302 Found, 304 Not Modified
4xx 客户端错误 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
5xx 服务端错误 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable

# 🔌 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 服务器推送?如何使用?

回答要点:

服务器推送的优势:

  • 减少往返时间(RTT)
  • 提前发送客户端需要的资源
  • 提升页面加载速度

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

回答要点:

重试策略:

  1. 指数退避
  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#网络#interview
上次更新: 2025/10/11, 09:25:12
https
网络安全

← https 网络安全→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式