七.网络

7.1 指标和测量

输入图片说明

7.1.1 DNS 查找时间

发起连接第一步是DNS查找。如果你的应用严重依赖网络操作,DNS的查找时间会使应用变慢。 查找时间与主DNS服务器的性能成函数关系。最终的连接时间与追踪到目的IP地址的路由成函数关系。 使用内容分发网络(content delivery network,CDN)将延迟最小化是一种常见的做法。

 dig google.com

; <<>> DiG 9.8.3-P1 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33272
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;google.com.			IN	A

;; ANSWER SECTION:
google.com.		230	IN	A	216.58.200.46

;; Query time: 4 msec
;; SERVER: 172.16.17.251#53(172.16.17.251)
;; WHEN: Thu Nov  9 16:36:00 2017
;; MSG SIZE  rcvd: 44

最大限度减少DNS查询时间所产生的延迟最佳实践:

  • 最小化应用使用的专有域名的数量。
  • 在应用启动时不需要连接所有的域名。

7.1.2 SSL 握手时间

HTTPS在连接开始时,先进行SSL握手,SSL握手主要是验证服务器证书,同时共享用于通信的随机秘钥。 输入图片说明

  • 最大程度地减少应用发起的连接数。因此,也需要减少应用连接的独有域名的数量。
  • 请求结束后不要关闭HTTPS连接:为所有的HTTPS请求添加头connection:keep-alive。这确保了同样的连接在下一次请求是可以复用。
  • 使用域分片。如此一来,虽然连接的是不同的主机名,你也可以使用同一个socket,只要他们解析为相同的IP,可以使用相同的证书就行了。域分片在HTTP/2中是可用的。

7.1.3 网络类型

查询网络状态:Reachability:https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html

  • wifi:处于WiFi网络中并不能保证一定连接上了互联网。例如,当设备连接到某一公共热点时,如果用户没有成功的提供适当的凭证,那么将无法访问互联网。即时设备已经连接互联网,也可能有一些限制,比如可连接的域名或端口限制。
  • 4G:LTE,HSPA+(高速的数据网络)。第一个真正的业务数据发送前,一般会有100~600毫秒的延迟。这些网络以亚毫秒的间隔动态地创建无线相关的资源,并且爆发性地发送数据。理论上来说,速度会从100Mbps浮动至1Gbps。对于高速率移动的通信,如在汽车或火车上,速度可能会在100Mbps;对于低速率移动的通信,如行人或静止的用户,速度可能会达到1Gbps。
  • 3G:HSDPA,HSUPA,UMTS,DMA2000A(中等速度的数据网络)。3G的速度可能会从200Kbps变化至超过50Mbps。
  • 2G:EDGE,GPRS(低速率的数据网络).EDGE理论上具有500Kbps的极限速度,而GPRS最高只能达到50Kbps。

根据Reachability查询回调不同的网络类型,调整适当的业务操作。开发以网络为中心的应用时,因遵循以下的最佳实践:

  • 设计时考虑不同的网络可用性。
  • 出现失败时,在随机的,以指数增长的延迟后进行重试。并且设置最多的自动重试次数。
  • 设立强制刷新之间的最短实践。保持与已存在请求之间的最小时间间隔。
  • 检测网络状态的变化。
  • 不要缓存网络状态。
  • 基于网络类型下载内容
  • 预先或分次下载内容。
  • 如果适用,当网络可用时,支持同步的离线存储。

不要为金融,银行,股票交易或其他需要和服务器同步的应用增加离线交易的选项,因为更新的数据可能在离线模式下不可用

7.1.4 延迟

延迟是指从服务器请求资源时,在网络传输上花费的额外时间。 网络延迟可以通过使用请求过程中花费的总时间减去服务器上花费的时间来测量。

//计算网络延迟
-(void)fireRequestWithLatency:(NSURLRequest *)request{
	NSDate *startTime = nil;
	AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
	[session POST:@"servicesRequest" parameters:nil progress:^(NSProgress * _Nonnull uploadProgress) {
		
	} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
		NSDate *endTime = [NSDate date];
		NSTimeInterval roundTrip = [endTime timeIntervalSinceDate:startTime];
		long roundTripMillis = (long)roundTrip * 1000;
		
		NSHTTPURLResponse *res =(NSHTTPURLResponse *) task.response;
		NSString *serverTime = [res.allHeaderFields objectForKey:@"X-Server-Time"];
		long serverTimeMillis = [serverTime longLongValue];
		
		long latencyMillis = roundTripMillis - serverTimeMillis;
		
	} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
		
	}];
	startTime = [NSDate date];
}

此代码包括了服务端线路上刷新数据花费的时间,以及在客户端解析响应花费的时间。如果可以分离出来,将提供真实的网络延迟时间,包括任何设备开销。

需跟踪的数据:

  • 连接超时
  • 响应超时
  • 载荷大小

7.1.5 网络API

NSURLSession优点:

  • NSURLSession对于放入其中的相关请求而言是一个可配置的容器。例如,对服务器的所有请求都可配置成始终包含访问令牌。
  • 可以得到后台联网的所有好处。
  • 任何网络任务都可以暂停,停止并重新启动。
  • 使用NSURLSession,委托会处理身份验证。
  • 可以采取一种混合的方法,可以使用基于块的异步方法,还可以设置委托以处理身份验证。

7.2 应用部署

7.2.1 服务器

服务器应该安装在多个位置,这样可以更好地服务本地内容。

  • 使用多个数据中心,让服务器在地理上分赛开来,更贴近用户。
  • 使用CDN提供静态内容,如图片,JavaScript,CSS,字体等。
  • 使用接近的边缘服务器来提供动态内容。
  • 避免使用多个域名(DNS查询时间可能会很长,这会降低用户体验,与第二条权衡)。

7.2.2 请求

  • 不要为每一个操作单元都进行一次请求,使用批量请求。即使必须实现多个后端子系统来完成,但是合并批量请求会带来较大的性能提升。客户端可以向多个后端发送多路复用的请求,而服务器可以使用多部分/混合回复作为回应。 输入图片说明

  • 使用持续的HTTP连接,该连接也被称为HTTP长连接。有助于最大限度地减少TCP和SSL握手的消耗,同时也减少了网络拥塞。或者使用WebSockets。SocketRocket:https://github.com/facebook/SocketRocket

  • 任何可以的情况下都使用HTTP/2https://http2.github.io.

  • 使用HTTP缓存头设置正确的缓存级别。

7.2.3 数据格式

  • 使用数据压缩。
  • 选择正确的数据格式。对于运输记录而言,最流行的二进制格式是Protocol Buffershttps://baike.baidu.com/item/Protocol%20Buffers/3997436?fr=aladdin,其他协议包括Apache Thrift和Apache Avro。原生应用最常选用的数据格式虽然是JSON和XML,唯一的原因是,web服务/API是为Web编写的,并且用于移动端。

7.3 工具

7.3.1 网络链接调节器

设置->开发者(Developer)-> NetWorking LINK Conditioner

  • 入站通信:带宽,数据包丢失和延迟(响应延迟)。
  • 出站通信:带宽,数据包丢失和延迟。
  • DNS:查找延迟
  • 协议IPv4,IPv6,或两者
  • 界面:wifi,移动,或两者

7.3.3 Charles

  • 监视HTTP请求
  • 监控HTTPS请求:需要配置证书
  • 发送自定义响应:Tools -> Rewrite -> Enable Rewrite - Add

猜你喜欢

转载自my.oschina.net/u/2319073/blog/1572831