NSURLSession之使用Keep-Alive长连接

HTTP Keep-Alive


HTTPKeep-Alive,是HTTP 1.1默认的功能(HTTP 1.0可以在请求头中设置Keep-Alive来显式开启),其表示持久连接,以前我们所使用的HTTP请求,当发出请求并接收完响应后,将关闭TCP连接,所以,如果我们短时间内进行大量的HTTP请求的话,会导致过多的TCP连接建立、关闭消耗.

HTTP Keep-Alive vs TCP KeepAlive


注意,我们目前说的都是HTTPKeep-Alive,其实,TCP也有KeepAlive的概念,它解决的主要问题是,当连接建立后,如果没有数据传输,或者隔一段时间才发送一次数据时,如何来确定Client是否在线,连接是否需要保持,TCP解决方法为,当超过一段时间后,TCP会自动发送一个数据为空的报文给Client,如果对方回应了,则连接继续保持,否则,在重试多次无果后将关闭连接。

Pipeline


HTTP 1.1引入了Pipeline,其基于Keep-Alive,既利用一个连接做多次请求,当Client提交多个请求时,不需要等第一个请求的响应接收完就能发起第二个请求,既实现类似于流水作业的功能。目前主流服务器都支持Keep-AlivePipeline

使用NSURLSession开启Keep-Alive、Pipeline


  • 开启NSURLSession配置NSURLSessionConfigurationHTTPShouldUsePipelining属性为YES

  • 开启NSMutableURLRequestHTTPShouldUsePipeliningYES。(NSMutableURLRequest可以继承NSURLSessionConfiguration的配置,所以如果NSURLSession配置了,则每个请求就不再需要单独配置可。)

  • 确保发出的请求在同一个NSURLSession中,因为每一个NSURLSession使用单独的连接池,所以如果NSURLSession不同,那么就无法利用Keep-AlivePipeline了。

  • 如果请求开启了认证,则相同的认证才能利用Keep-AlivePipeline


  • 使用SDWebImage库的类别UIImageView+WebCache加载图片时,默认使用的共享的NSURLSession,且开启了HTTPShouldUsePipelining

  • 使用AFNetworking库时,每个AFHTTPSessionManager都会创建一个单独的NSURLSession