Keep Alive在iOS上无法正常工作

时间:2017-01-05 10:09:07

标签: ios swift xcode alamofire nsurlsession

我目前正在开发一个应用程序,我们需要一些请求尽快点击我们的服务器。为了加快请求过程,我们必须消除握手(因为它需要额外的)并且具有永久连接。

该应用程序正在使用Alamofire框架向我们的服务器发出所有请求,设置如下:

我们设置了一个使用默认配置和http标头的会话管理器。

lazy var sessionManager: Alamofire.SessionManager = {
    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
    let manager = Alamofire.SessionManager(configuration: configuration)
    return manager
}()

会话管理器在所有请求中都是持久的。每个请求都使用以下代码进行:

self.sessionManager.request(request.urlString, method: request.method, parameters: request.parameters)
            .responseJSON { [weak self] response in
    // Handle the response
}

request.urlString是我们服务器的网址" http://ourserver.com/example"

request.method设置为发布

request.parameters是一个参数字典

请求工作正常,我们得到了有效的回复。 问题出现在保持活动计时器上,由我们的服务器设置为300秒。该设备在wifi上连接最多30秒,并且几乎立即通过GSM关闭。

服务器调试

我们在服务器上进行了一些调试,发现了以下结果

试验:

测试1:

  • iPhone通过WiFi连接到互联网

测试2:

  • iPhone通过3G连接到互联网

行为:

  • 两种情况:app通过“Connection:keep-alive”向Web服务器发出HTTP / 1.1请求;服务器(服务器ip = 10.217.81.131)响应“保持活动:超时= 300,最大= 99”
  • 客户端(测试1 - 通过WiFi的应用程序)在第30秒发送TCP FIN并关闭连接
  • 客户端(测试2 - 通过3G的应用程序)在从第一个HTTP POST收到HTTP / 1.1 OK消息后立即(零秒)发送TCP FIN请求

测试1登录服务器端:

  1. 在23.101902,应用程序通过“Connection:keep-alive”向服务器发出HTTP / 1.1 POST请求 enter image description here

  2. 在23.139422,服务器通过“Connection:Keep-Alive”和“timeout = 300”(300秒)响应HTTP / 1.1 200 OK enter image description here

  3. 往返时间(RTT)报告为333.82毫秒(这突出显示了我们对以下时间戳的误差幅度):

  4. enter image description here

    1. 然而,应用程序会在30秒内关闭连接(大约考虑到Internet传输的变化 - 54.200863和23.451979时间戳之间的差异): enter image description here

    2. 测试重复多次,大约一次。始终监控30秒的时间

    3. 在服务器端测试2日志:

      1. 来自应用的HTTP / 1.1 POST请求: enter image description here
      2. 接受保持活动的HTTP OK服务器响应并设置为300秒: enter image description here
      3. RTT为859.849毫秒 enter image description here
      4. 该应用程序立即关闭连接,其中立即是21.197918 - 18.747780 = 2.450138秒

        从WiFi切换到3G并重新进行测试,并记录相同的结果。

        客户端调试

        使用WiFi

        首次尝试(已建立连接)

        Optional(
        [AnyHashable("Content-Type"): text/html,
        
        AnyHashable("Content-Encoding"): gzip, 
        
        AnyHashable("Content-Length"): 36, 
        
        AnyHashable("Set-Cookie"): user_cookieuser_session=HXQuslXgivCRKd%2BJ6bkg5D%2B0pWhCAWkUPedUEGyZQ8%2Fl65UeFcsgebkF4tqZQYzVgp2gWgAQ3DwJA5dbXUCz4%2FnxIhUTVlTShIsUMeeK6Ej8YMlB11DAewHmkp%2Bd3Nr7hJFFQlld%2BD8Q2M46OMRGJ7joOzmvH3tXgQtRqR9gS2K1IpsdGupJ3DZ1AWBP5HwS41yqZraYsBtRrFnpGgK0CH9JrnsHhRmYpD40NmlZQ6DWtDt%2B8p6eg9jF0xE6k0Es4Q%2FNiAx9S9PkhII7CKPuBYfFi1Ijd7ILaCH5TXV3vipz0TmlADktC1OARPTYSwygN2r6bEsX15Un5WUhc2caCeuXnmd6xy8sbjVUDn72KELWzdmDTl6p5fRapHzFEfGEEg2LOEuwybmf2Nt6DHB6o6EA5vfJovh2obpp4HkIeAQ%3D; expires=Sun, 08-Jan-2017 12:51:43 GMT; path=/,
        
        AnyHashable("Keep-Alive"): timeout=300, max=100, 
        
        AnyHashable("Connection"): Keep-Alive, 
        
        AnyHashable("X-Powered-By"): PHP/5.3.10-1ubuntu3.11, 
        
        AnyHashable("Server"): Apache/2.2.22 (Ubuntu), 
        
        AnyHashable("Vary"): Accept-Encoding, 
        
        AnyHashable("Date"): Sun, 08 Jan 2017 10:51:43 GMT])
        

        第二次尝试(在30秒内,连接仍然存在)

        Optional([AnyHashable("Content-Type"): text/html, 
        
        AnyHashable("Content-Encoding"): gzip, 
        
        AnyHashable("Content-Length"): 36, 
        
        AnyHashable("Keep-Alive"): timeout=300, max=99, 
        
        AnyHashable("Connection"): Keep-Alive, 
        
        AnyHashable("X-Powered-By"): PHP/5.3.10-1ubuntu3.11, 
        
        AnyHashable("Server"): Apache/2.2.22 (Ubuntu), 
        
        AnyHashable("Vary"): Accept-Encoding, 
        
        AnyHashable("Date"): Sun, 08 Jan 2017 11:00:18 GMT])
        

        然后在30秒后连接断开(FI)

        使用3G

        首次尝试

        Optional([AnyHashable("Content-Type"): text/html, 
        
        AnyHashable("Content-Encoding"): gzip, 
        
        AnyHashable("Content-Length"): 36, 
        
        AnyHashable("Connection"): keep-alive, 
        
        AnyHashable("X-Powered-By"): PHP/5.3.10-1ubuntu3.11, 
        
        AnyHashable("Server"): Apache/2.2.22 (Ubuntu), 
        
        AnyHashable("Vary"): Accept-Encoding, 
        
        AnyHashable("Date"): Sun, 08 Jan 2017 11:04:31 GMT])
        

        然后连接几乎立即下降。

1 个答案:

答案 0 :(得分:1)

现在我第二次看了代码,我想我看到了问题。基础NSURLSession类默认忽略keep-alive标头,因为某些服务器"支持"它,但在实践中,如果你真的试图使用它,就会严重破坏,IIRC。

如果您希望会话支持keep-alive,则必须在会话配置中将HTTPShouldUsePipelining明确设置为YES

请注意,仍然无法保证连接能够保持正常,这取决于iOS决定如何积极管理收音机,但至少你会有一个祷告。 : - )