###NSURLSession
为什么聊NSURLSession,因为公司内部分享会上,有同事分享了AFNetworking,不可避免的谈到的2.0-3.0的变动,请求类方式从NSURLConnection到NSURLsession,那谈到了为什么有这个变动?有哪些变动?怎么使用NSURLsession? 在谈第一个为什么有这个变动时大家出现了分歧:1.session在使用的时候,可以重用上一次tcp握手链接 2.session和cookies联系,session单利的好处
####HTTP版本
谈以上话题之前,先来看一下HTTP版本相关的几点知识:
这里我把HTTP版本简单分为三类:1.1之前,1.1,2.0,针对这三类做个主要差异的介绍:
> HTTP 1.1之前
- 不支持持久连接。一旦服务器对客户端发出响应就立即断开TCP连接
- 无请求头跟响应头
- 客户端的前后请求是同步的。下一个请求必须等上一个请求从服务端拿到响应后才能发出,有点类似多线程的同步机制。
> HTTP 1.1(主流版本)
与1.1之前的版本相比,做了以下性能上的提升
- 增加请求头跟响应头
- 支持持久连接。客户端通过请求头中指定**Connection**为**keep-alive**告知服务端不要在完成响应后立即释放连接。HTTP是基于TCP的,在HTTP 1.1中一次TCP连接可以处理多次HTTP请求(keep-alive 有效时间内)
- 客户端不同请求之间是异步的。下一个请求不必等到上一个请求回来后再发出,而可以连续发出请求,有点类似多线程的异步处理。
> HTTP 2.0 (趋势)
- HTTP/2采用二进制格式而非文本格式
- HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个连接即可实现并行
- 使用报头压缩,HTTP/2降低了开销
- HTTP/2让服务器可以将响应主动“推送”到客户端缓存中
- 2.0将只用于https网址。
我们重点关注一下当前1.1版本所做几点改变。支持持久连接有什么好处呢?HTTP是基于TCP连接的,如果连接被频繁地启动然后断开就会花费很多资源在TCP三次握手以及四次挥手上,效率低下。以请求一个网页为例,我们知道,一个html网页上的图片资源并不是直接嵌入在网页上,而只是提供url,图片仍需要额外发HTTP 请求去下载。一个网页从请求到最终加载到本地往往需要经过多个HTTP请求。在1.1版本之前请求一个网页就需要发生多次"握手-挥手"的过程,每次连接之间相互独立;而1.1及之后的版本最少只需要一次就够。
再来就是请求异步,其好处参考多线程异步处理,在此不展开。
http1.0 请求实际步骤如下图:
![图1 session设置了每个host最大的请求线程数为1](/Users/weskhen/Desktop/屏幕快照 2018-06-27 上午8.24.39.png)
![图2 session设置了每个host最大的请求线程数为2](/Users/weskhen/Desktop/屏幕快照 2018-06-30 下午5.13.30.png)
我们可以看到:
1、多次请求其实只建立了1次TCP连接
2、多次请求连续可以异步发出。
so,能重用上一次tcp握手链接的是因为http协议更新到http1.1后.同一个session可以在keep-alive有效时间内不断开链接.
####NSURLSessionConfiguration(NSURLSession中重要的属性)
有三个方法来创建NSURLSessionConfiguration:
defaultSessionConfiguration 使用全局的cache,cookie,使用硬盘来缓存数据。
ephemeralSessionConfiguration 临时session配置,与默认配置相比,这个配置不会将缓存、cookie等存在本地,只会存在内存里,所以当程序退出时,所有的数据都会消失,浏览器无痕模式
backgroundSessionConfiguration 后台session配置,需要设置唯一标识,与默认配置类似,不同的是会在后台开启另一个线程来处理网络数据,app杀进程session会断开,重新启动后,session会重新建立.
/* 是否使用蜂窝网络,默认是yes. */
@property BOOL allowsCellularAccess;
/*
指定了一组默认的可以设置出站请求的数据头。这对于跨会话共享信息,如内容类型,语言,用户代理,身份认证,是很有用的。
例如:
@{@"Accept": @"application/json",
@"Accept-Language": @"en",
@"Authorization": authString,
@"User-Agent": userAgentString
}
*/
@property (nullable, copy) NSDictionary *HTTPAdditionalHeaders;
/*
同时连接一个host的最大数。iOS默认是4.APP是作为一个整体来看的
*/
@property NSInteger HTTPMaximumConnectionsPerHost;
为什么聊NSURLSession,因为公司内部分享会上,有同事分享了AFNetworking,不可避免的谈到的2.0-3.0的变动,请求类方式从NSURLConnection到NSURLsession,那谈到了为什么有这个变动?有哪些变动?怎么使用NSURLsession? 在谈第一个为什么有这个变动时大家出现了分歧:1.session在使用的时候,可以重用上一次tcp握手链接 2.session和cookies联系,session单利的好处
####HTTP版本
谈以上话题之前,先来看一下HTTP版本相关的几点知识:
这里我把HTTP版本简单分为三类:1.1之前,1.1,2.0,针对这三类做个主要差异的介绍:
> HTTP 1.1之前
- 不支持持久连接。一旦服务器对客户端发出响应就立即断开TCP连接
- 无请求头跟响应头
- 客户端的前后请求是同步的。下一个请求必须等上一个请求从服务端拿到响应后才能发出,有点类似多线程的同步机制。
> HTTP 1.1(主流版本)
与1.1之前的版本相比,做了以下性能上的提升
- 增加请求头跟响应头
- 支持持久连接。客户端通过请求头中指定**Connection**为**keep-alive**告知服务端不要在完成响应后立即释放连接。HTTP是基于TCP的,在HTTP 1.1中一次TCP连接可以处理多次HTTP请求(keep-alive 有效时间内)
- 客户端不同请求之间是异步的。下一个请求不必等到上一个请求回来后再发出,而可以连续发出请求,有点类似多线程的异步处理。
> HTTP 2.0 (趋势)
- HTTP/2采用二进制格式而非文本格式
- HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个连接即可实现并行
- 使用报头压缩,HTTP/2降低了开销
- HTTP/2让服务器可以将响应主动“推送”到客户端缓存中
- 2.0将只用于https网址。
我们重点关注一下当前1.1版本所做几点改变。支持持久连接有什么好处呢?HTTP是基于TCP连接的,如果连接被频繁地启动然后断开就会花费很多资源在TCP三次握手以及四次挥手上,效率低下。以请求一个网页为例,我们知道,一个html网页上的图片资源并不是直接嵌入在网页上,而只是提供url,图片仍需要额外发HTTP 请求去下载。一个网页从请求到最终加载到本地往往需要经过多个HTTP请求。在1.1版本之前请求一个网页就需要发生多次"握手-挥手"的过程,每次连接之间相互独立;而1.1及之后的版本最少只需要一次就够。
再来就是请求异步,其好处参考多线程异步处理,在此不展开。
http1.0 请求实际步骤如下图:
![图1 session设置了每个host最大的请求线程数为1](/Users/weskhen/Desktop/屏幕快照 2018-06-27 上午8.24.39.png)
![图2 session设置了每个host最大的请求线程数为2](/Users/weskhen/Desktop/屏幕快照 2018-06-30 下午5.13.30.png)
我们可以看到:
1、多次请求其实只建立了1次TCP连接
2、多次请求连续可以异步发出。
so,能重用上一次tcp握手链接的是因为http协议更新到http1.1后.同一个session可以在keep-alive有效时间内不断开链接.
####NSURLSessionConfiguration(NSURLSession中重要的属性)
有三个方法来创建NSURLSessionConfiguration:
defaultSessionConfiguration 使用全局的cache,cookie,使用硬盘来缓存数据。
ephemeralSessionConfiguration 临时session配置,与默认配置相比,这个配置不会将缓存、cookie等存在本地,只会存在内存里,所以当程序退出时,所有的数据都会消失,浏览器无痕模式
backgroundSessionConfiguration 后台session配置,需要设置唯一标识,与默认配置类似,不同的是会在后台开启另一个线程来处理网络数据,app杀进程session会断开,重新启动后,session会重新建立.
/* 是否使用蜂窝网络,默认是yes. */
@property BOOL allowsCellularAccess;
/*
指定了一组默认的可以设置出站请求的数据头。这对于跨会话共享信息,如内容类型,语言,用户代理,身份认证,是很有用的。
例如:
@{@"Accept": @"application/json",
@"Accept-Language": @"en",
@"Authorization": authString,
@"User-Agent": userAgentString
}
*/
@property (nullable, copy) NSDictionary *HTTPAdditionalHeaders;
/*
同时连接一个host的最大数。iOS默认是4.APP是作为一个整体来看的
*/
@property NSInteger HTTPMaximumConnectionsPerHost;