iOS面试基础知识 (四)

网络相关


做移动开发,除了写UI,大部分的工作就是跟后台做接口联调了,所以网络相关的知识在面试当中是相当重要且必不可少的。


Get与Post区别


笔者在面试中会经常问这个问题,发现有挺多面试者回答得不好。很多人不知道Get与Post网络请求参数放在哪里。

Get请求参数是以kv方式拼在url后面的,虽然http协议对url的长度没有限制,但是浏览器和服务器一般都限制长度;Post请求参数是放在body里面的,对长度没什么限制。


https原理


https与http区别


https是在http的基础上加上ssl形成的协议,http传输数据是明文的,https则是以对称加密的方式传输数据。


https证书校验过程


https采用对称加密传输数据,对称加密需要的密钥由客户端生成,通过非对称加密算法加密传输给后台。具体步骤如下:

1、客户端向服务器发起HTTPS请求,连接到服务器的443端口。

2、服务器有一个用来做非对称加密的密钥对,即公钥和私钥,服务器端保存着私钥,服务器将自己的公钥发送给客户。

3、客户端收到服务器的公钥之后,会对公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么HTTPS传输就无法继续。严格的说,这里应该是验证服务器发送的数字证书的合法性,如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了。

4、客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。

5、服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。

6、后续客户端和服务器基于client key进行对称加密传输数据。


网络参数签名、加密实现方式


除了用https协议传输数据,有些对数据安全要求比较高的App比如金融类App还会对参数进行签名和加密,这样可以防止网络请求参数被篡改以及敏感业务数据泄露


网络参数签名


为了防止网络请求被篡改,一般会对请求参数进行hash,一般会有一个sign字段表示签名。


假定客户端请求参数dic如下:
{
"name":"akon",
"city":"shenzhen",
}


那么如何生成sign字段呢?

一般通用的做法是把字典按照key的字母升序排序然后拼接起来,然后再进行sha256,再md5。


  • 把字典按照key的字母排序拼接生成字符串str = "city=shenzhen&name=akon"。
  • 对str先进行sha256然后再进行md5生成sign。
    值得注意的是,为了增加破解的难度,我们可以在生成的str前面、后面加入一段我们App特有的字符串,然后对str hash可以采用base64、sha256,md5混合来做。


网络参数加密方式


为了效率,我们一般会采用对称加密加密数据,DES,3DES,AES这些方式都可以。既然要用对称加密,那就涉及到对称加密的密钥怎么生成,有如下方式:


  • 最简单的方式,代码写死密钥。密钥可以用base64或者抑或算法进行简单的加密,用的时候再解密,这种方式比裸写密钥更安全。
  • 后台下发密钥。后台可以在登录的时候下发这个密钥,客户端保存这个密钥后续用来做加密。由于客户端要保存这个密钥,所以还是存在泄露的风险。
  • 仿照https证书校验过程,客户端生成对称加密的密钥clientKey,对参数进行加密,然后用非对称加密对clientKey进行加密生成cryptKey传给后台;后台获取到cryptKey解析出clientKey,然后再用clientKey解密出请求参数。这种方式最安全,推荐使用。


AFNetworking实现原理


作为iOS使用最广泛的第三方网络库,AFNetworking基本上是面试必问的。笔者面试都会问,通过AF的一些问题,可以了解面试者是否熟练使用AF,以及是否阅读过AF的源代码。


AF的设计架构图


如果面试者能把AF的分层架构图清晰地画出来,那至少证明面试者有阅读过AF的源码。


AF关于证书校验是哪个类实现的?有哪几种证书校验方式?


AFSecurityPolicy用来做证书校验的。有三种校验方式:


  • AFSSLPinningModeNone 客户端不进行证书校验,完全信任服务端。
  • AFSSLPinningModePublicKey 客户端对证书进行公钥校验。
  • AFSSLPinningModeCertificate 客户端对整个证书进行校验。


AF请求参数编码、响应参数解码分别是哪两个类实现的?支持什么方式编码,解码?


  • AFHTTPRequestSerializer、AFHTTPResponseSerializer分别用来做编码和解码。
  • 编码方式有url query类型、 json、plist方式。
  • 解码支持NSData、json、xml、image类型。


关于AF如果再深入点可以问问具体实现细节,可以通过细节进一步考察面试者的内功。


SDWebImage实现原理


iOS下载图片基本都用SDWebImage,这个库笔者面试基本都会问。


下载流程


一、先去内存缓存找,找到了直接返回UIImage,否则走第二步;

二、去磁盘缓存里面找,找到了直接返回UIImage,否则走第三步;

三、网络下载,下载完成后存入本地磁盘和内存缓存,然后返回UIImage给调用方。


url生成key的算法是什么?


  • 内存缓存key是url
  • 磁盘缓存key是对url进行md5生成的。


清缓存时机


  • 对于内存缓存,在下载图片加载图片到内存时、内存收到警告时候进行清理。
  • 对于磁盘缓存,在App退出、进后台清理。


网络防劫持策略


H5防劫持


黑客可以通过劫持URL,注入JS代码来劫持H5,可以通过黑名单机制来解决这类问题。


DNS防劫持


DNS的过程其实是域名替换成IP的过程,这个过程如果被黑客劫持,黑客可以返回自己的IP给客户端,从而劫持App。可以通过HTTP DNS方案来解决这个问题。


网络优化


网络优化的核心点是减少网络请求次数和数据传输量。策略有很多,列举一些常用的手段:


合并接口


有些接口可以合并就合并,把几个接口合并成一个接口,可以省去每个接口建立连接的时间以及每个请求传输的http请求头和响应头。


采用pb等省流量传输协议


我们可以采用xml、json、pb等格式传输数据。

这三种方式数据量大小和性能pb>json>xml。


webp


采用webp图片可以节省客户端和服务端的带宽。


采用tcp而不是http


http是基于tcp的应用层协议,相比tcp,http多出来一个几百字节的请求头和响应头,并且每次通信都要建立连接,效率比不上tcp。


同运营商、就近接入


可以根据用户手机的运营商返回相应机房的服务器给客户端,比如联通返回联通的服务器;

可以根据用户所处区域返回相应的服务器给客户端,比如深圳返回深圳机房的服务器。

0 个评论

要回复文章请先登录注册