NSURLSession HTTPMaximumConnectionsPerHost 未按预期工作

Dee*_*ora 6 ios nsurlsession nsurlsessionconfiguration nsurlsessiondownloadtask

我正在尝试下载 .m3u8 视频的 .ts 文件。我为每个 .ts url 创建了一个下载任务,并将会话配置 HTTPMaximumConnectionsPerHost 属性设置为 4:

NSURLSessionConfiguration *sessionConfig    = [NSURLSessionConfiguration defaultSessionConfiguration];
  sessionConfig.HTTPMaximumConnectionsPerHost = 4;
_session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]];
Run Code Online (Sandbox Code Playgroud)

预期行为:只能同时下载 4 个 ts,一旦其中任何一个下载完成,下一个下载项目将被放入队列中,以便在任何时候最多有 4 个 ts 正在下载。

实际行为:大约 50 个或更多 ts 正在同时下载,忽略 HTTPMaximumConnectionsPerHost 属性。

Charles 时间线的屏幕截图显示同时发生的多个 .ts 请求。在此输入图像描述

当我尝试使用 NSURLSession 下载图像时,将 HTTPMaximumConnectionsPerHost 指定为 3,我可以看到一次只进行 3 次下载。在此输入图像描述

要下载 m3u8,我还可以使用 AVAssetDownloadURLSession 而不是 NSURLSession,后者一次仅下载 1 个 .ts。在此输入图像描述

我想找出:

1) 为什么 HTTPMaximumConnectionsPerHost 属性对于图像下载可以正常工作,而对于 .ts 下载则不起作用,因为会同时发生超过 4 个 .ts 下载。

2)有没有办法使用AVAssetURLDownloadSession将最大并发.ts下载增加到4,它只下载1.ts

dga*_*ood 3

除非您发现 API 中的错误,否则这可能表明您正在多个会话和/或在您配置的会话之外的某个会话中发送 .ts 请求。会话不知道其他会话中的请求;最大值是每个会话。

  • 经过一番分析,我发现我尝试下载的 m3u8 文件托管在 HTTP/2 服务器上,该服务器只有 1 个连接,并且所有请求都在此连接上复用。因此,httpmaximumconcurrentdownload 与 HTTP/2 的上下文无关,因为该值始终为 1。我仍在尝试找出如何限制 iOS 中 HTTP2 中每个连接的请求数,因为我必须使用的服务器支持每秒只有 150 个请求,如果我尝试下载多个 m3u8 文件,我的请求就会失败。 (2认同)