1、如何理解URI

URI,全称为(Uniform Resource Identifier),也就是统一资源标识符,它的作用就是区分互联网上不同的资源。但是,它并不是我们常说的网址,网址指的是URL,实际上URI包含了URN和URL两个部分,由于 URL 过于普及,就默认将 URI 视为 URL 了。
URI 真正最完整的结构是这样的:
HTTP知识的面试题 - 图1
好像跟平时见到的不太一样!先别急,来一一拆解。scheme 表示协议名,比如http, https, file等等。后面必须和://连在一起。user:passwd@ 表示登录主机时的用户信息,不过很不安全,不推荐使用,也不常用。host:port 表示主机名和端口。path 表示请求路径,标记资源所在位置。query 表示查询参数,为key=val这种形式,多个键值对之间用&隔开。fragment 表示 URI 所定位的资源内的一个锚点,浏览器可以根据这个锚点跳转到对应的位置。

  1. https://www.yuque.com/kenguba/upkpls/gisxr2/?word=1&name=kenguba#UrkH4

这个 URI 中

  • https 即 scheme 部分
  • www.yuque.com 为 host:port 部分(注意,http 和 https 的默认端口分别为80、443)
  • kenguba/upkpls/gisxr2 为path部分
  • word=1&name=kenguba 表示query部分
  • UrkH4 就是锚点

2、HTTP 超文本传输协议

HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。

HTTP 报文结构是怎样的?

header + body 的结构,具体而言:

  1. 起始行 + 头部 + 空行 + 实体

由于 http 请求报文和响应报文是有一定区别,因此分开介绍
HTTP知识的面试题 - 图2

起始行

对于请求报文来说,起始行类似下面这样:也就是方法 + 路径 + http版本。

  1. GET /home HTTP/1.1

对于响应报文来说,起始行一般张这个样:

  1. HTTP/1.1 200 OK

响应报文的起始行也叫做状态行。由 http版本、状态码和原因三部分组成。
注意:在起始行中,每两个部分之间用空格隔开,最后一个部分后面应该接一个换行,严格遵循 ABNF 语法规范。

头部

展示一下请求头和响应头在报文中的位置:
HTTP知识的面试题 - 图3

HTTP知识的面试题 - 图4

空行

很重要,用来区分开头部和实体。问: 如果说在头部中间故意加一个空行会怎么样?那么空行后的内容全部被视为实体。

实体

就是具体的数据了,也就是 body 部分。请求报文对应请求体, 响应报文对应响应体。

HTTP 和 HTTPS 的主要区别是什么呢?

  1. 最简单的,HTTP 在地址栏上的协议是以 http:// 开头; HTTPS 在地址栏上的协议是以 https:// 开头。
  2. HTTP 是未经安全加密的协议;而 HTTPS 是安全的协议,它通过 密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法 能够解决上面这些问题。
  3. HTTP 的默认端口是 80;而 HTTPS 的默认端口是 443。

3、说一下 GET 和 POST 的区别?

首先最直观的是语义上的区别。而后又有这样一些具体的差别:

  • 从缓存的角度 GET 请求会被浏览器主动缓存下来,留下历史记录,而 POST 默认不会。
  • 从编码的角度 GET 只能进行 URL 编码,只能接收 ASCII 字符,而 POST 没有限制。
  • 从参数的角度 GET 一般放在 URL 中,参数长度有限制,不安全,POST 放在请求体中,能传输更多参数,更适合传输敏感信息。
  • 从幂等性的角度 GET是幂等的,而POST不是。(幂等表示执行相同的操作,结果也是相同的)
  • 从TCP的角度 GET 请求会把请求报文一次性发出去,而 POST 会分为两个 TCP 数据包,首先发 header 部分(预检请求),如果服务器响应 100(continue), 然后发 body 部分。(火狐浏览器除外,它的 POST 请求只发一个 TCP 包)

4、HTTP 常见的状态码,有哪些?

HTTP知识的面试题 - 图5

下面是常见的HTTP状态码:

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

5、UDP 和 TCP 的区别

TCP 和 UDP 都位于计算机网络模型中的运输层,它们负责传输应用层产生的数据。下面来看看 TCP 和 UDP 分别的特征和他们的区别

UDP 是什么

UDP 的全称是 User Datagram Protocol,用户数据报协议。它不需要所谓的握手操作,从而加快了通信速度,允许网络上的其他主机在接收方同意通信之前进行数据传输。

数据报是与分组交换网络关联的传输单元。

UDP 的特点主要有

  • UDP 能够支持容忍数据包丢失的带宽密集型应用程序
  • UDP 具有低延迟的特点
  • UDP 能够发送大量的数据包
  • UDP 能够允许 DNS 查找,DNS 是建立在 UDP 之上的应用层协议。

    TCP 是什么

    TCP 的全称是Transmission Control Protocol ,传输控制协议。它能够确定计算机连接到 Internet 以及它们之间的数据传输。通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接。
    TCP 的主要特点有:

  • TCP 能够确保连接的建立和数据包的发送

  • TCP 支持错误重传机制
  • TCP 支持拥塞控制,能够在网络拥堵的情况下延迟发送
  • TCP 能够提供错误校验和,甄别有害的数据包。

    TCP 和 UDP 的不同

    1. 连接

  • TCP 是面向连接的传输层协议,传输数据前先要建立连接。

  • UDP 是不需要连接,即刻传输数据。

2. 服务对象

  • TCP 是一对一的两点服务,即一条连接只有两个端点。
  • UDP 支持一对一、一对多、多对多的交互通信

3. 可靠性

  • TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
  • UDP 是尽最大努力交付,不保证可靠交付数据。

4. 拥塞控制、流量控制

  • TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
  • UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。

5. 头部开销

  • TCP 头部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的。
  • UDP 头首部只有 8 个字节,并且是固定不变的,开销较小。

    TCP 和 UDP 应用场景:

    由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:

  • FTP 文件传输

  • HTTP / HTTPS

由于 UDP 面向无连接,它可以随时发送数据,再加上 UDP 本身的处理既简单又高效,因此经常用于:

  • 包总量较少的通信,如 DNSSNMP
  • 视频、音频等多媒体通信
  • 广播通信

HTTP知识的面试题 - 图6

7、TCP 三次握手和四次挥手

TCP 三次握手和四次挥手也是面试题的热门考点,它们分别对应 TCP 的连接和释放过程。

TCP 三次握手

在了解具体的流程前,需要先认识几个概念
HTTP知识的面试题 - 图7

  • SYN:它的全称是 Synchronize Sequence Numbers,同步序列编号。是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立 TCP 连接时,首先会发送的一个信号。客户端在接受到 SYN 消息时,就会在自己的段内生成一个随机值 X。
  • SYN-ACK:服务器收到 SYN 后,打开客户端连接,发送一个 SYN-ACK 作为答复。确认号设置为比接收到的序列号多一个,即 X + 1,服务器为数据包选择的序列号是另一个随机数 Y。
  • ACK:Acknowledge character, 确认字符,表示发来的数据已确认接收无误。最后,客户端将 ACK 发送给服务器。序列号被设置为所接收的确认值即 Y + 1。

HTTP知识的面试题 - 图8

  1. 发送端首先发送一个带有 SYN 标志(同步序列编号)的数据包给接收方;
  2. 接收方接收后,回传一个带有 SYN+ACK 标志的数据包传递确认信息,表示我收到了。
  3. 最后,发送方再回传一个带有 ACK 标志的数据包,代表我知道了,表示握手结束。

如果用现实生活来举例的话就是
小明 - 客户端 小红 - 服务端

  • 小明给小红打电话,接通了后,小明说喂,能听到吗,这就相当于是连接建立。
  • 小红给小明回应,能听到,你能听到我说的话吗,这就相当于是请求响应。
  • 小明听到小红的回应后,好的,这相当于是连接确认。在这之后小明和小红就可以通话/交换信息了。

TCP 四次挥手

在连接终止阶段使用四次挥手,连接的每一端都会独立的终止。下面来描述一下这个过程。
HTTP知识的面试题 - 图9
客户端主动关闭连接 —— TCP 四次挥手

  • 1 客户端打算关闭连接,此时会发送FIN 报文,之后客户端进入FIN_WAIT_1状态。
  • 2 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态。
  • 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
  • 3 等服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
  • 4 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
  • 服务器收到了 ACK 应答报文后,就进入了 CLOSE 状态,至此服务端已经完成连接的关闭。
  • 客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,至此客户端也完成连接的关闭。

还是可以用上面那个通话的例子来进行描述

  • 小明对小红说,我所有的东西都说完了,我要挂电话了。
  • 小红说,收到,我这边还有一些东西没说。
  • 经过若干秒后,小红也说完了,小红说,我说完了,现在可以挂断了
  • 小明收到消息后,又等了若干时间后,挂断了电话。

8、在浏览器中输入url地址 -> 显示主页的过程?

总体来说分为以下几个过程:

  1. DNS解析
  2. TCP连接
  3. 发送HTTP请求
  4. 服务器处理请求并返回HTTP报文
  5. 浏览器解析渲染页面
  6. 连接结束