iOS八股文之 网络
一、网络协议基础
- TCP/IP 协议栈:需理解分层模型(应用层、传输层、网络层、链路层),以及各层核心协议(应用层:HTTP/HTTPS;传输层:TCP/UDP;网络层:IP/ICMP)。
- TCP 与 UDP 的区别:
- TCP:面向连接(三次握手建立连接)、可靠传输(重传机制、拥塞控制)、字节流、适用于对可靠性要求高的场景(如接口请求、文件下载)。
- UDP:无连接、不可靠(不保证送达,无重传)、数据报、适用于实时性要求高的场景(如音视频通话、直播)。
- HTTP 协议:
- 特点:无状态(每次请求独立,依赖 Cookie/Session 维持状态)、基于 TCP 的应用层协议。
- 请求方法:GET(获取资源,参数在 URL,长度有限)、POST(提交资源,参数在 Body,更安全)、PUT(更新资源)、DELETE(删除资源)等。
- 状态码:2xx(成功,如 200)、3xx(重定向,如 304 缓存有效)、4xx(客户端错误,如 404 资源不存在)、5xx(服务器错误,如 500)。
- HTTPS 协议:
- 本质:HTTP + TLS/SSL 加密,解决 HTTP 明文传输的安全问题(窃听、篡改、伪造)。
- TLS 握手流程:客户端请求 → 服务器返回证书 → 客户端验证证书 → 生成对称密钥(非对称加密传递) → 后续通信用对称密钥加密。
- 证书作用:确保服务器身份合法(避免中间人攻击),由 CA 机构颁发。
- HTTP/2 与 HTTP/3 新特性
- HTTP/2:
多路复用(同一连接并发处理多个请求,避免 TCP 连接建立开销);
头部压缩(HPACK 算法,减少请求头大小);
服务器推送(主动推送关联资源,如 HTML 引用的 CSS/JS)。 - HTTP/3:
基于 QUIC 协议(UDP 之上的可靠传输,解决 TCP 队头阻塞问题);
更快的连接建立(0-RTT 或 1-RTT 握手),适用于移动端弱网环境。
- HTTP/2:
二、iOS 网络框架
具体的网络库实现既可以依赖苹果原生NSURLSession,也可以使用优秀的三方库如AFNetworking,Alamofire等;
- NSURLSession(系统框架,iOS 7+):
- 替代旧的 NSURLConnection,支持异步请求、后台下载、会话管理。
- 核心类:NSURLSession(会话,配置请求参数)、NSURLSessionTask(任务基类,分 NSURLSessionDataTask(数据请求)、NSURLSessionDownloadTask(下载)、NSURLSessionUploadTask(上传))。
- 优势:支持暂停 / 继续任务、后台会话(App 退到后台仍能完成下载)、配置超时时间 / 缓存策略等。
- AFNetworking(主流第三方框架,基于 NSURLSession 封装):
- 核心模块:AFHTTPSessionManager(管理请求)、AFHTTPRequestSerializer(请求序列化,处理参数编码)、AFHTTPResponseSerializer(响应序列化,解析 JSON/XML)、AFNetworkReachabilityManager(网络状态监测)。
- 重点:如何设置请求头、如何自定义证书校验、如何处理 HTTPS 证书 pinning。
- Alamofire(Swift 主流框架,基于 NSURLSession):
- 特点:链式语法、类型安全、支持 Combine 响应式编程,需掌握基本用法(如 AF.request(…))和拦截器(RequestInterceptor)的使用。
三、网络缓存机制
- HTTP 缓存(协议层缓存,分为强缓存和协商缓存):
- 强缓存:客户端直接从本地缓存读取,不请求服务器,依赖响应头 Cache-Control(如 max-age=3600,缓存 1 小时)或 Expires(绝对时间)。
- 协商缓存:客户端发送请求到服务器,服务器判断缓存是否有效,有效则返回 304(用本地缓存),无效则返回 200 和新数据,依赖 Last-Modified/If-Modified-Since(基于修改时间)或 ETag/If-None-Match(基于内容哈希)。
- iOS 本地缓存:
- NSURLCache:系统提供的缓存机制,可配置内存缓存和磁盘缓存大小,NSURLSession 默认使用。
- 自定义缓存:如用 NSUserDefaults、数据库(FMDB/Realm)存储接口数据,需手动管理缓存时效。
四、高级网络场景
- 断点续传:
原理:通过 HTTP 头 Range: bytes=start- 告知服务器从指定位置开始传输,客户端将下载的分片数据拼接成完整文件。
实现:下载时记录已下载字节数,暂停后下次请求携带 Range 头,需处理文件读写(避免重复下载)。 - WebSocket:
特点:全双工通信(客户端和服务器可双向实时发送数据)、基于 TCP 的长连接,适用于即时通讯、实时数据更新(如股票行情)。
iOS 实现:NSURLSessionWebSocketTask(系统)或第三方库(如 SocketRocket)。 - 网络状态监测:
原理:通过监听系统网络状态通知(如 kReachabilityChangedNotification)或使用 AFNetworkReachabilityManager 监测网络类型(WiFi / 蜂窝网络 / 无网络)。
五、网络安全
- HTTPS 证书校验:
默认校验:系统会验证服务器证书的合法性(是否由信任的 CA 颁发、是否过期、域名是否匹配),校验失败则请求失败。
证书 Pinning(证书锁定):客户端内置服务器证书,请求时直接比对内置证书与服务器返回证书,防止中间人攻击(即使证书被伪造也能识别)。 - 数据加密:
传输加密:HTTPS 已解决,敏感参数(如密码)可额外用 RSA/AES 加密后再传输。 - 防抓包:检测是否有代理(如 NSURLSessionConfiguration.connectionProxyDictionary),对敏感接口禁用代理。
六、开发实践中的一些点
- 子线程执行的一些网络耗时操作如下载数据等结束后,一定要返回主线程执行UI更新;
- 大文件分片上传:将文件分成小块(如 5MB / 片),分多次上传,支持断点续传(某片失败仅重传该片);
避免一次性读取整个文件到内存(用流 NSInputStream 分块读取)。 - 避免缓存滥用:敏感数据(如用户余额)禁止缓存,防止本地数据泄露或展示旧数据。
- HTTPS 请求失败,可能原因:
证书域名与请求域名不匹配;
证书过期或不被系统信任(如自签名证书);证书校验失败:实现 AFSecurityPolicy 自定义校验逻辑(如证书 Pinning);客户端未配置 ATS(App Transport Security),iOS 10+ 默认禁止 HTTP 请求,HTTPS 若不符合 TLS 1.2+ 也会被拦截。在 Info.plist 中配置 NSExceptionDomains 允许指定域名的不安全 HTTP/HTTPS; - 拦截器(如 Alamofire 的 RequestInterceptor)可实现全局重试、Token 过期自动刷新等逻辑,避免在每个请求中重复代码。
- 网络调试工具
- Charles:抓包工具,查看请求 / 响应详情(URL、参数、头信息、Body),支持模拟弱网(Throttling)、断点修改请求 / 响应(调试服务器逻辑);
- Wireshark:底层抓包工具,分析 TCP/UDP 报文(适合排查协议层问题);
- NSURLProtocol:拦截 App 内所有网络请求,可用于 mock 数据(开发环境模拟服务器返回)、统一日志打印。