美文网首页
iOS网络层详解和优化

iOS网络层详解和优化

作者: 软件iOS开发 | 来源:发表于2018-03-15 20:36 被阅读380次

    HTTP

    HTTP方法

    HTTP属于应用层。具有以下方法:

    GET 最常见

    HEAD 服务器只返回头部。比如可用于了解资源情况,看看某个对象是否存在,测试资源是否被修改了。

    PUT 向服务器写入文档

    POST 写服务器提交数据,通常是表单

    TRACE 允许客户端在最终将请求发送给服务器时,看看请求变成了什么样。因为有可能被防火墙、代理、网关等修改

    OPTIONS 请求服务器告知其支持的各种功能。比如服务器支持哪些方法;对某些特殊资源支持哪些方法等。

    DELETE 请服务器上传请求URL所指定的资源

    状态码

    100-199 信息性状态码,。

    200-299 成功状态码。200是最常见的

    300-399 重定向。302、304比较常见。比如判断服务器图片是否修改了使用304

    400-499 客户端错误。 客户端向服务器发送了一些无法处理的东西,比如错误的请求报文,请求一个不存在的URL404

    400-599 服务器内部错误。

    Api请求过程

    当我们向服务器发送一个请求的时候,做了以下事情:

    1.DNS Lookup

    2.TCP Handshake

    3.TLS或SSL Handshake

    4.TCP/HTTP Request/Response

    DNS Lookup

    DNS(Domain Name System)域名解析系统,计算机之间的通信不认识域名,只能认识IP,所以DNS就是网络请求的第一步,通过域名获取IP

    TCP Handshake

    HTTP属于应用层协议,它不关心网络t通信的具体细节,全部交给TCP/IP。TCP(Transmission Control Protocol 传输控制协议)它完成第四层传输层所指定的功能。

    TCP三次握手连接

    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

    第三次握手,主机A发送一次确认是为了防止:如果客户端迟迟没有收到服务器返回的确认报文,这时他会放弃连接,重新启动一条连接请求;但问题是:服务器不知客户端没收到,所以他会收到两个连接请求,白白浪费了一条连接开销。

    SSL握手

    SSL运行在TCP/IP层之上、应用层之下,为应用层提供加密数据通道

    HTTPS比较消耗性能,主要体现在SSL握手消耗的时间。它消耗的时间是TCP握手的时间的3倍甚至更多。

    "握手阶段"的所有通信都是明文的。整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。

    HTTP和HTTPS时间消耗

    HTTP耗时 = TCP握手

    HTTPs耗时 = TCP握手 + SSL握手

    keep-alive

    客户端与服务器保持连接的状态,比如长连接

    1HTTP/1.1 200 OK Connection: Keep-Alive Content-Encoding: gzip Content-Type: text/html; charset=utf-8 Date: Thu, 11 Aug 2016 15:23:13 GMT Keep-Alive: timeout=5, max=1000 Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT Server: Apache

    max:表示服务器还希望为多少个事物保持此连接的活跃状态

    timeout:服务器能够保持多久活跃状态

    网络优化

    优化DNS解析和缓存

    APP内置Server IP列表,该列表可以在App启动服务中下发更新。App启动后的首次网络服务会从Server IP列表中取一个IP地址进行TCP连接,同时DNS解析会并行进行,DNS成功后,会返回最适合用户网络的Server IP,那么这个Server IP会被加入到Server IP列表中被优先使用。

    Server IP列表有权重机制的,DNS解析返回的IP很明显具有最高的权重,每次从Server IP列表中取IP会取权重最高的IP。列表中IP权重也是动态更新的,根据连接或者服务的成功失败来动态调整,这样即使DNS解析失败,用户在使用一段时间后也会选取到适合的Server IP。

    网络质量检测(根据网络质量来改变策略)

    根据用户是在2G/3G/4G/Wi-Fi的网络环境来设置不同的超时参数,以及网络服务的并发数量。比如在环境比较差的情况下:

    1.将并发数设置为一个改成串行

    2.动态设置超时时间

    3.throttle 进行节流

    AFNetworking中的throttle方法

    1- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes                                   delay:(NSTimeInterval)delay;

    4.管道化连接 如果服务器不支持管线化的话,那么响应就会乱序。所以服务器要支持。 AFNetworking中通过HTTPShouldUsePipelining属性来设置,默认为NO。

    减少数据传输量

    选择合适的数据格式进行传输,比如使用Protocol Buffer数等,使用WebP图片格式

    提供网络服务重发机制

    当第一次网络请求失败的时候,自动尝试再次重发

    使用HTTP缓存

    相关文章

      网友评论

          本文标题:iOS网络层详解和优化

          本文链接:https://www.haomeiwen.com/subject/shhkqftx.html