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,Close | Referer | 请求的来源 |
| Content-Length | 内容长度 | ETag(Resp) | 数据标签 |
| User-Agent(Req) | 用户环境信息:系统,内核,App版本等 | If-None-Match(Req) | 数据标签不匹配才成功,否则返回304 |
| Content-Type | Body数据类型 | Range(Req)、Content-Range(Resp) | 指定范围数据,断点续传 |
https
HTTP Secure(超文本传输安全协议),是以安全为目标等HTTP通道,简单讲是HTTP的安全版。在HTTP基础上,增加TLS层(传输安全层),进行证书校验,密钥协商和数据加密。
- 过程:
- 客户端告诉服务端支持的HTTPS版本和支持的加密方式,生成随机数a给到服务端;
- 服务端传输一个HTTPS证书和随机数b到客户端;
- 客户端校验证书是否合法(经过权威认证的CA);
- 如果合法,客户端生成随机数c,使用服务端下发的证书进行公钥加密给到服务端;
- 根据约定的算法组成对称加密的密钥key,接下来的传输过程通过abc组成的密钥进行加密 a、b是明文,c是加密的,只有服务端和客户端能拿到c。公钥加密后只有服务端有私钥;
抓包
Charles简介
- 支持截取HTTP和HTTPS网络数据
- Charles默认支持截取HTTP数据,HTTPS需要额外配置
- 开启SSL代理 -> 把根证书安装到电脑和模拟器 -> 开启Mac代理就可以拦截电脑和模拟器的HTTPS请求,如果没有业务层加密的话可以明文抓到
- 支持移动端抓包
- 真机抓包
- 配置代理 -> 在真机中安装根证书 ->信任证书 -> 根据指引将手机连接代理
- 支持修改网络请求和响应参数
- 支持本地数据模拟服务端回包
- 支持模拟弱网络
数据格式
JSON简介
- JavaScript对象表示法(JavaScript Object Notation)
- 轻量级的文本数据交换格式
- 独立于语言:JSON使用Javascript语法来描述数据对象,但是JSON仍然独立于语言和平台。JSON解析器和JSON库支持许多不同的编程语言
- 具有自我描述行,更易理解
{
"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简介
-
ProtocolBuffer是一种轻便高效的结构化数据存储格式,可以用于结构化数据的序列化
-
比JSON体积更小,解析速度更快
-
语义清晰。字段名和类型明确,在编译期间就能保证正确性
T-L-V数据存储方式(Tag-Length-Value) 以 标识-长度-字段值 表示单个数据,最终将所有数据拼接成一个字节流,从而实现数据存储的功能
String类型的Name字段
- 给Name定义一个Tag,比如1
- 假设Name的值是testing
- 整个字段的表示
| Tag | Length | Value |
|---|---|---|
| 01 | 07 | 74 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实现一个下载器 具有功能:
- 有UI界面(样式自由发挥)
- 下载进度
- 暂停和恢复(可选) 4.断点续传(可选)
没有ppt就自己写笔记