面试题:说一下 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
发表评论