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 握手),适用于移动端弱网环境。

二、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 数据(开发环境模拟服务器返回)、统一日志打印。
相关推荐
惘嘫、冋渞10 小时前
AWS同一账号下创建自定义VPC并配置不同区域的对等链接
网络·云计算·aws
云知谷11 小时前
【HTML】网络数据是如何渲染成HTML网页页面显示的
开发语言·网络·计算机网络·html
呉師傅16 小时前
关于联想ThinkCentre M950t-N000 M大师电脑恢复预装系统镜像遇到的一点问题
运维·网络·windows·电脑
代码AI弗森16 小时前
无状态的智慧:从 HTTP 到大模型的系统进化论
网络·网络协议·http
彩旗工作室16 小时前
将iOS/macOS应用上架至App Store
macos·ios·应用商店·appstore
酷熊代理17 小时前
安卓手机 IP 切换指南:告别卡顿,轻松换 IP
网络·网络协议·tcp/ip·socks5
不做菜鸟的网工17 小时前
PIM SM +MSDP 组播跨域配置案例
网络协议
月上柳青17 小时前
快速创建无线AP热点
网络·智能路由器
K_i13418 小时前
云原生网络基础:IP、端口与网关实战
网络·ip·接口隔离原则