面试题:说一下 http 报文都有哪些东西?
-
HTTP 是传输超文本(实际上除了 HTML,可以传输任何类型的文件,如视频、音频、文本等)的协议,是一组用于浏览器-服务器之间数据传输的规则。
-
HTTP 位于 OSI 七层模型的顶层(应用层),应用程序可以在其中交换数据。HTTP 是 TCP/ICP 协议族的一部分。
-
HTTPS 是另一种传输协议,这里的 S 表示安全(Secure)。其与 HTTP 的区别在于,消息在传递前会被加密。
-
浏览器和服务器之间通过 HTTP 报文进行通信。浏览器向服务器发送请求报文,服务器返回给浏览器响应报文。解释如下。
一. 请求报文
报文结构
请求报文(request)分为四部分:请求行(request line)、请求头(request headers)、空行(blank line)、请求体(request body)
-
请求行:任何一个 HTTP 请求的第一行都称之为请求行,包含三部分内容:请求方法(method)、请求路径(request url)、HTTP 版本(HTTP version)
-
请求方法:表示浏览器请求对资源要进行的操作。
方法 作用 GET 从服务器请求资源。由于传递的参数直接显示在地址栏中,而浏览器和服务器对 URL 长度有限制,因此 GET 请求不适合传递私密数据和大量数据。 POST 向服务器发送数据。将传递的数据封装在 HTTP 报文的请求体中,可以传输大量数据,同时不会显示在地址栏中。 PUT 更新服务器中的资源。与 POST 类似,但是 PUT 请求指定了资源的存放位置,而 POST 则没有。 DELETE 删除服务器中的资源 HEAD 与 GET 相同,但是响应报文不包含响应体。通常用于获取元数据、检查资源是否存在(验证 URL)、检查资源自上次请求以来是否更改等场景。HEAD 请求因为省去了传输请求体的时间,因此在对应的场景下更加高效。 OPTIONS 浏览器可以使用 OPTIONS 请求来查询服务器在特定资源上允许的 HTTP 方法(如 GET、POST、PUT、DELETE),此时服务端返回的响应报文中包含 Allow
请求头。发送 AJAX 跨域请求访问资源时,浏览器会发送一个 OPTIONS 请求,称之为预检请求,以确保服务器允许该跨域操作,此时服务端返回的响应报文中包含Access-Control-Allow-Origin
、Access-Control-Allow-Methods
、Access-Control-Allow-Headers
、Access-Control-Max-Age
请求头。 -
请求路径:表示要请求的资源的 URL 地址。请求资源的目标地址需要包含:协议、域名或 IP 地址、端口号、请求路径、请求参数(可选)。
-
HTTP 版本:当前正在使用的 HTTP 协议版本。常见版本为 HTTP/1.1 和 HTTP/2,默认使用 HTTP/2。
- HTTP/1.1 使用纯文本格式进行数据传输;而 HTTP/2 使用二进制格式进行数据传输,提高了传输和解析的效率。
- HTTP/1.1 和 HTTP/2 都是基于 TCP 协议;HTTP/1.1 存在队头阻塞问题,同一条 TCP 连接上,必须按顺序发送请求和处理响应;HTTP/2 消除了队头阻塞问题,允许在单个 TCP 连接上同时发送请求和处理响应,从而实现多路复用,提高了并发性。
- HTTP/2 使用 HPACK 算法对头部进行压缩,从而减小头部大小,提高传输效率。
- HTTP/2 支持服务端在客户端请求之前主动推送资源,减少延迟。
- HTTP/2 支持请求的优先级和流量控制,优化了资源的传输顺序和带宽利用率。
-
-
请求头:请求行一结束紧接着就是请求头,提供本次请求的额外信息。可以通过请求头设置浏览器将接收的响应类型等信息。
-
请求头**类似键值对(name: value)**的形式。值的取值和结构由请求头决定。
-
请求头不分大小写。
-
每个请求头占据一行。
常用请求头 作用 User-Agent 发送请求的浏览器类型 Accept 浏览器可识别的响应数据类型列表 Accept-Language 浏览器可接受的自然语言 Accept-Encoding 浏览器可接受的编码压缩格式 Accept-Charset 浏览器可接受的编码字符集 Host 接收请求的主机名 Connection 浏览器和服务器的连接方式(close 或 keepalive) Cookie 存储于客户端的字段,通常向同一域名的服务端发送属于当前域名的 Cookie Content-Type 浏览器发送的请求体的数据类型 -
-
空行:请求头后边是一个空行,用于标识请求头部分的结束。
-
请求体:可选的。一般来说,POST 和 PUT 请求的请求报文中才会包含请求体,其中包含要向服务器发送的数据(如表单输入或文件上传)。
服务器收到请求报文后,对其进行处理,然后向浏览器发送一个响应报文。与请求报文类似,响应报文包含响应行(可以用于标识请求是否成功等)、响应头(设置响应元信息)、空行和响应体(包含请求的资源或提示信息)。
二. 响应报文
报文结构
响应报文(response)也分为四部分:状态行(status line)、响应头(response headers)、空行(blank line)、响应体(response body)
-
状态行:任何一个 HTTP 响应的第一行都称之为状态行,包含三部分内容:HTTP 版本(HTTP version)、状态码(status code)、状态描述(status text)
-
HTTP 版本:当前正在使用的 HTTP 协议版本。
-
状态码:表示请求状态的 3 位数字。其中第一个数字表示响应类别。
状态码 状态描述 含义 1 x x \bf{\Large{1xx}} 1xx 信息性状态码。 表示请求已接收,继续处理。 100
Continue 表示客户端应该继续请求或忽略此状态码。 101
Switching Protocols 表示服务端正在根据客户端的请求切换协议。 2 x x \bf{\Large{2xx}} 2xx 成功状态码。 表示请求已接收、理解和处理。 200
OK 表示请求成功,服务器已返回所请求的资源。 201
Created 表示请求成功,并导致了一个新资源的创建。 202
Accepted 表示请求已接收,但是尚未处理完成。 204
No Content 表示请求成功,但没有内容返回。该状态码常用于 DELETE 操作。 3 x x \bf{\Large{3xx}} 3xx 重定向状态码。 表示需要客户端采取进一步操作。 301
Moved Permanently 表示请求的资源已永久移动到新的位置,客户端需要使用新 URL 进行访问。 302
Found 表示请求的资源临时搬到新的位置,客户端应继续使用原 URL 进行请求。 303
See Other 表示请求的资源临时搬到新的位置,客户端应继续使用原 URL + GET 方法进行请求。 304
Not Modified 表示资源未修改,可以使用缓存版本。客户端在请求文件时,如果发现存在的缓存文件中有 Last Modified 时间标识,则向浏览器发送请求时在请求头中包含 If-Modified-Since。如果客户端发现自从 Last Modified 对应资源未改变,则返回 304,表示可以使用缓存文件,否则返回 200。 4 x x \bf{\Large{4xx}} 4xx 客户端错误状态码。 表示客户端出现了错误。 400
Bad Request 表示客户端请求存在语法错误 401
Unauthorized 表示请求未授权。 403
Forbidden 表示服务端拒绝请求。 404
Not Found 表示请求的资源不存在。这可能是因为客户端输入了错误的 URL。 405
Methods Not Allowed 表示请求方法对资源不适用。这可能是因为使用 GET 请求一个只能 POST 的资源。 5 x x \bf{\Large{5xx}} 5xx 服务器错误状态码。 表示服务器在处理请求时发生了内部错误。 500
Internal Server Error 表示服务器内部错误,无法完成请求。 501
Not Implemented 表示服务器不支持请求的方法。 502
Bad Gateway 表示网关或代理服务器从上游服务器中接受到无效响应。 503
Service Unavailable 表示服务器暂时过载或维护,无法处理请求。 504
Gateway Timeout 表示网关或代理服务器未及时从上游服务器中接受到响应。 -
状态描述:对状态码简短、可读的描述。
-
-
响应头:与请求头类似,提供本次响应的额外信息。
-
空行:与请求报文的空行类似,标识响应头的结束。
-
响应体:包含浏览器请求的资源(HTML、JSON、图片等)。
REFERENCES
https://medium.com/@adilrk/http-request-and-response-e7da8eb3a00c
https://juejin.cn/post/6931636106710482958