J_Knight_ iOS 高级面试题 网络题解答

1,007 阅读10分钟
网络题

App 网络层有哪些优化策略?
TCP为什么要三次握手,四次挥手?
对称加密和非对称加密的区别?分别有哪些算法的实现?
HTTPS的握手流程?为什么密钥的传递需要使用非对称加密?双向认证了解么?
HTTPS是如何实现验证身份和验证完整性的?
如何用Charles抓HTTPS的包?其中原理和流程是什么?
什么是中间人攻击?如何避免?

App 网络层有哪些优化策略?

首先我们了解一下服务器发送一个请求的过程

* 1.DNS Lookup
2.TCP Handshake
3.TLS或SSL Handshake
4.TCP/HTTP Request/Response

网络优化

1.优化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。

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

根据用户是在2G/3G/4G/Wi-Fi的网络环境来设置不同的超时参数,以及网络服务的并发数量。比如在环境比较差的情况下:
1.将并发数设置为一个改成串行
2.动态设置超时时间
3.throttle 进行节流
AFNetworking中的throttle方法
1- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes                                   delay:(NSTimeInterval)delay;

3.管道化连接

如果服务器不支持管线化的话,那么响应就会乱序。所以服务器要支持。 AFNetworking中通过HTTPShouldUsePipelining属性来设置,默认为NO。
减少数据传输量
选择合适的数据格式进行传输,比如使用Protocol Buffer数等,使用WebP图片格式
提供网络服务重发机制
当第一次网络请求失败的时候,自动尝试再次重发
使用HTTP缓存

4.针对链接建立环节的优化
使用缓存手段减少请求的发起次数
使用策略来减少请求的发起次数

更多优化请看下面这个内容

[百度App网络深度优化系列《二》连接优化](http://baijiahao.baidu.com/s?id=1625511944699576834)

[百度App网络深度优化系列《一》DNS优化](http://baijiahao.baidu.com/s?id=1621552582705610161)
1.https://chromium.googlesource.com/chromium/src/+/HEAD/docs/android_build_instructions.md
2.https://chromium.googlesource.com/chromium/src/+/HEAD/docs/ios/build_instructions.md
3.https://github.com/Tencent/mars
4.https://tools.ietf.org/html/rfc7858
5.https://tools.ietf.org/html/rfc6555
6.https://tools.ietf.org/html/rfc8305

TCP为什么要三次握手,四次挥手?

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
 
 SYN表示建立连接,
 
 FIN表示关闭连接,
 
 ACK表示响应

1, 第一次:首先A发送一个(SYN)到B,意思是A要和B建立连接进行通信;

如果是只有一次握手的话,这样肯定是不行的,A压根都不知道B是不是收到了这个请求。 

2, 第二次:B收到A要建立连接的请求之后,发送一个确认(SYN+ACK)给A,意思是收到A的消息了,B这里也是通的,表示可以建立连接;
如果只有两次通信的话,这时候B不确定A是否收到了确认消息,有可能这个确认消息由于某些原因丢了。 

3, 第三次:A如果收到了B的确认消息之后,再发出一个确认(ACK)消息,意思是告诉B,这边是通的,然后A和B就可以建立连接相互通信了;
一定要进行三次握手么,不能只进行两次或者四次??

其实这个问题的本质是因特网中信道不可靠, 但是要在这个不可靠的信道上可靠地传输数据,三次握手是最小的理论值。

  如果只进行两次握手,那么当客户端发送一个SYN分组后,会发生两种情况:
  情况一:服务器接收到了这个SYN并返回ACK,无论客户端是否接收到了ACK,服务器都认为已经与客户端建立连接了,于是就开始向客户端发送数据。但是如果客户段没有收到ACK,那么客户端会认为与服务器没有建立连接,就不会接收服务器发来的数据,也就是说直接丢弃服务器发来的数据,服务器发出的消息超时了,就重复发送数据,这就产生了死锁。
  情况二:客户端发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达服务器。本来这是一个早已失效的报文段。但服务器收到此失效的连接请求报文段后,就误认为是客户端再次发出的一个新的连接请求。于是就向客户端发送ACK,但是此时客户端没有发出请求,所以并不会理睬这个ACK,而服务器又开始发数据给客户端了,这时候,客户端又把这些数据都丢弃了,而服务器发出的消息超时了,就重复发送数据,也产生了死锁。


TCP四次挥手
第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;

第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

问题1:为什么要四次分手?

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

对称加密和非对称加密的区别?分别有哪些算法的实现?

什么是对称加密技术?
对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密
也就是密钥也可以用作解密密钥,这种方法在密码学中叫做对称加密算法,对称加密算法使用起来简单快捷,密钥较短,且破译困难,除了数据加密标准(DES),另一个对称密钥加密系统是国际数据加密算法(IDEA),它比DES的加密性好,而且对计算机功能要求也没有那么高
对称加密算法在电子商务交易过程中存在几个问题:
  1、要求提供一条安全的渠道使通讯双方在首次通讯时协商一个共同的密钥。直接的面对面协商可能是不现实而且难于实施的,所以双方可能需要借助于邮件和电话等其它相对不够安全的手段来进行协商;
  2、密钥的数目难于管理。因为对于每一个合作者都需要使用不同的密钥,很难适应开放社会中大量的信息交流;
  3、对称加密算法一般不能提供信息完整性的鉴别。它无法验证发送者和接受者的身份;
  4、对称密钥的管理和分发工作是一件具有潜在危险的和烦琐的过程。对称加密是基于共同保守秘密来实现的,采用对称加密技术的贸易双方必须保证采用的是相同的密钥,保证彼此密钥的交换是安全可靠的,同时还要设定防止密钥泄密和更改密钥的程序。
  假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。
常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES 

什么是非对称加密技术?
与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。
公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。
 非对称加密的典型应用是数字签名。
   常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
Hash算法(摘要算法)
Hash算法特别的地方在于它是一种单向算法,用户可以通过hash算法对目标信息生成一段特定长度的唯一hash值,却不能通过这个hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。
常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA

HTTPS的握手流程?为什么密钥的传递需要使用非对称加密 HTTPS是如何实现验证身份和验证完整性的?

https://blog.csdn.net/clh604/article/details/22179907 。 
https原理:证书传递、验证和数据加密、解密过程解析

https://blog.csdn.net/zhongzh86/article/details/69389967   深度解析HTTPS原理

http://liuduo.me/2018/05/14/https-detail/   HTTPS 原理详解

https://yq.aliyun.com/articles/625289 HTTPS原理和CA证书申请(满满的干货

如何用Charles抓HTTPS的包?其中原理和流程是什么?

https://www.jianshu.com/p/870451cb4eb0

什么是中间人攻击?如何避免?

https://www.jianshu.com/p/210c296eb836
https://www.zhihu.com/question/20744215
https://www.cnblogs.com/LittleHann/p/3735602.html
http://netsecurity.51cto.com/art/201712/559836.htm