Halo

A magic place for coding

0%

实习面经 -- 计算机网络基础

面试总结之计算机网络基础

   计算机网络是计算机领域的重要组成部分,无论是前端开发或者是后端开发,多多少少都会涉及计算机网络的一些基础知识,这里就为大家总结一下常见的考点。总结的部分是结合了教科书、其他面经以及个人的面试经历,相信能够帮助到大家。如果有不足的地方,欢迎大家指出!

   本博客长期更新,欢迎大家收藏、订阅!

TCP 的 4 次挥手

  TCP 握手是 3 次,挥手是 4 次。握手大家都比较熟,面试的时候问挥手比较多。

  • 过程:
    1. Client 发出终止连接的请求,FIN 置为 1
    2. Server 收到后,返回一个 ACK,表示 Server 知道 Client 需要终止连接
    3. 因为 Server 可能还有没有传输完的数据,所以等到数据都传完后,Server 向 Client 发送一个数据,FIN 置为 1,表示 Server 已经发送完数据了,可以中止连接。
    4. Client 收到后,发送一个 ACK,确认终止连接
  • Details:在上述第四步后,Client 会进入 time_wait 状态,这个是常问的点。原因有二:
    • 让 Client 有更大的机会让丢失的 ACK 被再次发送给 Server
    • 不允许在 time_wait 状态建立连接,经过 2MSL 后变为 CLOSE 状态,这样上一个连接的残余数据都会被丢掉,不影响后续的连接。

TCP 的 4 次挥手


TCP 如何保证传输的可靠性

  1. 应用数据被分割成 TCP 认为最适合发送的 ** 数据块 **。
  2. ** 超时发送 :TCP 发出一个段后,它启动一个定时器(timer**),等待接收端返回 ACK 确认发到这个报文段。如果不能及时收到一个 ACK 确认,将重发这个报文段。
  3. TCP 接收端收到数据后,将发送一个 ACK 确认。
  4. TCP 保持它首部和数据的校验和(checksum),是端对端的(end-to-end)。如果检验出包有错,丢弃报文段,不给出响应,TCP 发送端超时后重发。
  5. TCP 按照 seq 对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
  6. ** 流量控制 **:滑动窗口机制,防止较快主机致使较慢主机的缓冲区溢出。

TCP 拥塞控制(congestion control)

  • ** 目的 :防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。(注意, 拥塞控制(congestion control)** 针对的 ** 整个网络 ** 流量的控制,而 ** 流量控制(flow control)** 针对的是 ** 端对端 ** 的控制)
  1. ** 慢启动(slow start)** 和 ** 拥塞避免(congestion avoidance)**
    • 发送方为出一个拥塞窗口 cwnd,窗口大小取决于网络的拥塞程度。cwnd 从 1MSS 开始,按 1,2,4,8 的方式增加(** 倍增 **)
    • 慢开始门限 ssthresh
      • cwnd$\lt$ssthresh,慢启动;
      • cwnd$\gt$ssthresh,拥塞避免;
      • cwnd=ssthresh,两者都可
    • ** 拥塞避免 **:cwnd 线性增加,每次增加 1MSS。
  2. ** 快速重传(fast retransmit)** 和 ** 快恢复(fast recovery)**
    • 快速重传:接收方每收到一个失序报文就发送出 ** 重复的 ACK**,一旦收到 3 个相同的 ACK,则重传该报文段
    • 快恢复:当接收方收到 3 个相同的 ACK 时,ssthresh 减半,重置 cwnd=ssthresh,然后 cwnd 执行线性增。原因是接收方能够收到 ACK 说明网络中仍有一定的传输能力,因此不需要重新开始。
  3. 例子
    • TCP Tahoe:当发生丢包(超时或收到 3 个 ACK)时,ssthresh=cwnd/2cwnd=1,执行 ** 慢启动 **;
    • TCP Reno:当收到 3 个 ACK 时,ssthresh=cwnd/2cwnd=ssthresh,执行 ** 拥塞避免 **;

HTTP 和 HTTPS

  • HTTPS,称作 HTTP over TLS,TLS 的前身是 SSL。

  • 原理:首先 Client 和 Server 双方使用 ** 非对称密钥 ** 进行沟通,将 Client 端生成的一个 key 通过非对称加密的形式传递给 Server。然后双方使用 key 进行 ** 对称加密 **,从而进行正常的内容传输。

  • 区别:

    • HTTP 是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议
    • 不同的端口,HTTP:80,HTTPS:443

    HTTPS 过程图解

  • 过程:

    1. Client 向 Server 发送请求
    2. Server 生成一组密钥,包括一个公钥 crt public(public key)和一个私钥 crt private(private key)。然后将公钥 crt public 返回给 Client。
    3. Client 随机生成一个 key,然后使用这个 crt publickey 加密,最后将加密后的 key 发送给 Server。
    4. Server 使用 crt private 对这个 key 解密,获得了 key,然后将需要返回的网页内容使用这个 key 进行加密,最后将加密后的内容返回给 Client。
    5. Client 收到内容后使用 key 解密,获得了网页内容。

网页访问全过程

   用户在浏览器中输入 URL 到响应页面的整过过程中,包含了许多计算机网络的协议。下面就简单介绍这个过程:

  1. 本机获取 IP 地址
    • DHCP 协议:使用 UDP,将以太网帧广播,找到 DHCP 服务器,然后发送 ACK 确认收到信息。包括:本机 IP、本地 DNS 服务器 IP、first-hop 路由的 IP。
  2. DNS 解析
    • 发起 DNS query:使用 UDP,需要 router 的 MAC 地址。
    • ARP 协议:通过广播获取 router 的 MAC 地址。router 收到广播后发送 ARP reply(含有 router 的 MAC 地址)
    • 回到 DNS query,顺序为:DNS query 发出 $\rightarrow$ 本地域名服务器 $\rightarrow$ 根域名服务器 $\rightarrow$com 顶级域名服务器 $\rightarrow$ 获取解析后的 IP 地址
  3. HTTP 部分
    • 基于 TCP,通过 3 次握手后,Client 和 Server 建立链接,传送数据。
  • Details
    • DNS 负载均衡:根据机器的负载量、该机器与用户地理位置的距离,返回合适的机器 IP 给用户,缩短响应时间
    • GET 和 POST
      1. 浏览器限制 URL 在 2k 个字节,服务器最多处理 64k 的 URL,所以不能把过多的信息放在 GET 中的 URL 传送。
      2. 使用 GET,同时在 request body 放数据,Server 不一定会处理,视乎 Server 端的处理方式。
      3. GET 方法发送一个数据包,POST 方法发送两个数据包。具体情况是:GET 方法将 http 的 header 和数据 data 一起发送出去,Server 直接响应 200;POST 方法先发 http 的 header,Server 响应 100(continue),然后 Client 再发送数据 data,Server 响应 200。(FireFox 只发送 1 次)。

Reference

  1. HTTPS 加密过程
  2. TCP 四次挥手中 time_wait 的作用
  3. GET 和 POST 的区别

Welcome to my other publishing channels