iOS面试知识整理 - 网络

269 阅读6分钟

网络

HTTP协议

请求/响应报文

请求报文.png 响应报文.png

GET和POST方式的区别

  1. 参数的区别
  2. GET长度限制2048个字符
  3. 从语义的角度来回答
    1. get是获取资源的,是安全的、幂等的、可缓存的
    2. post是处理资源的,非安全的、非幂等的、不可缓存的

连接建立流程

TCP连接.png

HTTP的特点

无连接 - HTTP的持久连接?

无状态 - Cookie、Session

HTTP的持久连接

目的:提升网络请求效益和减少损耗

头部字段设置

  1. Connection:keep-alive
  2. time:20
  3. max:10

如何判断一个请求是否接受

  • Content-length:1024?
  • chunked:最后会有一个空的chunked

HTTPS与网络安全

HTTPS = HTTP + SSL/TLS

流程 HTTPS流程.png 会话秘钥:= random S + random C + 预主秘钥

预主秘钥:户端自己生产预主密钥,通过公钥加密预主秘钥,将加密后的预主秘钥发送给服务器 (Client Exchange)

公钥:

私钥:

HTTPS都使用了那些加密手段,为什么?

连接建立过程使用了非对称加密,非对称加密很耗时

后续通信过程使用对称加密

非对称加密.png

TCP/UDP

传输层协议

TCP 传输控制协议

  1. 面向连接 - 三次握手(可以解决同步连接超时问题)、四次挥手(全双工,两边都需要释放)
  2. 可靠传输 - 无差错、不丢失、不重复、按序达到
    1. 停止等待协议- 无差错情况、超时重传、确认丢失、确认迟到
  3. 面向字节流 - 根据情况拆分和合并传输给接收方
  4. 流量控制
    1. 滑动窗口协议 属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量。
  5. 拥塞控制
    1. 慢开始,拥塞编码
    2. 快开始,快重传

UDP 用户数据报协议

特点

  1. 无连接
  2. 尽最大努力交付
  3. 面向报文,既不合并,也不拆分

功能

  1. 复用、分用 (IP端口针对客户端还是服务端的复用和分用)

  2. 差错检测

DNS解析

了解DNS解析吗?

域名到IP地址的映射,DNS解析请求采用UDP数据报,且明文传输

DNS解析查询方式?

  1. 递归查询
    • 我给你问一下
    • 本地DNS->根域DNS->顶级DNS->权限DNS
  2. 迭代查询
    • 我告诉你谁知道
    • 根域DNS-顶级DNS-权限DNS 中间是本地DNS去对应询问

DNS解析常见问题?

  1. DNS劫持
    1. 如何解决
      • httpDNS
      • 长连接
  2. DNS解析转发问题
  3. DNS劫持与HTTO的关系
    1. 没有关系
    2. DNS解析发生在HTTP建立连接之前
    3. DNS解析请求使用UDP数据报,端口号53

Session/Cookie

HTTP协议无状态特点的补偿

Cookie

Cookie主要用来记录用户状态,区分用户;

状态保存在用户端

怎么修改Cookie

新的覆盖旧的

属性需要和旧的一样

怎么保证Cookie安全

  • 对Cookie进行加密处理
  • 只在https上携带Cookie
  • 设置Cookie为httpOnly,防止跨站脚本攻击

Session

Session主要用来记录用户状态,区分用户;

状态保存在服务器端

Socket

Socket是什么

socket的引入是为了解决不同计算机间进程间通信的问题 Socket接口是TCP/IP、UDP/IP网络的API接口函数,其介于应用层和传输层之间

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

Socket连接参数设置

第一个参数addressFamily IPv4(AF_INET) 或 IPv6(AF_INET6)。 第二个参数 type 表示 socket 的类型,通常是流stream(SOCK_STREAM) 或数据报文datagram(SOCK_DGRAM) 第三个参数 protocol 参数通常设置为0,以便让系统自动为选择我们合适的协议,对于 stream socket 来说会是 TCP 协议(IPPROTO_TCP),而对于 datagram来说会是 UDP 协议(IPPROTO_UDP)。

服务器工作流程

  1. 服务器调用 socket(...) 创建socket;
  2. 服务器调用 listen(...) 设置缓冲区;
  3. 服务器通过 accept(...)接受客户端请求建立连接;
  4. 服务器与客户端建立连接之后,就可以通过 send(...)/receive(...)向客户端发送或从客户端接收数据;
  5. 服务器调用 close 关闭 socket; 

客户端工作流程

  1. 客户端调用 socket(...) 创建socket;
  2. 客户端调用 connect(...) 向服务器发起连接请求以建立连接;
  3. 客户端与服务器建立连接之后,就可以通过 send(...)/receive(...)向客户端发送或从客户端接收数据;
  4. 客户端调用 close 关闭 socket;

心跳包

心跳就是用来检测TCP连接的双方是否可用

**这里我们需要说明的是TCP的KeepAlive机制只能保证连接的存在,但是并不能保证客户端以及服务端的可用性.**比如会有以下一种情况:

某台服务器因为某些原因导致负载超高,CPU 100%,无法响应任何业务请求,但是使用 TCP 探针则仍旧能够确定连接状态,这就是典型的连接活着但业务提供方已死的状态。

这个时候心跳机制就起到作用了:

  • 我们客户端发起心跳Ping(一般都是客户端),假如设置在10秒后如果没有收到回调,那么说明服务器或者客户端某一方出现问题,这时候我们需要主动断开连接。
  • 服务端也是一样,会维护一个socket的心跳间隔,当约定时间内,没有收到客户端发来的心跳,我们会知道该连接已经失效,然后主动断开连接。

重连机制

理论上,我们自己主动去断开的Scoket连接(例如退出账号,APP退出到后台等等),不需要重连。其他的连接断开,我们都需要进行断线重连。 一般解决方案是尝试重连几次,如果仍旧无法重连成功,那么不再进行重连。

网络相关面试总结

  1. HTTP中的GET和POST方式有什么区别?

从语义回答

GET是安全的,幂等的,可缓存的,POST反之

  1. HTTPS连接建立流程是怎样?
    1. 流程图回答
  2. TCP和UDP的区别
    1. UDP:无连接、尽可能交付,面对报文(不拆分、不合并)
    2. TCP:面向连接、可靠传输、面向字节流、拥塞控制、流量控制
  3. 请简述TCP的慢开始过程
    1. 拥塞控制回答
  4. 客户端怎样避免DNS劫持
    1. httpDNS
    2. 长连接
  5. TCP粘包