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协议,流程图如下:
该流程图中包含了三大部分:
- 服务端申请CA证书(人工操作,到权威机构网站进行申请)。
- 客户端与服务端首次建立连接,验证证书、交换密钥。(通常首次建立连接时进行一次)
- 使用密钥对数据进行加密传输。
通过上述流程,让黑客无漏洞可钻,保证了数据几乎绝对安全。
对于每个小步骤的对安全的作用:文章来源:https://www.toymoban.com/news/detail-856488.html
- 步骤1,2,3: 服务端生成公钥和私钥。然后将公钥上传给CA机构进行生成证书。
- 安全性说明:由于私钥是服务端生成的,并且从未出现在互联网上,因此绝对安全。注意:私钥不是也不能由CA机构生成,否则私钥就会存在于互联网上,没办法保证安全性。
- 步骤4,5,6,7:客户端首次建立连接,获取服务端的CA证书,并进行验证。
- 安全性说明:客户端会访问CA机构来验证证书的合法性,确保了客户端收到的公钥确实是由服务端给的,而不是中间黑客篡改的。假设客户端不验证,那么黑客就可以拦截公钥,然后将假公钥给客户端,这样就可以解密客户端的报文,篡改后,用真公钥加密。
-
证书有问题:客户端(一般指浏览器)去CA机构验证公钥后发现有问题,浏览器就会弹出警告(证书过期、证书无效等),也就是用户常见的这个页面
不过用户也可以选择忽略警告,继续访问,但这就不能保证安全性了。
- 步骤8,9,10:客户端生成“对称加密的密钥”(对称密钥),将其使用公钥加密后,发送给服务端,服务端解密获取该对称密钥。
- 安全性说明:客户端生成的对称密钥经过加密,只有服务端的私钥可以解密,确保只有客户端和服务端两者知道对称密钥内容。
- 为什么要用对称密钥:① 对称加密速度快。HTTP报文内容大,用非对称加密速度太慢。② 非对称加密只能保证“客户端->服务端”这条链路的安全性。若服务端用私钥加密,那么客户端和黑客的公钥都可以解密,报文会被篡改。
- 步骤11-16:客户端与服务端使用对称密钥对请求和响应报文进行加解密。
- 安全性说明:前面交换密钥时,保证了对称密钥只有客户端和服务端知道,因此用该密钥对数据进行加解密是安全的。
整个交互过程就是SSL/TLS协议文章来源地址https://www.toymoban.com/news/detail-856488.html
参考资料
- HTTP权威指南(David Gourley)
到了这里,关于HTTP快速面试笔记(速成版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!