学习网络, 首先要了解几个基本概念:
- 客户端(Client):移动应用(iOS、android等应用)
- 服务器(Server):为客户端提供服务、提供数据、提供资源的机器
- 请求(Request):客户端向服务器索取数据的一种行为
- 响应(Response):服务器对客户端的请求做出的反应,一般指返回数据给客户端
URL
URL统一资源定位符, 通过 1 个 URL,能找到互联网上唯一的 1 个资源
- URL格式: 协议头://主机地址/路径
- 协议头: 不同的协议,表示不同的资源查找及传输方式(http:)
- 主机地址: 存放资源主机的 IP 地址(域名)(baidu.com)
- 路径: 资源在主机中的具体位置(qutu.jpg)
HTTP协议
- 规定客户端和服务器之间的数据传输格式
- 让客户端和服务器能有效地进行数据沟通
- HTTP 协议是网络编程使用最为广泛的协议
- 特点:
1> 简单快速
协议简单, 所以 HTTP 服务器的程序规模小,通信速度快
2> 灵活
HTTP 允许传输任意类型的数据
3>短连接 (http 0.9/1.0)
每次连接处理一个请求后断开, 节省传输时间
4> 长连接 (http 1.1)
一个连接传送多个对象
- 通信过程
// 请求
一个完整的由客户端发给服务器的 HTTP 请求 需要包含请求行, 请求头和请求体
// 响应
一个完整的 HTTP 响应包含状态行, 响应头和实体内容
IOS中常见的发送HTTP请求方案
- 苹果官方
NSURLConnection: IOS2.0推出
NSURLSession: IOS7推出, 功能比NSURLConnection更加强大
- 第三方框架
ASIHttpRequest: 基于CFNetwork, HTTP终结者, 停止更新
AFNetworking: 基于NSURLConnection&NSURLSession, 目前最常用
Alarmfire: Swift版本, 轻量级
NSURLConnection
- 步骤
NSURL:确定要访问的资源
NSURLRequest:根据 URL 建立请求,向服务器索要数据
NSURLConnection:建立网络连接,将请求(异步)发送给服务器
- 代码
// 1. `NSURL`:确定要访问的资源
NSURL *url = [NSURL URLWithString:@"http://m.baidu.com"];
// 2. `NSURLRequest`:根据 `URL` 建立请求,向服务器索要数据
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 3. `NSURLConnection`:建立网络连接,将请求(异步)发送给服务器
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"%@", data);
}];
- 超时时长
默认网络时长是 60 s
建议超时时长 15~30 秒之间
SDWebImage 的默认超时时长是 15 秒
AFN 的默认超时时长是 60 秒
NSURLSession
Socket
网络通讯三要素
- IP地址
- 端口号
- 传输协议(TCP传输控制协议/UDP数据报文协议)
// 通过IP找机器, 通过端口找程序, 通过 协议 确定如何传输数据
网络模型
TCP & UDP
- UDP(用户数据报协议)
- 只管发送, 不确认对方是否接收到
- 将数据封装到数据包中, 不需要建立连接
- 因为无需建立连接, 为不可靠协议, 速度快
- 应用场景: 多媒体教室, 网络流媒体
- TCP(传输控制协议)
- 建立连接形成传输数据通道
- 在连接中数据传输的大小无限制
- 通过三次握手完成连接, 是可靠协议安全送达
- 效率低
Socket(套接字层、插座)
Socket就是为网络服务提供的一种机制
通信的两端都是 Socket
网络通信其实就是 Socket 间的通信
数据在两个 Socket 间通过 IO 传输
Socket 是纯C语言的,是跨平台的
长/短连接 & 心跳包
- 短连接
数据请求结束后,立即断开连接
能够及时释放服务器资源
让服务器能够为更多的用户提供服务
- 长连接
一旦连接建立之后,始终保持连接状态
后续只需发送和接收数据即可,数据响应更及时
长连接对服务器资源占用比较大
对交互响应要求快的应用,例如即时通讯,需要使用长连接
- 心跳包
是检测长连接的重要技术手段
可以由服务器发送—>定时向客户端发送小数据,根据回执判断客户端是否在线
也可以由客户端发送—>定时向服务器发送小数据,报告客户端当前在线