自学内容网 自学内容网

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)

原文地址:https://blog.csdn.net/zhaohongfei_358/article/details/136947760

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!