应用技术
网络

网络

一、网络基础

1. TCP 与 UDP 的区别

答案:

TCP(Transmission Control Protocol)是面向连接的、可靠的传输协议,具有顺序保证、重传机制、流量控制、拥塞控制等特性;UDP(User Datagram Protocol)是无连接的、不可靠的传输协议,不保证顺序与可靠性,但开销小、实时性强。

常见问法:

  • 为什么视频通话或直播使用 UDP?

    → 因为 UDP 无需等待重传,丢包不会阻塞整体流,能保证实时性。

  • TCP 如何保证可靠性?

    → 通过序列号、确认应答(ACK)、超时重传、滑动窗口等机制。


2. TCP 三次握手与四次挥手

答案:

三次握手:

  1. 客户端 → 发送 SYN(请求建立连接)
  2. 服务端 → 发送 SYN+ACK(确认并同意)
  3. 客户端 → 发送 ACK(确认)

作用:确认双方的发送与接收能力正常,防止旧连接误触发。

四次挥手:

  1. 客户端 → 发送 FIN(请求断开连接)
  2. 服务端 → 发送 ACK(确认)
  3. 服务端 → 发送 FIN(我也要断开)
  4. 客户端 → 发送 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

  1. cookie 数据存放在客户的浏览器上,session 数据放在服务器上。

  2. cookie 相比 session 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session。

  3. session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 cookie。

  4. 单个 cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存 20 个 cookie。而 session 存储在服务端,可以无限量存储。

  5. 所以:将登录信息等重要信息存放为 session,其他信息如果需要保留,可以放在 cookie 中。

DNS 解析过程

  1. 客户端打开浏览器,输入一个域名。比如输入 www.163.com,这时,客户端会发出一个 DNS 请求到本地 DNS 服务器。本地 DNS 服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。

  2. 查询 www.163.com 的 DNS 请求到达本地 DNS 服务器之后,本地 DNS 服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地 DNS 服务器还要向 DNS 根服务器进行查询。

  3. 根 DNS 服务器没有记录具体的域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。

  4. 本地 DNS 服务器继续向域服务器发出请求,在这个例子中,请求的对象是 .com 域服务器。.com 域服务器收到请求之后,也不会直接返回域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,你的域名的解析服务器的地址。

  5. 最后,本地 DNS 服务器向域名的解析服务器发出请求,这时就能收到一个域名和 IP 地址对应关系,本地 DNS 服务器不仅要把 IP 地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。