HTTP工作流程
- 建立连接
- 首先由客户端发送SYN同步报文给服务端
- 服务端收到后发给客户端一个回复报文SYN,ACK
- 客户端收到回复报文后再给服务端回复一个ACK报文
都是TCP层报文段 TCP连接建立的过程
1 2 3为TCP三次握手 - 点击登录按钮 客户端会发送一个HTTP请求报文
- 服务端处理后发送HTTP响应报文
HTTP应用层
- 连接断开
由客户端发起
- 客户端发送FIN终止报文
- 服务端收到后发送ACK确认报文
客户端到服务端连接已断开 - 服务端一段时间后发送FIN,ACK终止报文
- 客户端收到后发送ACK确认报文
TCP层报文 TCP四次挥手
服务端到客户端TCP连接关闭
HTTP报文格式
-
请求报文
请求行 方法(get/post)请求地址URL HTTP版本 CRLF回车换行
首部行 由多个key:value键值对组成
首部字段名:值 CRLF
:
:
首部字段名:值 CRLF
实体主体(通常不用) -
响应报文
状态行 HTTP版本 状态码 状态码短语描述 换行
首部行 同请求报文
实体主体(经常用到 post 有些响应报文不用 get) get post请求会把响应结果以实体主体方式返回给客户端
HTTPS
- 全称 Hyper Text Transfer Protocol over Secure Socket Layer
- HTTPS是以安全为目标的HTTP通道 是HTTP安全版
- HTTP和HTTPS异同
- HTTPS需要到CA申请证书,一般免费证书很少,需要交费
- HTTP是明文传输 HTTPS是具有安全性的SSL加密传输(HTTP是对请求包、响应数据进行简单加密 HTTPS的请求和响应内容看到的是乱码)
- HTTP和HTTPS使用端口不同 HTTP 80 HTTPS443
- HTTPS可进行加密传输、身份认证,比HTTP更安全
安全套接字层SSL&安全传输层TLS
SSL:Secure Sockets Layer 安全套接层
TLS:Transport Layer Security 传输层安全 SSL继任者
TLS与SSL再传输层上对网络连接进行加密,为网络通信提供安全及数据完整性
SSL协议
为了解决以下风险而设计产生
- 所有信息都是加密传播,第三方无法窃听
- 具有校验机制,一旦被篡改,通信双方会立刻发现
- 配备身份证书,防止身份被冒充
HTTP层次:
HTTP |
---|
TCP |
IP |
HTTPS层次
HTTPS | 发送方 | 接收方 |
---|---|---|
HTTP | 发送一个HTTPS网络请求 把请求数据包装成HTTP请求报文 | |
TLS&SSL | 把HTTP请求报文进行加密 | 解密数据 拼装成HTTP报文 |
TCP | 传输 | 传输 |
IP | 传输 | 接收 |
- SSL协议建立过程
- 客户端发送握手信息给服务端(随机数1,客户端支持的加密算法)
- 服务端传递响应报文 响应握手信息(随机数2,匹配好的协商加密算法 是客户端传递给服务端加密算法的子集)
- 服务端传递响应报文(服务端证书)
- 客户端验证证书( 判断是否篡改:验证证书数字摘要 和 服务证书解密之后的内容是否一致;判断证书链 逐级向上查找 直到查找到根证书)
- 客户端组装会话密钥 ( 随机数1 随机数2 预主密钥)并用服务端传输的证书所包含的公钥加密预主密钥,传递加密过的预主密钥给服务端
- 服务端用私钥解密预主密钥,服务端也获得了随机数1 随机数2 和预主密钥
- 服务端组装会话密钥(和客户端一样)
- 客户端使用组装后的会话密钥加密握手消息,验证服务端能否正常接收加密过的数据消息
- 服务端发送加密过的握手消息,验证客户端是否能正常解析加密过的数据
5.6非对称加密 安全(连接建立时使用) 89 对称加密 高效(后续网络请求)
- 预主密钥:由客户端产生,传递给服务端
- 随机数1 随机数2(多个随机数 保证密钥的随机性)
- 公钥私钥 加密解密密钥相同为对称加密算法(AES、DES)
不同对非对称加密算法(RSA)
HTTPS实现
NSURLConnection类协议
NSURLSession类协议
网络请求相关API简单使用
会话获取
+(NSURLSession*)sessionWithConfiguration:(NSURLSessionConfiguration*)configuration;
任务创建
-(NSURLSessionDataTask*)dataTaskWithRequest:(NSURLRequest*)request completionHandler:(void(^)(NSData*_Nullable data,NSURLReponse*_Nullable reponse,NSError*_Nullable error))completionHandler;