当前位置: 首页 > news >正文

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 数据(开发环境模拟服务器返回)、统一日志打印。
http://www.dtcms.com/a/498748.html

相关文章:

  • 技术演进中的开发沉思-138java-servlet篇:Servlet 多线程的
  • 快速上手大模型:机器学习3
  • 代替VB6的TWINBASIC ide和开源商业模式分析-VB7
  • 网站图片移动怎么做网页设计图片居右代码
  • 东莞整站优化推广公司找火速用广州seo推广获精准访问量
  • c# .NET core多线程的详细讲解
  • Python机器学习---2.算法:逻辑回归
  • solidity的变量学习小结
  • 【Java 开发日记】MySQL 与 Redis 如何保证双写一致性?
  • 基于知识图谱(Neo4j)和大语言模型(LLM)的图检索增强(GraphRAG)的台风灾害知识问答系统(vue+flask+AI算法)
  • 短剧APP开发性能优化专项:首屏加载提速技术拆解
  • 2025年远程控制软件横评:UU远程、ToDesk、向日葵
  • 前端核心理论深度解析:从基础到实践的关键知识点
  • 合肥官方网站建设有哪些公司
  • 大模型-高效优化技术全景解析:微调 量化 剪枝 梯度裁剪与蒸馏 下
  • 微信个人号开发中如何高效实现API二次开发
  • 网页设计与网站建设实战大全wordpress文章页实现图片幻灯展现
  • Ubuntu22.04 VMware虚拟机文件拖放问题:文字复制正常但文件拖放失效
  • Vue Router 路由守卫钩子详解
  • 开源 Linux 服务器与中间件(三)服务器--Nginx
  • Java 大视界 -- Java 大数据在智能农业无人机植保作业路径规划与药效评估中的应用
  • 【OpenGL】模板测试(StencilTest)
  • 文本描述驱动的可视化工具在IDE中的应用与实践
  • C#程序实现将MySQL的存储过程转换成Oracle的存储过程
  • IDEA 中 Tomcat 部署 Java Web 项目
  • 全景网站模版校园微网站建设方案ppt模板
  • 东莞公司网站建设公司哪家好制作网站链接
  • 【Linux】Socket编程UDP
  • “桌面自动化”解救“浏览器自动化”受阻(反爬虫检测)(pywinauto、pyautogui、playwright)
  • 线程安全集合源码速读:Hashtable、Vector、Collections.synchronizedMap