网络
一、网络基础
1. TCP 与 UDP 的区别
答案:
TCP(Transmission Control Protocol)是面向连接的、可靠的传输协议,具有顺序保证、重传机制、流量控制、拥塞控制等特性;UDP(User Datagram Protocol)是无连接的、不可靠的传输协议,不保证顺序与可靠性,但开销小、实时性强。
常见问法:
-
为什么视频通话或直播使用 UDP?
→ 因为 UDP 无需等待重传,丢包不会阻塞整体流,能保证实时性。
-
TCP 如何保证可靠性?
→ 通过序列号、确认应答(ACK)、超时重传、滑动窗口等机制。
2. TCP 三次握手与四次挥手
答案:
三次握手:
- 客户端 → 发送 SYN(请求建立连接)
- 服务端 → 发送 SYN+ACK(确认并同意)
- 客户端 → 发送 ACK(确认)
作用:确认双方的发送与接收能力正常,防止旧连接误触发。
四次挥手:
- 客户端 → 发送 FIN(请求断开连接)
- 服务端 → 发送 ACK(确认)
- 服务端 → 发送 FIN(我也要断开)
- 客户端 → 发送 ACK(确认)
追问:为什么断开要四次?
→ 因为 TCP 是全双工通信,双方都必须独立关闭各自的数据通道。
二、HTTP 基础与演进
1. HTTP 与 HTTPS 的区别
答案:
HTTPS = HTTP + TLS/SSL。
相比 HTTP,HTTPS 提供了三大安全特性:
- 加密传输(防窃听)
- 身份验证(防伪造)
- 数据完整性校验(防篡改)
常见追问:
-
HTTPS 如何加密?
→ 使用“非对称加密”交换密钥,然后使用“对称加密”进行高速数据传输。
-
如何优化 HTTPS 性能?
→ 复用连接(HTTP/2)、启用会话重用(Session Resume)、使用 CDN。
2. HTTP/1.1、HTTP/2、HTTP/3 的区别
答案:
- HTTP/1.1:文本协议,请求串行(存在队头阻塞)。
- HTTP/2:二进制帧、多路复用、头部压缩(HPACK),同一连接可并发多请求。
- HTTP/3:基于 UDP 的 QUIC 协议,解决 TCP 队头阻塞,支持 0-RTT 建连。
面试关键点:
HTTP/2 的多路复用允许单个 TCP 连接承载多请求,而 HTTP/1.1 需要多连接并发。
三、iOS 网络框架与实践
1. NSURLSession 基本原理
答案:
NSURLSession 是 iOS 的核心网络框架,取代 NSURLConnection。
支持普通请求、下载/上传任务、后台任务与断点续传。
常见追问:
-
如何实现断点续传?
→ 使用 downloadTask(withResumeData:)。
-
如何全局拦截请求?
→ 通过自定义 URLProtocol 拦截所有请求进行统一处理(如注入 Header)。
2. 网络缓存机制
答案:
HTTP 缓存分为两类:
- 强缓存:直接使用本地缓存(Cache-Control: max-age、Expires)。
- 协商缓存:需与服务器验证(ETag、Last-Modified)。
强缓存命中时不会发请求,协商缓存命中时返回 304(未修改)。
3. 网络层封装(AFNetworking / Alamofire)
答案:
封装要点:
- 统一请求入口(如 APIClient)。
- 集中配置 baseURL、headers、token。
- 统一错误处理和重试逻辑。
追问:如何处理 token 过期?
→ 在拦截器中检测 401,自动刷新 token 并重发请求。
四、网络优化与安全
1. 网络性能优化策略
答案:
- 减少请求次数:接口合并、数据缓存、本地预加载。
- 加快响应速度:CDN、HTTP/2 多路复用、DNS 预解析。
- 压缩传输:使用 gzip 或 brotli 压缩数据。
- 图片优化:WebP、小图占位、按需加载。
追问:首屏优化如何做?
→ 预加载关键数据、并行请求、缓存首页配置、延迟加载非核心模块。
2. Token 安全与存储
答案:
- Token 必须通过 HTTPS 传输。
- 存储建议放入 Keychain(非 UserDefaults)。
- Token 过期时使用 Refresh Token 刷新,不重复登录。
追问:如何防止中间人攻击?
→ 使用证书绑定(SSL Pinning),只信任预置的服务器公钥。
3. 网络错误与重试机制
答案:
- 对可恢复错误(如超时、网络波动)重试。
- 不可恢复错误(如认证失败、参数错误)直接上报。
- 重试采用指数退避算法,如 1s、2s、4s、8s 延时。
追问:如何防止请求风暴?
→ 在重试时加入随机抖动(jitter)与最大重试次数。
五、综合高频问题
1. 如何判断当前网络状态?
答案:
使用 Network.framework 或 Reachability 检测网络变化:
- .wifi、.cellular、.unsatisfied 等状态可直接获取。
2. 弱网环境如何优化?
答案:
- 设置合理超时与重试策略。
- 分块传输大文件(Range 请求)。
- 降级为低分辨率资源。
- 提前缓存静态资源与关键配置。
3. HTTPS 证书验证失败怎么办?
答案:
开发阶段可通过 delegate 容忍(didReceive challenge:),
但生产环境必须验证证书链与域名匹配,防止 MITM 攻击。
4. App 启动网络请求如何设计?
答案:
- 并行请求非依赖任务(配置、广告、版本检测)。
- 串行执行依赖任务(登录→拉取用户信息→加载首页)。
- 使用 Promise 或 Combine 管理依赖。
5. 常见网络安全防护措施
答案:
- 全站 HTTPS。
- Token + 签名机制(防篡改)。
- 时间戳 + nonce 防重放。
- 关键数据本地加密。
这些问答覆盖 iOS 网络方向的核心考点,可直接用于中高级面试现场背诵或复盘使用。
是否需要我下一步帮你整理成「网络专题总结卡片版」(便于记忆与快速浏览)?
TCP 和 UDP 的区别
TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。
Cookie 和 Session
-
cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
-
cookie 相比 session 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session。
-
session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 cookie。
-
单个 cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存 20 个 cookie。而 session 存储在服务端,可以无限量存储。
-
所以:将登录信息等重要信息存放为 session,其他信息如果需要保留,可以放在 cookie 中。
DNS 解析过程
-
客户端打开浏览器,输入一个域名。比如输入
www.163.com,这时,客户端会发出一个 DNS 请求到本地 DNS 服务器。本地 DNS 服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。 -
查询
www.163.com的 DNS 请求到达本地 DNS 服务器之后,本地 DNS 服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地 DNS 服务器还要向 DNS 根服务器进行查询。 -
根 DNS 服务器没有记录具体的域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。
-
本地 DNS 服务器继续向域服务器发出请求,在这个例子中,请求的对象是
.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,你的域名的解析服务器的地址。 -
最后,本地 DNS 服务器向域名的解析服务器发出请求,这时就能收到一个域名和 IP 地址对应关系,本地 DNS 服务器不仅要把 IP 地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。