【问题标题】:NSURLSession and NSURLConnection usage as it relates to sharing a SSL sessionNSURLSession 和 NSURLConnection 的使用,因为它与共享 SSL 会话有关
【发布时间】:2016-03-20 20:36:30
【问题描述】:

我有一些与后端服务器通信的逻辑,它有两个版本,一个 NSURLConnection 和 NSURLSession。后者是因为 NSURLConnection 已被弃用,而且我们想利用后台下载能力。编写这些类是为了支持客户端证书以对客户端进行身份验证。

在我的整个应用程序中,通过几种不同类型的例程调用进行这种通信的类。

我看到的问题是,在使用 NSURLSession 版本时,我看到 SSL (TLSv1) 会话从未被重用,并且存在完整的 [Client Hello, Server Hello, Certificate, Certificate, Client Key Exchange,证书验证等]每个连接。查看“Client Hello”消息,我可以看到消息中从来没有“会话 ID”,所以我认为这就是 SSL 会话从未被重用的原因。

在较旧的 NSURLConnection 版本中,我发现会话经常被重用,并且之前的会话 ID 在“Client Hello”消息中给出。

在这两种方法中,我都创建了一个新的 NSURLConnection 或 NSURLSession 实例。我认为正在发生的事情是 NSURLConnection 可以在整个应用程序中工作,而 NSURLSession 不能。

但是,我不确定应该如何编写 NSURLSession 逻辑,以便在服务器和客户端之间共享 SSL 会话,并且不会每次都发送客户端证书。我认为一种方法可能是使用单个 NSURLSession 实例,但我不确定这是否是正确的设计模式。

【问题讨论】:

    标签: ios session ssl nsurlconnection nsurlsession


    【解决方案1】:

    使用 NSURLSession,连接不会在多个会话之间共享,因为不同的会话可以对最大并发连接数、不同的保活设置、不同的代理设置等有不同的限制。

    因此,如果您在每个会话中只发出一个请求,那么您最终将每次都创建一个新连接,并完成完整的 TLS 设置开销。

    有两种直接的方法可以解决这个问题:

    • 在启动应用时创建一个会话并在任何地方使用它。
    • 使用共享会话 ([NSURLSession sharedSession])。

    如果您正在进行后台下载,则该会话需要在您的应用首次启动时创建一次,然后永远不会重新创建(除非创建该会话是为了响应您的应用在后台重新启动以处理某些任务的结果,在这种情况下 IIRC 会话变得无效,因此如果您的应用随后以通常的方式或其他方式启动,您将重新创建它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 2016-02-22
      • 2010-09-27
      • 2012-05-15
      • 1970-01-01
      相关资源
      最近更新 更多