isReusedConnection 可以是 true 或 false 对于 HTTP/1.1 和 HTTP/2 协议,因为它依赖于 URLSession 的活动连接。
HTTP/1.1
URLSession 默认创建一个包含 4 个连接到单个域的连接池,并使用它们发送请求,例如:
var requestNum = 0
class Metrics : NSObject, URLSessionDataDelegate {
func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {
for metric in metrics.transactionMetrics {
print("\(requestNum). protocol: \(metric.networkProtocolName!), reused: \(metric.isReusedConnection)")
requestNum += 1
}
}
}
let metrics = Metrics()
let session = URLSession(configuration: URLSessionConfiguration.default, delegate: metrics, delegateQueue: nil)
func makeRequests(_ http: String) {
requestNum = 0
for i in 0...10 {
let request = URLRequest(url: URL(string: "https://\(http).akamai.com/demo/tile-\(i).png")!)
let task = session.dataTask(with: request)
task.resume()
}
}
makeRequests("http1")
Outputs:
0. protocol: http/1.1, reused: false
1. protocol: http/1.1, reused: true
2. protocol: http/1.1, reused: true
3. protocol: http/1.1, reused: false
4. protocol: http/1.1, reused: false
5. protocol: http/1.1, reused: false
6. protocol: http/1.1, reused: true
7. protocol: http/1.1, reused: true
8. protocol: http/1.1, reused: true
9. protocol: http/1.1, reused: true
10. protocol: http/1.1, reused: true
如您所见,为会话创建了 4 个新连接(重用:false),所有下一个请求稍后重用它们。
HTTP/2
URLSession 与 HTTP/1.1 的工作方式相同,但创建到域的单个连接并通过它发送所有请求,例如:
makeRequests("http2")
Output:
0. protocol: h2, reused: false
1. protocol: h2, reused: true
2. protocol: h2, reused: true
3. protocol: h2, reused: true
4. protocol: h2, reused: true
5. protocol: h2, reused: true
6. protocol: h2, reused: true
7. protocol: h2, reused: true
8. protocol: h2, reused: true
9. protocol: h2, reused: true
10. protocol: h2, reused: true
只为上面的第一个请求创建新连接,下一个请求稍后再使用它。
连接寿命
URLSession 是为典型的客户端应用程序设计的,不会一直保持与服务器的连接。连接在大约 20 秒后处于活动状态,然后会话将其关闭,因此它每次都会为不频繁的请求创建新连接。