iOS网络相关面试题,你都学会了吗
前言
不积跬步无以至千里,不积小流无以成江海。学如逆水行舟,不进则退。我是平平无奇游荡于各平台的搬运工。每天学习半小时,健康幸福一辈子。今天给大家讲的网络相关的知识点。不知道各位看官是否都会了呢。废话不多说,直接给大家上干货,希望能对你有所帮助,优秀的人已经点赞了。
一、HTTP 协议
二、HTTP 的请求方式
GET、POST、PUT、DELETE、HEAD、OPTIONS
1、GET 和 POST 方式的区别
从语法角度来看,最直观的区别就是
-
GET 的请求参数一般以?分割拼接到 URL 后面,POST 请求参数在 Body 里面
-
GET 参数长度限制为 2048 个字符,POST 一般是没限制的
-
GET 请求由于参数裸露在 URL 中, 是不安全的,POST 请求则是相对安全
之所以说是相对安全,是因为,如果 POST 虽然参数非明文,但如果被抓包,GET 和 POST 一样都是不
安全的。(HTTPS 该用还是得用)
而从语义的角度来看:
GET:获取资源是 安全的,幂等的(只读的,纯粹的), 可缓存的
POST:获取资源是 非安全的,非幂等的,不可缓存的
- 这里的安全是指不应引起 Server 端的任何状态变化
GET 的语义就是获取数据,是不会引起服务器的状态变化的,即是安全的。(HEAD,OPTIONS 也是安
全的)
而 POST 语义则是提交数据,是可能会引起服务器状态变化的,即是不安全的
- 幂等:同一个请求方法执行多次和执行一次的效果完全相同
显然 GET 请求是幂等而 POST 请求是非幂等的。
这里用幂等形容 GET 还不够,因为 GET 不止是执行多次和执行一次的效果完全相同,而且是执行一次
和执行零次的效果也是完全相同的。
- 可缓存的
请求是否可以被缓存。
GET 请求会主动进行 Cache
以上特性,并非并列,正是因为 GET 是幂等的只读的,即 GET 请求除了返回数据不会有其他副作用,所以
GET 才是安全的,从而可以直接由 CDN 缓存,大大减轻服务器的负担,也就是可缓存的。
而 POST 是非幂等的,即除了返回数据还会有其他副作用,所以 POST 是不安全的,必须交由 web 服务器处
理,即是 不可缓存的
GET和POST本质上就是TCP链接,并无差别。但是由于 HTTP 的规定和浏览器/服务器的限制,导致他们
在应用过程中体现出一些不同。
在响应时,GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包:
对于 GET 方式的请求,浏览器会把 Header 和实体主体一并发送出去,服务器响应 200(返回数据);而对于 POST,浏览器先发送 Header,服务器响应 100 Continue,浏览器再发送实体主体,服务器响应 200 OK
(返回数据)。
2、GET 相对 POST 的优势是什么?
1、最大的优势就是方便。GET 的 URL 可以直接手输,从而 GET 请求中的 URL 可以被存在书签里,或者历
史记录里
2、可以被缓存,大大减轻服务器的负担
所以大多数情况下,还是用 GET 比较好。
三、HTTP 的特点
无连接、 无状态
HTTP 的持久连接、Cookie/Session
HTTP/1.0 使用非持久连接。HTTP/1.1 默认使用持久连接。非持久连接的每个连接,TCP 得在客户端和服务端分配 TCP 缓冲区,并维持 TCP 变量,会严重增加服务器负担。而且每个对象都有 2 个 RTT(Round Trip Time,也就是一个数据包从发出去到回来的时间)的延迟,由于 TCP 的拥塞控制方案,每个对象都遭受 TCP 缓启动,因为每个 TCP 连接都起始于缓启动阶段。
HTTP 持久连接怎么判断一个请求是否结束的?
-
Content-length:根据所接收字节数是否达到 Content-length 值
-
chunked(分块传输):Transfer-Encoding。当选择分块传输时,响应头中可以不包含
Content-Length,服务器会先回复一个不带数据的报文(只有响应行和响应头和\r\n),然后开始
传输若干个数据块。当传输完若干个数据块后,需要再传输一个空的数据块,当客户端收到空的数据
块时,则客户端知道数据接收完毕。
四、HTTPS、对称加密、非对称加密
1、HTTPS 和 HTTP 的区别
HTTPS 协议 = HTTP 协议 + SSL/TLS 协议
SSL 的全称是 Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安
全协议。TLS 的全称是 Transport Layer Security,即安全传输层协议。
即 HTTPS 是安全的 HTTP。
1、客户端访问HTTPS 连接
客户端会把安全协议版本号、客户端支持的加密算法列表、随机数 C 发给服务端。
2、服务端发送证书给客户端
服务端接收密钥算法配件后,会和自己支持的加密算法列表进行比对,如果不符合,则断开连接。否则,
服务端会在该算法列表中,选择一种对称算法(如 AES)、一种公钥算法(如具有特定秘钥长度的 RSA)和
一种 MAC 算法发给客户端。
服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其
泄露,公钥可以发送给任何人。
在发送加密算法的同时还会把数字证书和随机数 S 发送给客户端
3、客户端验证 server 证书
会对 server 公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么 HTTPS 传输就无法继续。
4、客户端组装会话秘钥
如果公钥合格,那么客户端会用服务器公钥来生成一个前主秘钥(Pre-Master Secret,PMS),并通过该前主
秘钥和随机数 C、S 来组装成会话秘钥
5、客户端将前主秘钥加密发送给服务端
是通过服务端的公钥来对前主秘钥进行非对称加密,发送给服务端
6、服务端通过私钥解密得到前主秘钥
服务端接收到加密信息后,用私钥解密得到主秘钥。
7、服务端组装会话秘钥
服务端通过前主秘钥和随机数 C、S 来组装会话秘钥。
至此,服务端和客户端都已经知道了用于此次会话的主秘钥。
8、数据传输
客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。
同理,服务端收到客户端发送来的密文,用服务端密钥对其进行对称解密,得到客户端发送的数据。
总结:
会话秘钥 = random S + random C + 前主秘钥
-
HTTPS 连接建立过程使用非对称加密,而非对称加密是很耗时的一种加密方式
-
后续通信过程使用对称加密,减少耗时所带来的性能损耗
-
其中,对称加密加密的是实际的数据,非对称加密加密的是对称加密所需要的客户端的密钥。
五、对称加密和非对称加密
1、对称加密
用同一套密钥来进行加密解密。
对称加密通常有 DES,IDEA,3DES 加密算法。
2、非对称加密
用公钥和私钥来加解密的算法。
公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),
公钥是密钥对中公开的部分,私钥则是非公开的部分,私钥通常是保存在本地。
-
用公钥进行加密,就要用私钥进行解密;反之,用私钥加密,就要用公钥进行解密(数字签名)。
-
由于私钥是保存在本地的,所以非对称加密相对与对称加密是安全的。 但非对称加密比对称加密耗时(100 倍以上),所以通常要结合对称加密来使用。
常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
而为了确保客户端能够确认公钥就是想要访问的网站的公钥,引入了数字证书的概念,由于证书存在一级
一级的签发过程,所以就出现了证书链,在证书链中的顶端的就是根 CA。
六、TCP 的特点和报文结构
1、面向连接、可靠传输、面向字节流、全双工服务
2、TCP 的报文结构 TCP 报文段由首部字段和一个数据字段组成。
数据字段包含一块应用数据。最大报文长度 MSS(Maximum Segment Size)限制了报文段数据字段的最大
长度。MSS 选项用于在 TCP 连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。
所以当 TCP 发送一个大文件(比如一张高清图片)时,通常是将该文件划分为 MSS 长度的若干块(最后一
块除外,通常会小于 MSS)。而实际交互式应用通常传送长度小于 MSS 的数据块。
总结
学习这件事情,我们不能急功近利,一次性吃成一个胖子,而是在于不断学习,可持续性学习。日积月累,水滴石穿。作为游荡于各个平台的搬运工,我也收集了许多iOS开发资料,面试资料。如果你正好需要,我正好有这个渠道。需要的话课点击下面的圈子。最后求一波点赞和关注。
圈子
转载自:https://juejin.cn/post/7004739022123696136