字学镜像计划-iOS网络编程(大纲)

1,079 阅读5分钟

HTTP

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,适用于从服务器传输超文本到本地浏览器的传送协议,
HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件、图片文件、查询结果等)。

在网络7曾协议模型中,HTTTP、TCP、IP分别属于哪一层?
HTTP:应用层
TCP:传输层
IP:网络层

版本特点

  • HTTP/0.9
    • 无状态型

      每个HTTP请求都要经历一次DNS解析,三次握手、传输和四次挥手

    • 不支持请求头

      只支持纯文本内容

    • 只有GET请求
  • HTTP/1.0
    • 持久连接

      一次TCP连接,可服务多个HTTP请求

    • 支持请求/响应头:
    • 增加POST和HEADER请求
  • HTTP/1.1
    • 默认持久连接,管道机制

      一个TCP连接,允许多个请求同时发送,增加了并发性

    • 支持分块传输,断点续传,缓存处理
    • 增加PURT、PATCH、OPTIONS、DELETE请求
  • HTTP/2.0
    • 多路复用

      (二进制分帧)一个连接可以承载任意数量到双向数据流。每个数据流消息由一个或多个帧组成,帧可以乱序发送,然后再根据每个帧首部到流标识符重新组装

    • 服务端推送

      等主动推送数据到客户端,类似长连接效果(长连接,客户端轮询)

    • 头部压缩、随时复位、优先权等

常用头部字段

字段名作用字段名作用
Accept-Encoding内容压缩编码类型if-Modified-Since(Req)在指定时间修改后才成功,否则返回304
Cache-Control缓存机制,no-cache,max age等Last-Modified资源最后修改时间
Connection是否持久连接,Keep-Alive,CloseReferer请求的来源
Content-Length内容长度ETag(Resp)数据标签
User-Agent(Req)用户环境信息:系统,内核,App版本等If-None-Match(Req)数据标签不匹配才成功,否则返回304
Content-TypeBody数据类型Range(Req)、Content-Range(Resp)指定范围数据,断点续传

https

HTTP Secure(超文本传输安全协议),是以安全为目标等HTTP通道,简单讲是HTTP的安全版。在HTTP基础上,增加TLS层(传输安全层),进行证书校验,密钥协商和数据加密。
  • 过程:
    1. 客户端告诉服务端支持的HTTPS版本和支持的加密方式,生成随机数a给到服务端;
    2. 服务端传输一个HTTPS证书和随机数b到客户端;
    3. 客户端校验证书是否合法(经过权威认证的CA);
    4. 如果合法,客户端生成随机数c,使用服务端下发的证书进行公钥加密给到服务端;
    5. 根据约定的算法组成对称加密的密钥key,接下来的传输过程通过abc组成的密钥进行加密 a、b是明文,c是加密的,只有服务端和客户端能拿到c。公钥加密后只有服务端有私钥;

抓包

Charles简介

  1. 支持截取HTTP和HTTPS网络数据
    • Charles默认支持截取HTTP数据,HTTPS需要额外配置
    • 开启SSL代理 -> 把根证书安装到电脑和模拟器 -> 开启Mac代理就可以拦截电脑和模拟器的HTTPS请求,如果没有业务层加密的话可以明文抓到
  2. 支持移动端抓包
    • 真机抓包
    • 配置代理 -> 在真机中安装根证书 ->信任证书 -> 根据指引将手机连接代理
  3. 支持修改网络请求和响应参数
  4. 支持本地数据模拟服务端回包
  5. 支持模拟弱网络

数据格式

JSON简介

  1. JavaScript对象表示法(JavaScript Object Notation)
  2. 轻量级的文本数据交换格式
  3. 独立于语言:JSON使用Javascript语法来描述数据对象,但是JSON仍然独立于语言和平台。JSON解析器和JSON库支持许多不同的编程语言
  4. 具有自我描述行,更易理解
{
	"Person": [
    { "name":"Jack" , "Age":18 },
    { "name":"Mike" , "Age":22 },
    { "name":"Jhon" , "Age":28 }
    ]
}

在网络传输过程中一般是用GZip压缩算法,压缩率在50%到80%之间

JSON常用转换

//Dictionary to JSON
NSDictionary *dic = @{@"name" : @"HaHa"};
NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

//JSON to Dictionary
jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
error = nil;
dic = [NSJSONSerialization JSONObjectWithData:jsonData
							options:NSJSONReadingAllowFragments
                            error:&error];

PB简介

  1. ProtocolBuffer是一种轻便高效的结构化数据存储格式,可以用于结构化数据的序列化

  2. 比JSON体积更小,解析速度更快

  3. 语义清晰。字段名和类型明确,在编译期间就能保证正确性

    T-L-V数据存储方式(Tag-Length-Value) 以 标识-长度-字段值 表示单个数据,最终将所有数据拼接成一个字节流,从而实现数据存储的功能

String类型的Name字段

  1. 给Name定义一个Tag,比如1
  2. 假设Name的值是testing
  3. 整个字段的表示
TagLengthValue
010774 65 73 74 69 6e 67

PB数据转换

注意格式对准


实用编程

NSURLSession

iOS7之后系统提供的原生网络API, 用于取代NSURLConnection

  • DataTask:数据请求
  • DownloadTask:文件下载,获取下载进度,文件的断点续传
  • UploadTask:文件上传
  • StreamTask:TCP链接(iOS 9+)

Network.framework

用于TLS、TCP、UDP连接, iOS12才支持

  • 具有智能建立连接的功能
  • 经优化的数据传输
  • 安全加密
  • 兼容移动网络等特性

TTNetworkManager

自研网络库

  • 具有AFNetwork和ChromeNet内核,可以动态切换
  • 有细致的timing信息, 可以用来排查网络瓶颈
  • 错误信息明确
  • C++跨平台源码公开, 利于发现具体问题,利于实现自有功能,利于iOS和Android共享代码
  • 支持HTTP DNS
  • 支持HTTP 2.0和QUIC
  • 支持选路和流量控制等新功能 介绍

课后作业

使用NSURLSession和TTNetworkManager实现一个下载器 具有功能:

  1. 有UI界面(样式自由发挥)
  2. 下载进度
  3. 暂停和恢复(可选) 4.断点续传(可选)

测试资源


没有ppt就自己写笔记