iOS 面试 --- 网络
get 和 post的区别?
-
get:是用来获取资源的
安全的、幂等的、可缓存的 -
post:是用来处理资源的
非安全的、非幂等的、不可缓存的 -
安全的:指的是不使server 端的状态发生变化
-
幂等:同一个方法执行一次和执行多次的执行效果一样
-
可缓存:请求是否可以被缓存
http 请求的整个流程?
首先是通过 tcp 的三次握手建立客户端到服务端的连接,连接建立完成,客户端发送请求报文,服务端发送响应报文给客户端,然后通过四次挥手断开客户端与服务端的连接。三次握手流程是这样的,首先是客户端发送同步 syn 报文给服务端,服务端收到以后发送同步的 ack 报文给客户端,客户端将接收的 ack 报文回给服务端,此时 http 连接就已经建立了。四次挥手是,客户端发送 fin 报文给服务端,服务端收到发送 ack 报文给客户端,此时服务端接着发送 fin的 ack 报文给客户端,客户端将收到的 ack 报文回传给服务端,这个时候客户端和服务端就断开了
http有啥特点?
- 无连接:实际就是 http 的持久连接方案。
- 无状态的:
cookie 和 session
如何理解 http 的持久连接?
非持久连接,每次建立网络请求都会重新建立一条连接,请求结束关闭连接,而http持久连接,建立一条连接,后续多个连接都在同一条 tcp 链路。
持久连接的头部字段
- Connection:keep-alive (是否是持久连接)
- Time: (连接建立的时长)
- Max: (这条连接可以发送多少条请求)
对于持久连接,如何判断一个请求结束?
- 请求报文或者响应报文content-length,看响应报文是否达到峰值,达到则意味着请求结束
- 通过判断 chunked,如果最后返回的那一个chunked回空,则意味着请求结束
https 和 http 的区别?
https 是安全的 http,它的安全来源于,在应用层之下传输层之上插入了一个 ssl或者 tls 来保证 http 传输的安全性。
https 连接建立的流程?
- 客户端向服务端发送 tls 协议的版本号,以及客户端支持的算法和一个随机数C,之后server 端会发送一个加密算法和一个随机数S 以及server证书给客户端,客户端接收到证书会进行证书验证,然后会组装会话秘钥,此时客户端会通过服务端的公钥对预主秘钥进行加密
- 接着服务端通过私钥解密得到预主秘钥,然后组装会话
- 客户端发送加密握手消息
- 服务端发送加密握手消息
https采用的加密手段?
- 在建立连接流程使用的是非对称加密,因为非对称加密是耗时的
- 而在后续通信的过程中使用的是对称加密
TCP 和 UDP
关于 TCP 和 UDP,我自认为没有以下这篇博文写的通俗易懂,故附上链接,大家转到这里去看即可,所有涉及到的面试,都在这篇博文里面。
https://juejin.im/post/5e527c58e51d4526c654bf41#comment
DNS
什么是 DNS解析?
域名到ip 地址的映射,dns 解析请求采用 udp 数据报的形式传输,且明文
流程大概是什么的?
客户端向 dns 服务器获取连接的 ip 地址,然后用得到的 ip 地址去和服务端建立连接,这个就是 dns 解析
dns解析的方式有哪几种?
-
递归解析
-
迭代解析
dns解析存在哪些常见的问题?
-
dns劫持问题
dns劫持和 http的关系是怎样的?
dns 劫持和 http是没有关系的,因为 dns 解析是发生在建立连接以前,并且 dns解析请求是通过 udp 数据报,去访问端口号为 53 的请求,所以说 dns 劫持和 http 是没有关系的
-
dns 解析转发
如何解决 dns 劫持?
httpDns
Dns 常规解析是使用 dns 协议向 dns 服务器的 53 端口发送请求,而使用 httpDns 则是使用 http 协议向 dns 服务器的 80 端口发送请求解析
长链接
Cookie 和 Session
什么是 cookie?
cookie 主要是用来记录用户的状态、区分用户,状态保存在客户端
Cookie 生成流程
客户端发送的 cookie 在 http 请求报文的Cookie头部字段中,
服务端设置 http 响应报文的 set-cookie头部字段向客户端传递 cookie 内容
如何修改 cookie?
- 新覆盖旧
覆盖原则,name、domain、path需要与原来的 cookie
怎么删除 cookie?
- 新覆盖旧 覆盖原则,name、domain、path需要与原来的 cookie;* 通过设置 cookie 的 expires = 过去的一个时间点,或者是 maxAge = 0
什么是 session?
session 主要是用来记录用户的状态、区分用户,状态保存在Server端
session 生成流程
客户端发送请求,服务端会生成 Cookie,同时会生成一个 sessionId,然后已 set-Cookie 的形式返回客户端
怎么样保证 cookie 的安全?
- 对 cookie 进行加密处理
- 只在 https 上携带 cookie
- 设置 cookie 为 httpOnly,防止跨站脚本攻击
总结
以上基本就涵盖了 iOS 面试网络相关的面试了