```html
📅 更新日期:2024年5月 🌐 专注技术深度解析

网络协议面试全攻略

深入理解 网络协议 的核心原理,掌握大厂面试高频考点。从底层 Socket 到应用层 HTTP/2,为您提供结构化、深度化的知识图谱。

TCP/IP HTTP/1.1 & 2 & 3 HTTPS/TLS WebSocket DNS/CDN Socket编程

网络协议核心架构

🏗️ 五层模型

面试常考基础,需清晰区分各层职责:

  • 应用层:HTTP, DNS, SMTP, FTP。负责数据格式与语义。
  • 传输层:TCP, UDP。负责端到端通信、可靠传输与流量控制。
  • 网络层:IP, ICMP, ARP。负责路由选择与逻辑寻址。
  • 数据链路层:Ethernet, PPP。负责帧传输与物理寻址(MAC)。
  • 物理层:网线, 光纤, 无线电波。负责比特流传输。

🔗 数据封装过程

理解数据如何从应用层向下封装:

  • 应用层:生成数据(Data)。
  • 传输层:添加TCP/UDP头部(Header),形成段(Segment)。
  • 网络层:添加IP头部,形成包(Packet)。
  • 链路层:添加帧头和帧尾(FCS),形成帧(Frame)。
  • 物理层:转换为比特流(Bits)发送。

🛡️ 关键概念辨析

面试官常问易混淆点:

  • 同步 vs 异步:信号发生器是否依赖时钟。
  • 并行 vs 串行:数据是否同时传输多位。
  • 全双工 vs 半双工:是否支持双向同时通信。
  • 基带 vs 宽带:数字信号 vs 模拟信号传输。

TCP/IP 深度解析

TCP是面试的重中之重,请重点掌握状态机、拥塞控制及粘包处理。

三次握手
四次挥手
状态机详解
拥塞控制

🤝 三次握手(Three-Way Handshake)

目的:建立连接,同步序列号(ISN),确认对方的接收能力。

步骤 方向 标志位 序列号 说明
1 Client → Server SYN=1 seq=x 客户端请求建立连接,进入SYN_SENT状态。
2 Server → Client SYN=1, ACK=1 seq=y, ack=x+1 服务端确认客户端请求,并请求建立连接,进入SYN_RCVD状态。
3 Client → Server ACK=1 seq=x+1, ack=y+1 客户端确认服务端请求,连接建立,进入ESTABLISHED状态。

为什么是三次? 防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。两次握手无法保证双方都确认了对方的发送和接收能力。

👋 四次挥手(Four-Way Wave)

目的:可靠地终止连接,确保双方数据发送完毕。

  • 第一次挥手:Client发送FIN,表示客户端没有数据要发送了(主动关闭)。
  • 第二次挥手:Server发送ACK,确认收到FIN。此时Server可能还有数据未发送完,处于CLOSE_WAIT状态。
  • 第三次挥手:Server发送FIN,表示Server也没有数据要发送了。
  • 第四次挥手:Client发送ACK,确认收到FIN。Client进入TIME_WAIT状态,等待2MSL后关闭。

为什么需要TIME_WAIT? 1. 确保最后一个ACK能到达Server;2. 防止已失效的连接请求报文段出现在本连接中。

🔄 关键状态机

面试中常要求画出或解释状态转换:

  • SYN_SENT:客户端发送SYN后等待确认。
  • SYN_RCVD:服务端收到SYN并回复SYN+ACK后。
  • ESTABLISHED:连接建立成功,可传输数据。
  • CLOSE_WAIT:被动关闭方收到FIN后,等待应用层关闭 socket。
  • LAST_ACK:被动关闭方发送FIN后,等待对方的ACK。
  • TIME_WAIT:主动关闭方发送最后一个ACK后,等待2MSL。

📉 拥塞控制算法

核心机制:慢启动、拥塞避免、快重传、快恢复。

  • 慢启动(Slow Start):初始拥塞窗口(cwnd)设为1,每收到一个ACK,cwnd指数增长。
  • 拥塞避免(Congestion Avoidance):当cwnd达到慢启动阈值(ssthresh)后,cwnd线性增长,避免网络过载。
  • 快重传(Fast Retransmit):收到3个重复ACK时,立即重传丢失报文,无需等待超时。
  • 快恢复(Fast Recovery):执行快重传后,将ssthresh设为cwnd的一半,cwnd设为新的ssthresh,然后进入拥塞避免阶段,避免将cwnd重置为1。

HTTP 与 HTTPS 进阶

🌐 HTTP 版本演进

HTTP/1.1:支持持久连接、管道化,但存在队头阻塞问题。

HTTP/2:二进制分帧、多路复用、头部压缩(HPACK)、服务器推送。解决了队头阻塞,提升性能。

HTTP/3:基于QUIC协议(运行在UDP上),彻底解决应用层队头阻塞,握手更快(0-RTT)。

🔒 HTTPS 原理

混合加密:非对称加密用于密钥交换,对称加密用于数据传输。

数字证书:由CA机构签发,包含公钥、域名、有效期等,用于验证服务器身份,防止中间人攻击。

TLS 握手流程:
1. Client Hello:支持协议版本、加密套件、随机数。
2. Server Hello:选定加密套件、服务器证书、随机数。
3. 密钥交换:客户端验证证书,生成预主密钥,用服务器公钥加密发送。
4. 生成会话密钥:双方根据随机数和预主密钥生成对称密钥。

📝 HTTP 常用方法

  • GET:获取资源,幂等,安全,参数在URL中。
  • POST:提交数据,非幂等,数据在Body中。
  • PUT:更新资源,幂等,全量替换。
  • DELETE:删除资源,幂等。
  • HEAD:只获取响应头,不获取Body。
  • OPTIONS:预检请求,用于CORS跨域。

WebSocket 与 DNS 解析

🌐 WebSocket 握手

WebSocket 基于 HTTP 协议进行握手,使用 Upgrade 头部切换到 WS 协议。

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

服务器返回 101 Switching Protocols 后,连接建立,双方可进行全双工通信。

🔍 DNS 解析过程

1. 浏览器缓存:检查本地hosts文件和浏览器DNS缓存。

2. 操作系统缓存:检查操作系统DNS缓存(ARP表等)。

3. 路由器缓存:检查本地路由器DNS缓存。

4. ISP DNS:向运营商提供的DNS服务器(递归解析器)发起请求。

5. 根域名服务器:递归解析器向根服务器查询顶级域名(TLD)服务器地址。

6. TLD服务器:向.com/.cn等服务器查询权威域名服务器地址。

7. 权威DNS服务器:查询最终IP地址并返回给递归解析器。

8. 返回结果:递归解析器将结果缓存并返回给客户端。

大厂面试高频真题

TCP粘包
跨域问题
CDN原理

📦 什么是TCP粘包?如何解决?

原因:TCP是流式协议,无边界。发送方发送消息过快,接收方缓冲区不足,导致多个消息合并接收;或接收方处理慢,导致消息积压。

解决方案:
1. 定长消息:每条消息固定长度,不足补空格。
2. 分隔符:使用特定字符(如\n, \r\n)作为消息结束标志。
3. 消息长度+消息体:在头部添加4字节长度字段,指定后续Body长度。
4. 应用层协议:如HTTP/1.1的Content-Length,HTTP/2的二进制帧。

🌍 什么是跨域?如何解决?

原因:浏览器的同源策略(Same-Origin Policy)限制,协议、域名、端口任一不同即跨域。

解决方案:
1. CORS(跨域资源共享):后端设置响应头 Access-Control-Allow-Origin。
2. JSONP:利用 ```