NSURLSession之使用Keep-Alive长连接
HTTP Keep-Alive
HTTP
的Keep-Alive
,是HTTP 1.1
默认的功能(HTTP 1.0
可以在请求头中设置Keep-Alive
来显式开启),其表示持久连接,以前我们所使用的HTTP
请求,当发出请求并接收完响应后,将关闭TCP
连接,所以,如果我们短时间内进行大量的HTTP
请求的话,会导致过多的TCP
连接建立、关闭消耗.
HTTP Keep-Alive vs TCP KeepAlive
注意,我们目前说的都是HTTP
的Keep-Alive
,其实,TCP
也有KeepAlive
的概念,它解决的主要问题是,当连接建立后,如果没有数据传输,或者隔一段时间才发送一次数据时,如何来确定Client
是否在线,连接是否需要保持,TCP
解决方法为,当超过一段时间后,TCP
会自动发送一个数据为空的报文给Client
,如果对方回应了,则连接继续保持,否则,在重试多次无果后将关闭连接。
Pipeline
HTTP 1.1
引入了Pipeline
,其基于Keep-Alive
,既利用一个连接做多次请求,当Client
提交多个请求时,不需要等第一个请求的响应接收完就能发起第二个请求,既实现类似于流水作业的功能。目前主流服务器都支持Keep-Alive
和Pipeline
。
使用NSURLSession开启Keep-Alive、Pipeline
开启
NSURLSession
配置NSURLSessionConfiguration
的HTTPShouldUsePipelining
属性为YES
。开启
NSMutableURLRequest
的HTTPShouldUsePipelining
为YES
。(NSMutableURLRequest
可以继承NSURLSessionConfiguration
的配置,所以如果NSURLSession
配置了,则每个请求就不再需要单独配置可。)确保发出的请求在同一个
NSURLSession
中,因为每一个NSURLSession
使用单独的连接池,所以如果NSURLSession
不同,那么就无法利用Keep-Alive
、Pipeline
了。如果请求开启了认证,则相同的认证才能利用
Keep-Alive
、Pipeline
。
附
使用
SDWebImage
库的类别UIImageView+WebCache
加载图片时,默认使用的共享的NSURLSession
,且开启了HTTPShouldUsePipelining
。使用
AFNetworking
库时,每个AFHTTPSessionManager
都会创建一个单独的NSURLSession
。