面试网络问题

104 阅读4分钟

从输入URL到页面展示的详细过程

  1. 输入网址

  2. DNS解析

  3. 建立TCP连接

  4. 客户端发送HTTP请求

  5. 服务器处理请求

  6. 服务器响应相求

  7. 浏览器展示HTML

  8. 浏览器发送请求获取其他在HTML中的资源

    HTTP 请求头

    1. GET
    2. POST
    3. PUT
    4. DELETE
    5. HEAD
    6. OPTION
    7. TRACE

    HTTP三次握手

    1. 客户端给服务端发一个SYN报文,并指明客户端的初始化序列ISN(c)。此时客户端处于SYN_Send状态。SYN seq=x

    2. 服务器收到客户端的SYN报文之后,会以自己的SYN报文应答,并且也制定了自己的初始化序列号ISN(s),同时会把客户端的ISN+1作为ACK的值,表示自己已经收到了客户端的SYN,此时服务器处于SYN——REVD的状态。SYN seq=y,ACK=x+1

    3. 客户端收到SYN报文之后,会发送一个ACK报文,当然,也是一样把服务器的ISN+1作为ACK的值,表示已经收到了服务端的SYN报文,此时客户端处于establised状态。ACK=y+1

    4. 服务器收到ACK报文之后,也处于establised状态,双方建立起了连接。

      为何是三次握手?

      如果两次握手,服务器无法知道客户端是否收到了自己的消息。

      如果四次握手,会造成资源浪费。

    四次挥手

    1. Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
    2. Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
    3. SERVER发送一个FIN,用来关闭SERVER到CLIENT的数据传送,SERVER进入LAST_ACK状态
    4. CLIENT收到FIN后,CLIENT进入TIME_WAIT状态,接着发送一个ACK给SERVER,确认序列号为收到序号+1,SERVER进入CLOSED状态,完成四次挥手。

    为何是四次挥手

    服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。但是在关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

    为何最后一次挥手是2MSL

    MSL是报文最大生存时间。

    1. 如果第四次挥手的报文段丢失了,那么会超时重传第3次挥手的报文段,为了保证第四次挥手的ACK能被服务器接收到,所以需要2MSL时间。
    2. 为了确保所有的老链接都在网络中消失。

HTTPS和HTTP的区别

  1. 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器。
  2. 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;
  3. 客户端对服务器的证书进行验证,并抽取服务器的公用密钥;然后,再产生一个称作pre_master_secret的随机密码串,并使用服务器的公钥对其进行加密,并将加密后的信息发送给服务器。
  4. 客户端与服务器端根据pre_master_secret以及客户端与服务器的随机数值独立计算出加密和MAC密钥。
  5. 客户端将所有握手消息的MAC值发送给服务器。
  6. 服务器将所有握手消息的MAC值发送给客户端。

浏览器使用https的URL访问服务器,建立SSL链接

服务器收到SSL链接,发送非对称加密的公钥A返回给浏览器

浏览器生成随机数,作为对称加密的密钥B

浏览器使用公钥A,对自己生成的密钥B进行加密,得到密钥C

浏览器将密钥C发送给服务器

服务器用私钥D对密钥C进行解密,得到对称加密的密钥B

浏览器和服务器之间可以用密钥B作为对称加密的密钥进行通信。

前端网络优化的手段

  1. 减少请求数量

    (1)合并

    (2)减少重定向

    (3)使用浏览器缓存

    (4)使用CSS Sprite

    (5)内容分片

  2. 减少DNS查询

  3. 缓存Ajax请求

  4. 延迟加载|延迟渲染

  5. 预加载

  6. 减少DOM元素

  7. 将内容划分到不同域名

  8. 减少iframe使用

  9. 避免404错误

  10. 补充规则