HTTP快速面试笔记(速成版)

1. HTTP概述

1.1 HTTP简介

HTTP(Hyper Text Transfer Protocol)是超文本传输协议,是一种基于TCP协议的可靠的数据传输协议。用于客户端与服务端进行资源传输,例如:HTML文件、图片、数据等。

一个HTTP请求通常由客户端发起,服务端响应

一个HTTP请求包含请求和响应两个部分。

请求包含如下部分:

  • 统一资源定位符(URL):描述服务器上某资源的特定位置,也就是客户端要从哪个地方获取资源。例如:http://www.baidu.com/XXX.js
  • HTTP方法(HTTP Method):描述客户端请求的动作类型。常用的有:GET(获取)、POST(修改)、PUT(增添)、DELETE(删除)
  • 请求头(Request Headers):对请求的一些额外说明。例如:客户端信息、cookie等。
  • 请求体(Request Body):包含客户端发送给服务器的数据,通常在POST、PUT等方法中使用。例如,表单数据、JSON数据等。

响应包括如下部分:

  • 响应状态码(Response Code):描述服务器对客户端请求的响应结果。例如:200为OK、302为重定向等。
  • 响应头(Response Headers):包含服务器对请求的响应的附加信息,如服务器类型、日期等。
  • 响应体(Response Body):包含服务器返回给客户端的数据,通常是请求的资源内容,如HTML页面、图片、JSON数据等。

1.2 HTTP的版本

HTTP经过长期发展,目前使用较多的版本如下:

  • HTTP/1.1:目前是最广泛使用的版本之一。它引入了持久连接、管道化(Pipelining)等特性,以提高性能和效率。
  • HTTP/2.0:是HTTP/1.1的后续版本。它引入了诸如多路复用、头部压缩、服务器推送等新特性,以提高性能和安全性。

1.3 URL语法简介

URL是用来定位你要找的资源所在的位置。格式为:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

  • scheme:访问方案,即使用哪种方式访问资源。例如:http、https、ftp、ssh等
  • user:password:若访问的资源需要权限校验,则需要给出账号密码。一般ssh常用。http基本不用,可以忽略。
  • host:port:要访问资源的IP和端口。当使用http访问可以不填,浏览器自动使用默认端口,http为默认端口为80,https为443。
  • path:路径信息,即告诉服务端我要请求的资源路径(可以类比为“哪个目录下的哪个文件”)。例如:/seasonal/index-fall.html
  • params:参数。url的路径部分,每段都是可以加参数的,参数使用;分隔。例如:http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true
  • query:查询字符串,通常用作参数。格式为?<key1>=<value1>&<key2>=<value2>。例如:http://www.XX.com/inventory.cgi?item=12731&color=blue
  • frag:片段,用于对资源文件进一步划分,指向其中的一个片段,常见于HTML。例如:www.csdn.com/index/12312312#第三章,当点击这个链接后,会直接跳转到第三章。

示例:

https://github.com/gaopu/Java?tab=readme-ov-file#为什么很多份不相关的代码放在一个代码库

该URL表示:① 使用https进行请求;② 访问github.com这个网站;③ 请求/gaopu/Java这个资源;④ 参数为tab=readme-ov-file;⑤ 进入后直接跳转到为...库这个章节

2. HTTP报文

2.1 HTTP报文格式

HTTP报文分为请求报文响应报文

请求报文的格式如下:

<method> <request-URL> <version>  # 起始行
---
<headers>  # 请求头(也称为首部)
---
<entity-body>  # 请求体

例如:

GET /specials/saw-blade.git HTTP/1.1
---
Content-type: text/plain
Content-length: 19
---

响应报文的格式如下:

<version> <status> <reason-phrase>  # 起始行
---
<headers>  # 请求头(也称为首部)
---
<entity-body>  # 请求体

例如:

HTTP/1.1 200 OK
---
Content-type: text/plain
Content-length: 19
---
  • method:请求方法,例如:GET、POST等
  • request-URL:请求的URL,例如:/specials/saw-blade.git
  • version:http版本。例如:HTTP/1.1
  • headers:请求头。键值对形式
  • entity-body:请求体。不同的请求方式有不同的请求体。
  • status:响应码,表示服务器处理的结果。例如:200表示成功,500表示报错。注意:通常业务代码都会返回200,然后通过内部编码来区分错误。
  • reason-phrase:原因短语,一个简单的短语来描述处理的结果。例如:“OK”,“Internal Server Error”

2.2 HTTP的方法(Method)

HTTP的常用的请求方法(method)包括如下(按常用程度排序):

  • GET从服务器获取资源。例如:获取HTML、JS等都是GET请求。特点:① GET请求一般不使用消息体(request body),参数使用?<key>=value形式写在url上;② 可以通过直接点击URL触发GET请求
  • POST向服务器提交数据,通常用于创建资源或提交表单数据。特点:① 请求的数据放在消息体中
  • PUT向服务器上传更新资源,通常用于更新资源。特点:
  • DELETE请求服务器删除指定的资源
  • HEAD:类似于GET请求,但服务器只返回头部信息,不返回实际内容。通常用于检查资源是否存在或已更改,以及获取资源的元数据,而不需要获取整个资源的内容。例如:可以使用HEAD请求仅获取图片的元数据,看看修改日期是否改变,如果改变了,就重新使用GET请求获取一张最新的图片。
  • OPTION获取目标资源支持的通信选项。一般用于跨域检测:当浏览器向服务器发送跨域请求时,会先发送一个OPTIONS请求,以确定服务器是否允许跨域请求。(浏览器的自发行为)

2.3 HTTP响应码

HTTP的响应中的响应码用于告诉客户端处理的结果。

响应码的分为5个大类:

  • 100+信息提示(Informational)。一般用于协议转换,例如HTTP协议转为WebSocket协议。
  • 200+成功(Success)。服务端处理请求成功
  • 300+重定向(Redirection)。服务器表示,你请求的资源不在我这,给你个地址,去那找。
  • 400+客户端错误(Client Error)。客户端请求的参数有误,服务端处理不了。
  • 500+服务器错误(Server Error)。客户端请求的参数没问题,但服务端报错了。

响应码的每个大类有对应了许多小类,常用的响应码有:

响应码 含义 解释 常见场景
101 协议转换(Switching Protocols) 服务端告知需要进行协议转换,如将HTTP协议转为WebSocket协议 与服务器建立WebSocket连接
200 处理成功(OK) 成功处理用户请求 服务端正确接收并处理请求
201 创建成功(Created) 成功处理用户的“增添数据”的请求 上传文件,表单提交等
204 无内容(No Content) 成功处理请求,但无需返回任何数据 删除请求,无需返回值的请求
301 永久重定向(Moved Permanently) 请求的资源永久的被移动到了另一个URL上
(慎用,因为该行为会被浏览器缓存)
请求已迁移的老资源
302 临时重定向(Moved Temporarily) 请求的资源被临时移动到了另一个URL上 请求暂时迁移走的资源
304 资源未修改(Not Modified) 客户端向服务端验证资源是否被修改,若没修改,则服务端返回304,客户端可以继续使用缓存 客户端对缓存的资源进行验证
400 错误请求(Bad Request) 客户端的请求有误 必填参数缺失
403 请求禁止(Forbidden) 服务端拒绝处理客户端请求 客户端权限不足
404 页面不存在(Not Found) 客户端请求的页面或资源不存在 url写错了
405 方法不允许(Method Not Allowed) 客户端使用的方法(GET、POST等)不被允许 请求方法用错了
500 服务器内部错误(Internal Server Error) 服务器处理请求的时候报错了 代码报错
502 网关错误(Bad Gateway) 网关报错。请求没有到达服务器,直接在网关就被拦截了 被网关限流
503 服务不可用(Service Unavailbale) 服务器暂时无法处理请求 服务器挂了

通常HTTP的响应码规范是通用框架来遵循,例如Spring MVC、Nginx等。而业务项目通常都是全部返回200,在此基础上指定与业务相关的code。

2.4 HTTP请求头与响应头

HTTP的请求头(Request headers)和响应头(Response Headers)用于提供一些请求或响应的额外信息。请求头和响应头的格式为:<key>:<value>

常见的请求头有:

  • Host:服务端的域名。例如:你请求的是“http://www.baidu.com/XXX”,那么Host就是www.baidu.com
  • User-Agent:客户端信息。一般包括:操作系统、浏览器版本等
  • Accept:客户端可以接收的响应类型。格式:<type>; q=<weight>。例如:Accept: application/json, text/javascript, */*; q=0.01 表示客户端可以接收json、js和任意类型,但任意类型的权重为0.01(不填默认为1),即尽量不要传任意类型。
  • Accept-Language:客户端可以接收的语言类型。格式:<type>; q=<weight>
  • Accept-Encoding:客户端可以接受的压缩类型。例如:Accept-Encoding:gzip, deflate, br,表示客户端可以接收这三种压缩类型,服务端可以根据该请求头对响应进行压缩。
  • Connection:在该请求后,是否要关闭连接。有两种取值:① Keep-alive:保持TCP连接,因为后续马上还会有新请求(可以在后面增加; timeout=XX来指定超时时间);② Close:关闭TCP连接,暂时不会再请求了。
  • Referer:指定请求来源URL。例如:当前URL为https://www.abc.com/ehf,然后该页面请求了一个https://www.xxx.com/xxx,那么该请求中的Referer就是https://www.abc.com/ehf。服务端可以根据这个字段来判断是不是自己的网站请求自己,若不是,就拒绝。
  • Cookie:将服务端设置到浏览器中的cookie重新传过去,用于存储session和跟踪用户行为。
  • Content-Type:请求体的格式。通常有:① :GET请求一般没有该请求头。② application/json:当请求体为json格式时,用这个。③ multipart/form-data:请求体是表单。

上述这些请求头都是规定的。用户也可以定义自己的请求头

常见的响应头有:

  • Date:服务端“生成响应的时间”
  • Server:处理响应的服务器版本。注意:一般不使用,要不然黑客容易根据你的服务器版本,利用漏洞攻击你。
  • Content-Type:响应体的类型。对于响应的该字段来说,取值比较丰富。常见的有:text/css; charset=utf-8,application/json, image/gif等等。若类型是文件,则后面建议增加; charset=utf-8来指定告知文件的编码
  • Content-Lenght:响应体的字节长度。
  • Cache-Control:告诉客户端如何对响应进行缓存。常见的有:① no-store:不要缓存;② no-cache:可以缓存,但在使用前要向服务端验证是否过期。即正常发送请求,若没过期,服务端会返回304(Not Modified),否则会返回新的资源。③ max-age=<seconds>:缓存,但最多缓存多少秒。
  • Expires:指定资源的过期时间,客户端根据该时间来判断是否要缓存资源。
  • Set-Cookie:告知客户端要设置哪些cookie。例如:Set-Cookie: key1=value1; key2=value2,则浏览器就会记录这两个cookie,下次请求时带上。

3. HTTPS详解

3.1 HTTPS介绍

HTTPS是HTTP的安全版本,S为Secure,即对HTTP报文内容加密,来保证HTTP请求的安全性。

不加密的HTTP的安全问题:一个HTTP请求在客户端与服务端之间要经过无数的路由器对其进行转发,中间可能会存在恶意的路由器获取报文内容甚至篡改。例如:你使用酒店的wifi登录了某网站,若该网站使用HTTP,那么酒店的路由器就有可能会获取你的登录密码。

HTTPS就是使用SSL/TLS协议(3.3详解)来加密数据包,保证报文的安全性。

3.2 与HTTPS相关的加解密知识

加密技术可以分为两个大类:

  • 对称加密(Symmetrical Encryption):加解密双方使用同一个密钥。
    • 特点:① 速度快,一般用于对较大的数据进行加密。② 不够安全,密钥一但泄露,加解密双方都裸奔。因此必须保证交换密钥是安全的。
    • 常见算法:DES,3DES,AES等
  • 非对称加密:加解密双方持有不同的密钥。加密方持有公钥,解密方持有私钥。对于公钥加密的内容,只有使用私钥可以解密。通常解密方生成公钥和私钥,私钥自己留着,公钥发给加密方。HTTPS中,服务端持有私钥,客户端持有公钥,这样客户端加密的内容只有服务端可以解密。
    • 特点:① 速度慢,一般用于对对称加密的密钥进行加密;② 安全,由于私钥自己持有,不会在网络上传输,因此泄露风险低。
    • 常见算法:RSA、DSA、ECC

3.3 HTTPS交互流程

HTTPS的交互流程遵循SSL/TLS协议,流程图如下:

在这里插入图片描述

该流程图中包含了三大部分:

  1. 服务端申请CA证书(人工操作,到权威机构网站进行申请)。
  2. 客户端与服务端首次建立连接,验证证书、交换密钥。(通常首次建立连接时进行一次)
  3. 使用密钥对数据进行加密传输。

通过上述流程,让黑客无漏洞可钻,保证了数据几乎绝对安全。

对于每个小步骤的对安全的作用:

  • 步骤1,2,3: 服务端生成公钥和私钥。然后将公钥上传给CA机构进行生成证书。
    • 安全性说明:由于私钥是服务端生成的,并且从未出现在互联网上,因此绝对安全。注意:私钥不是也不能由CA机构生成,否则私钥就会存在于互联网上,没办法保证安全性。
  • 步骤4,5,6,7:客户端首次建立连接,获取服务端的CA证书,并进行验证。
    • 安全性说明:客户端会访问CA机构来验证证书的合法性,确保了客户端收到的公钥确实是由服务端给的,而不是中间黑客篡改的。假设客户端不验证,那么黑客就可以拦截公钥,然后将假公钥给客户端,这样就可以解密客户端的报文,篡改后,用真公钥加密。
    • 证书有问题:客户端(一般指浏览器)去CA机构验证公钥后发现有问题,浏览器就会弹出警告(证书过期、证书无效等),也就是用户常见的这个页面在这里插入图片描述
      不过用户也可以选择忽略警告,继续访问,但这就不能保证安全性了。
  • 步骤8,9,10:客户端生成“对称加密的密钥”(对称密钥),将其使用公钥加密后,发送给服务端,服务端解密获取该对称密钥。
    • 安全性说明:客户端生成的对称密钥经过加密,只有服务端的私钥可以解密,确保只有客户端和服务端两者知道对称密钥内容。
    • 为什么要用对称密钥:① 对称加密速度快。HTTP报文内容大,用非对称加密速度太慢。② 非对称加密只能保证“客户端->服务端”这条链路的安全性。若服务端用私钥加密,那么客户端和黑客的公钥都可以解密,报文会被篡改。
  • 步骤11-16:客户端与服务端使用对称密钥对请求和响应报文进行加解密。
    • 安全性说明:前面交换密钥时,保证了对称密钥只有客户端和服务端知道,因此用该密钥对数据进行加解密是安全的。

整个交互过程就是SSL/TLS协议



参考资料

  • HTTP权威指南(David Gourley)

相关推荐

  1. Redis基础应用篇-快速面试笔记速成

    2024-04-13 07:04:05       95 阅读
  2. http笔记

    2024-04-13 07:04:05       50 阅读
  3. Mysql基础进阶速成

    2024-04-13 07:04:05       33 阅读
  4. HTTPS面试

    2024-04-13 07:04:05       63 阅读
  5. HTTP面试

    2024-04-13 07:04:05       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-13 07:04:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-13 07:04:05       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-13 07:04:05       82 阅读
  4. Python语言-面向对象

    2024-04-13 07:04:05       91 阅读

热门阅读

  1. Jetpack Compose 阻尼动画效果之SplineBasedDecay

    2024-04-13 07:04:05       35 阅读
  2. 加密行业4大新趋势:Restaking、Layer3、AI、DePin

    2024-04-13 07:04:05       44 阅读
  3. 牛客挑战赛74(A,B,C,D)

    2024-04-13 07:04:05       122 阅读
  4. 【排序思想掌握】

    2024-04-13 07:04:05       42 阅读
  5. leetcode刷题记录 day21

    2024-04-13 07:04:05       146 阅读
  6. Qt - 获取系统当前时间

    2024-04-13 07:04:05       36 阅读