网页讲义(一)

NBAL

本文章暂未完成,不保证文章的准确性。不建议您作为参考或进行转载。

这篇文章最后更新于 天前,文中描述的信息可能已经过时,请多加查证后再作参考。

前置问题

我这次在给大家讲什么?
HTTP(1.1 版本)的协议中一些最简单和最宏观的概念。(HTTP/1.1 是现存的几个 HTTP 版本中最基础而最为容易理解的。同时,HTTP/2 应该在学会 HTTP/1.1 的基础上学习,HTTP/3 应该在学会 HTTP/2 和一些其它网络知识的基础上学习)

HTTP 协议在日常生活中有哪些用途?
HTTP 在日常生活中一个最常见的例子是浏览网页,我们在浏览器的 URL(链接)最前面的 http:// 或者 https:// 就代表我们在使用 HTTP 协议向对应的网站服务器下载网页。同时,许多应用程序也在使用 HTTP 协议和服务器进行通讯。

我们学这些东西在之后的学习中起到了什么样的作用?
HTTP 协议是学习网络安全 Web 方向的基础中的基础。学习 Web 方向不一定需要对 HTTP 协议有多深的了解,但是开始学习 Web 方向必须对 HTTP 协议有所了解。

HTTP 请求的大致流程

为了便于讲解,这里仅考虑最简单的用户代理 - 服务器直接连接的情况(一个最常见的用户代理就是我们用的各种浏览器,在这里可以直接理解成浏览器)。

HTTP/1.1 基于 TCP 协议进行通讯,在建立 TCP 连接后,用户代理会向服务器发送 HTTP 请求,服务器收到并处理完毕请求后会返回 HTTP 响应并视情况断开连接。在这里,我们可以简单地理解为一次 HTTP 通讯包含一次 HTTP 请求和一次 HTTP 响应。

HTTP 请求内容

HTTP 请求报文的开头是由 ASCII 编码的一段内容,先放一个简单的 HTTP GET 请求报文作为示例:

1
2
3
4
5
6
GET /robots.txt HTTP/1.1
Host: henrize.kim
User-Agent: Mozilla/5.0 (Windows NT 10; Win64; x64) Gecko/20100101 Firefox/80.0
Accept: text/html
Accept-Encoding: gzip, deflate
Connection: close

首先来看 HTTP 的头信息,即请求报文的第一行。HTTP 请求报文的头信息是由请求命令和 HTTP 协议版本组成。上面的例子中,HTTP 的请求命令是 GET /robots.txt,表示使用请求方法 GET 请求服务器的 /robots.txt 的文件内容。HTTP 协议版本是 HTTP/1.1 表示这个请求使用的是 HTTP 1.1 版本。

HTTP 请求报文头信息下面的内容是 HTTP 头,使用了键值对的形式呈现了一些描述请求的信息。比如例子中的 Host: henrize.kim 表示 HTTP 请求中的 Host 头的内容是 henrize.kim

HTTP 响应内容

HTTP 响应报文是由 ASCII 编码的一段内容,先放一个简单的 HTTP 响应报文作为示例:

1
2
3
4
5
6
7
8
9
10
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Fri, 21 Oct 2022 12:00:00 GMT
Server: Vercel
Content-Length: 44

User-agent: *

Allow: /
Disallow: /archives/

HTTP 响应报文的头信息是由 HTTP 协议版本、状态码和状态码的简单描述组成的。上面的例子中,HTTP 协议版本是 HTTP/1.1 ,状态码是 200 ,状态码的简单描述是 OK

同理,HTTP 头信息后,空行前的内容就是 HTTP 头,这一部分和 HTTP 请求报文一致。在空行之后就是 HTTP 的响应体(既你之前请求的信息),HTTP 响应体和请求体不要求使用 ASCII 编码。

HTTP 常见请求方法

HTTP 定义了一组请求方法,表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作。以下是一些常见的请求方法:

GET:请求一个指定资源,使用 GET 的请求应该只被用于获取数据。

POST:将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用。

HEAD:请求资源的头部信息,并且这些头部与 HTTP GET 方法请求时返回的一致。

PUT:请求有效载荷替换目标资源的所有当前的内容。

* 本段内容部分摘抄自 MDN Web Docs

HTTP 状态码

HTTP 响应状态码用来表明特定 HTTP 请求是否成功完成。响应状态码被归为以下五大类:

状态码范围 表示内容
信息响应 100 - 199
成功响应 200 - 299
重定向消息 300 - 399
客户端错误响应 400 - 499
服务端错误响应 500 - 599

一些比较常见(著名)的响应码:

200 OK 最常见的响应码,表明请求已经成功。

400 Bad Request 表示由于语法无效,服务器无法理解该请求。客户端不应该在未经修改的情况下重复此请求。

404 Not Found 表示服务器无法找到所请求的资源。

500 Internal Server Error 表示服务端错误,意味着所请求的服务器遇到意外的情况并阻止其执行请求。

502 Bad Gateway 表示作为网关或代理的服务器,从上游服务器中接收到的响应是无效的。

* 本段内容部分摘抄自 MDN Web Docs

HTTP 请求头

Host 请求头指明了请求将要发送到的服务器主机名和端口号。如果没有包含端口号,会自动使用被请求服务的默认端口(HTTPS 使用 443 端口,HTTP 使用 80 端口)。一般情况下,所有 HTTP/1.1 请求报文中必须包含一个 Host 头字段。

User-Agent 请求头包含了一个特征字符串,用于识别发起请求的用户代理的应用类型、操作系统、软件开发商以及版本号。

Accept 请求头用来告知(服务器)客户端可以处理的内容类型,这种内容类型用 MIME 类型 来表示。服务器可以从诸多备选项中选择一项进行应用,并使用 Content-Type 应答头通知客户端它的选择。

* 更多以 Accept- 开头的请求头,请参见 内容协商机制

Connection 请求头决定当前的事务完成后,是否会关闭网络连接。如果该值是 keep-alive ,TCP 连接不会立刻关闭,使得对同一个域名的请求可以继续在该连接上完成。

* 本段内容部分摘抄自 MDN Web Docs

HTTP 响应头

Content-Type 响应头用于标记客户端实际返回的内容的内容类型,这种内容类型用 MIME 类型 来表示。

Date 响应头表示响应报文创建的日期和时间。

Server 响应头包含了处理请求的服务器所用到的软件的相关信息。

Content-Length 响应头用来指明发送给接收方的响应体的大小,用十进制数字表示的八位字节的数目。

* 本段内容部分摘抄自 MDN Web Docs

参考文章

HTTP 协议入门 - 阮一峰的网络日志

本文作者:Henrize Kim

文章链接: https://henrize.kim/article/9c916874eb21/

本文使用 CC BY-NC-SA 3.0 协议进行许可,使用时请注意遵守协议。