面试笔记 | 计算机网络(一)

55 阅读5分钟

本文写于9.16,重拾计算机网络,主要从一个面试者的角度去讲计算机网络,因此不涉及太多细节,仅针对面试

如果你是计算机科班,你必然学过计算机网络这门课程,笔者记得当时上的教材是:计算机网络:自底向上

从笔者的角度看,计算机网络就是诸多协议构成的,计算机网络的整个模型也是分层级的,因此我们的学习也是分层进行的,我们将自顶向下的学习,这么安排的原因,我觉得从计算机的顶层开始是更切合我们实际场景的,再到底层的传输,相对来说复习路径更加平滑

计算机网络模型

OSI 七层模型 vs TCP/IP 四层模型

首先我们需要了解计算机网络的模型是怎么样的,常见的面试题就是OSI 七层模型 和 TCP/IP 四层模型(虽然但是笔者面试到现在基本没有遇到过这么问的)

image.png

我们可以建立起一个初步的认识

  1. 物理层:比特流的传输
  2. 数据链路层:将上层传递的数据包分帧传输
  3. 网络层:ip层,主要进行路由和寻址
  4. 传输层:端到端的通信,这一层只关心ip:port的通信
  5. 会话层:进行会话管理
  6. 表示层:进行数据格式的转化
  7. 应用层:提供应用层面的一些接口

如果你这里不太理解,其实也并不太重要,面试基本不会进行这方面的考察

TCP/IP 四层模型

image1.png

要说二者的理解,OSI 七层模型算是一种协商的共识,建立了一个统一的网络通信协议栈,TCP/IP 则是具体的实现

应用层

应用层的协议有很多,比如HTTP、HTTPS、DNS、FTP、SMTP、POP3

其实面试的话会问的也仅仅是HTTP、HTTPS、DNS

HTTP

HTTP 请求是最常见的 web 请求,在我们访问一个网页的时候会发送HTTP请求获取服务器资源解析到网页上

请求报文

对于 SpringBoot 而言, 我们写一个接口例如:

@GetMapping("/v1/user")
public Response getUserInfo()  

我们会通过至少两个部分确定一个接口 请求方法:get/post 路径:请求url

因此请求报文的组成:

请求方法 url http版本 首部行

一个具体的例子:

GET http://baidu.com/ http/1.1
Host: baidu.com
Connection: keep-alive

通常这里最后还有一个请求体,比如post方法需要传递一些参数

响应报文

HTTP/1.1 200 OK
Content-Length: 158
<响应体>

这里主要是三个字段,HTTP版本号,状态码,短语

其次这里最常考的就是HTTP各版本之间的差异

HTTP1.0 - 1.1 - 2.0 - 3.0

HTTP1.0 -> HTTP1.1

  • 支持长连接,即一次HTTP请求中允许多个请求 - 响应
  • 增加更多请求方法
  • 支持断点续传(后续专门讲一下)

HTTP1.1 -> HTTP2.0

  • 改为二进制帧传输,加快报文解析
  • HPack算法首部行缓存,客户端和服务端共同维护一个索引表
  • 支持单TCP的多路复用,解决了HTTP层面的队头阻塞

HTTP队头阻塞是因为HTTP是请求-响应模型,一次请求后必须等到响应才能继续请求,因此存在阻塞现象,这里将单TCP进行多路复用,一个TCP通过流的方式进行复用同时承接多个请求-响应模型,其实HTTP1.1应对队头阻塞的方式是建立多个TCP连接,但是这是治标不治本的

HTTP2.0 -> HTTP3.0

HTTP3.0其实做的最大的升级就是底层协议发生了变化,这里采用了udp实现的quic协议替代了tcp

quic协议不仅仅只是一个网络层的协议,它集成了许多的其他的优点,比如直接集成了tls1.3,集成了http2.0

因此它有以下几个优点:

  1. 从网络层层面解决了队头阻塞,即tcp的队头阻塞(tcp存在ack机制会导致发送窗口阻塞)
  2. 结合tls1.3实现了1-RTT握手,恢复时可以根据服务端发放的凭证实现0-RTT恢复
  3. 采用64位连接标识,替换了ip:port的标识,实现了连接迁移

笔者这里是参考了B站的教程,有图像化的解释更加容易理解,同时做一下tls1.3 和 tls1.2差异的理解

具体的内容我觉得面试层面已经ok了,其实如果面试官不是做底层的,一般答到这里已经不错了

HTTPS

https 就是在 http 的基础上再进行了tls的握手

对于 tls1.2 而言握手分为两个RTT

  1. 第一个RTT负责加密套件的协商
  2. 第二个RTT负责会话密钥的协商

具体来说

  1. 第1个RTT:双方确定tls版本,加密套件,交换随机数
  2. 第2个RTT:客户端生成预主密钥,结合前两步的随机数算出会话密钥,双方用密钥加密验证消息的一致性

HTTPS 在协商阶段是非对称加密的采用公钥加密,私钥解密
HTTPS 在通信阶段是对称加密的,因为已经协商出了一个会话密钥

这里并不是只能验证服务器的数字证书,客户端也可以向服务端提交证书做双向身份验证

DNS

dns 全名是 domain name system 域名系统

DNS的作用就是将域名解析成IP地址

一次完整的DNS解析(以访问www.baidu.com)为例:

  1. 本地DNS缓存访问
  2. 向根服务器访问
  3. 向顶级域名服务器访问
  4. 向权威域名服务器访问