iOS网络请求性能监控
NSURLSessionTaskMetrics/NSURLSessionTaskTransactionMetrics
Apple 在 iOS 10 的 NSURLSessionTaskDelegate 代理中新增了 -URLSession: task:didFinishCollectingMetrics: 方法,如果实现这个代理方法,就可以通过该回调的 NSURLSessionTaskMetrics 类型参数获取到采集的网络指标,实现对网络请求中 DNS 查询/TCP 建立连接/TLS 握手/请求响应等各环节时间的统计
NSURLSessionTaskMetrics
NSURLSessionTaskMetrics 对象封装了 session task 的指标,每个NSURLSessionTaskMetrics 对象有 taskInterval 和 redirectCount 属性,还有在执行任务时产生的每个请求/响应事务中收集的指标
transactionMetricstransactionMetrics:transactionMetrics 数组包含了在执行任务时产生的每个请求/响应事务中收集的指标
taskIntervaltaskInterval:任务从创建到完成花费的总时间,任务的创建时间是任务被实例化时的时间;任务完成时间是任务的内部状态将要变为完成的时间
redirectCountredirectCount:记录了被重定向的次数。
NSURLSessionTaskTransactionMetrics
NSURLSessionTaskTransactionMetrics 对象封装了任务执行时收集的性能指标,包括了 request 和 response 属性,对应 HTTP 的请求和响应,还包括了从 fetchStartDate 开始,到 responseEndDate 结束之间的指标,当然还有 networkProtocolName 和 resourceFetchType 属性
requestrequest:表示了网络请求对象
responseresponse:表示了网络响应对象,如果网络出错或没有响应时,response 为 nil。
networkProtocolNamenetworkProtocolName:获取资源时使用的网络协议,由 ALPN 协商后标识的协议,比如 h2, http/1.1, spdy/3.1
isProxyConnectionisProxyConnection:是否使用代理进行网络连接
isReusedConnectionisReusedConnection:是否复用已有连接。
resourceFetchTyperesourceFetchType:NSURLSessionTaskMetricsResourceFetchType 枚举类型,标识资源是通过网络加载,服务器推送还是本地缓存获取的
对于下面所有 NSDate 类型指标,如果任务没有完成所有相应的endDate 指标都将为nil
例如,如果 DNS 解析超时、失败或者客户端在解析成功之前取消,domainLookupStartDate 会有对应的数据,然而 domainLookupEndDate 以及在它之后的所有指标都为 ni
date下面这幅图示意了一次HTTP请求在各环节分别做了哪些工作
http work如果是复用已有的连接或者从本地缓存中获取资源,下面的指标都会被赋值为 nil:
* domainLookupStartDate
* domainLookupEndDate
* connectStartDate
* connectEndDate
* secureConnectionStartDate
* secureConnectionEndDate
* fetchStartDate:客户端开始请求的时间,无论资源是从服务器还是本地缓存中获取。
* domainLookupStartDate:DNS 解析开始时间,Domain -> IP 地址。
* domainLookupEndDate:DNS 解析完成时间,客户端已经获取到域名对应的 IP 地址
* connectStartDate:客户端与服务器开始建立 TCP 连接的时间。
* secureConnectionStartDate:HTTPS 的 TLS 握手开始时间
* secureConnectionEndDate:HTTPS 的 TLS 握手结束时间
* connectEndDate:客户端与服务器建立 TCP 连接完成时间,包括 TLS 握手时间
* requestStartDate:开始传输 HTTP 请求的 header 第一个字节的时间
* requestEndDate:HTTP 请求最后一个字节传输完成的时间
* responseStartDate:客户端从服务器接收到响应的第一个字节的时间
* responseEndDate:客户端从服务器接收到最后一个字节的时间
iOS网络监控方式有NSURLProtocol和代码注入(Hook),可通过NSURLProtocol实现监控的具体实现,然后分别在iOS中使用Method Swizzling、NSProxy、和fishhook进行AOP Hook。
iOS10之后新引入了NSURLSessionTaskMetrics和NSURLSessionTaskTransactionMetrics类,可以用来获取网络相关的元数据,
比如: DNS 查询、TLS 握手、请求响应等环节的耗时,这些数据可以帮助开发人员更好地分析网络性能