网络应用层HTTP协议
1. HTTP协议介绍
在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML 文档)。
HTTP 协议是客户端与服务器之间通信的基础。客户端通过 HTTP 协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP 协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。
在访问网页时,要获得一个完整的网页,浏览器先要得到 html,根据 html 的标签,检测处我们还要获取其他资源,浏览器会继续发起http 请求。
2. HTTP与TCP关系
虽然说HTTP协议是一个无连接、无状态的协议,但是 HTTP 协议是基于 TCP 的协议。HTTP 本事是一个应用层协议,它的通信是基于请求-响应的模型。当客户端(如浏览器)向服务器发送请求,服务器处理请求并返回响应后,这次通信的连接就结束了。在 HTTP/1.0 和早期的HTTP/1.1实现中,每次请求-响应都会建立和关闭一次TCP连接,HTTP协议在处理请求和响应完成后不保留通信连接。
现代版本的 HTTP/1.1 引入了持久连接(Persistent Connection),允许一个TCP连接进行多次请求-响应。
HTTP/2 引入了多路复用(Multiplexing) 在 HTTP/1.1 持久连接的基础上允许在同一个TCP连接上并发地处理多个请求和响应。
HTTP 的 “无连接” 无状态”和 TCP 并不矛盾,HTTP是一个应用层协议,它运行在 TCP(传输层协议)之上,TCP 负责底层的可靠传输和数据完整性,而HTTP作为应用层协议在TCP的基础上进行数据传输。 HTTP 的 “无连接” 只是在应用层的通信上指的是每个请求独立于连接,而不是指 TCP 连接本身。每个 HTTP 请求可能会复用或重新建立新的 TCP 连接,但HTTP自身不维护这种连接状态。
3. URL
平时我们说的 “网址” 就是 URL。URL 前半部分表示唯一的一台主机,后面表示该主机上的唯一的文件资源,即能表示互联网中唯一的一个文件资源。所以URL称为统一资源定位符(Uniform Resource Locator;URL)
注意:在实际显示的 URL 中,可能不会包含这么多完整信息。
服务器地址(即域名)其实就是 IP 地址,域名在客户端的应用自动转换成 IP 地址,称为 DNS(地址转换)。所以在 URL 中域名并不是 “点分十进制” 的IP地址。
服务器端口号在 URL 中是必须的,但实际的 URL 中常常不显示。原因是协议名称和端口号是强关联的,协议所使用的端口号总是固定的,所以端口号在 URL 中可能默认被忽略了,当浏览器发起请求时,会默认拼接端口号。
3.1 URL特殊符号含义
URL 定义了一部分特殊字符的含义和用法:
特殊符号 | 含义 |
---|---|
+ | 表示空格(URL中不能使用规格的空格) |
/ | 分隔目录和子目录 |
? | 分隔实际的URL和参数 |
# | 表示书签 |
& | 表示URL中参数间的分隔符 |
= | 表示URL中指定参数的值 |
3.2 urlencode和urldecode
URL 定义了一部分特殊字符的含义和用法,但在浏览器搜索中的一些字符可能是 URL 的特殊字符。这些特殊字符作为搜索的文本之一时,需要经过转义才能在 URL 中显示,称为 urlencode。urlencode 的逆过程便称为 urldecode。
转义规则如下:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
urlencode转码网站
4. HTTP协议请求与相应格式
HTTP 的请求包含很多内容,协议对其格式进行了规定:
5. HTTP的方法
方法 | 说明 | 支持的HTTP版本 |
---|---|---|
GET | 获取资源 | 1.1、1.0 |
POST | 传输实体主体 | 1.1、1.0 |
PUT | 传输文件 | 1.1、1.0 |
HEAD | 获取报文首部 | 1.1、1.0 |
DELETE | 删除文件 | 1.1、1.0 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追钟路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
其中使用频率最高的是GET方法和POST方法
5.1 GET方法
GET方法用于请求URL指定的资源,指定资源经服务器端解析后返回响应内容。GET一般用来获取静态资源,也可以通过ur向服务器传递参数。
5.2 POST方法
POST方法用于传输实体的主体,通常用于提交表单数据。POST方法可以发送大量的数据给服务器,并且数据包含在请求之中。POST可以通过httprequest的正文来进行参数传递。
5.3 PUT方法
PUT方法用于传输文件,将请求报文主体中的文件保存到请求URL指定的位置。但不太常用,但在某些情况下,如RESTful API 中,用于更新资源。
5…4 HEAD方法
HEAD方法与GET方法类似,但不返回报文主体部分,仅返回响应头。 HEAD方法主要用于确认URL的有效性及资源更新的日期时间等。
5.5 DELETE方法
DELETE用于删除文件,是 PUT 的相反方法。按请求URL删除指定的资源。
5.6 OPTIONS方法
OPTIONS用于查询针对请求 URL 指定的资源支持的方法,会返回允许的方法,如GET、POST等。
6. HTTP状态码
HTTP状态码是用以表示网页服务器超文本传输协议响应状态的3位数字代码。
已定义范围 | 类别 | 原因短语 | |
---|---|---|---|
1xx | 100-101 | Information(信息性状态码) | 接收的请求正在处理 |
2xx | 200-206 | Success(成功状态码) | 请求正常处理完毕 |
3xx | 300-305 | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4xx | 400-415 | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5xx | 500-505 | Server Error(服务器错误状态码) | 服务器处理请求出错 |
最常见的状态码有:200(OK),404(Not Found),403(Forbidden),302(Redirect),504(Bad Gateway)
6.1 部分状态码详解
6.2 1xx
状态码 | 含义 | 应用示例 |
---|---|---|
100 | Continue | 上传大文件时,服务器告诉客户端可以继续上传 |
6.3 2xx
状态码 | 含义 | 应用示例 |
---|---|---|
200 | OK | 访问网站首页,服务器返回网页内容 |
201 | Created | 发布新文章,服务器返回文章创建成功的信息 |
204 | No Content | 删除文章后,服务器返回“无内容”表示操作成功 |
6.4 3xx
状态码 | 含义 | 应用示例 |
---|---|---|
301 | Moved Permantly | 网站换域名后,自动跳转到新域名;搜索引擎更新网站链接时使用 |
302 | Found或See Other | 用户登录成功后,重定向到用户首页 |
304 | Not Modified | 浏览器缓存机制,对未修改的资源返回304状态码 |
6.5 4xx
状态码 | 含义 | 应用示例 |
---|---|---|
400 | Bad Request | 填写表单时,格式不正确导致提交失败 |
401 | Unauthorized | 访问需要登录的页面时,未登录或认证失败 |
403 | Forbidden | 尝试访问你没有权限查看的页面 |
404 | Not Found | 访问不存在的网页链接 |
6.6 5xx
状态码 | 含义 | 应用示例 |
---|---|---|
500 | Internal Server Error | 服务器崩溃或数据库错误导致页面无法加载 |
502 | Bad Gateway | 使用代理服务器时,代理服务器无法从上游服务器获取有效响应 |
503 | Service Unavailable | 服务器维护或过载,暂时无法处理请求 |
6.7 永久重定向与临时重定向
我们在访问网页,访问一些受限制的视频、文章时,需要我们登录账号或充值会员。这时网页就会把目标网页(视频或文章)重定向到登录界面或充值界面,或在登录、充值成功后将网页重定向到先前的网页或用户首页,这就是临时重定向。
当一些网页的域名或IP发生改变后,用户一般不能马上更改访问网页用的域名,这时浏览器或搜索引擎会自动对新域名与旧域名进行绑定,用户访问旧域名会自动跳转到新域名,这就是永久重定向。
重定向有关状态码:
状态码 | 含义 | 重定向类型 | 应用示例 |
---|---|---|---|
301 | Moved Permantly | 永久重定向 | 网站换域名后,自动跳转到新域名;搜索引擎更新网站链接时使用 |
302 | Found或See Other | 临时重定向 | 用户登录成功后,重定向到用户首页 |
307 | Temporary Redirect | 临时重定向 | 临时重定向资源到新的位置(较少使用) |
308 | Permanent Redirect | 永久重定向 | 永久重定向资源到新的位置(较少使用) |
HTTP状态码301(永久重定向)和302(临时重定向) 都依赖 Location 选项。
对于301(永久重定向):
当服务器返回301状态码时,表示请求的资源已经永久移动到新的位置。在这种情况下,服务器会在响应中添加一个 Location 头部,用于指定资源的新位置。这个 Location 头部包含了新的 URL 地址,浏览器会自动重定向到该地址。
可能会在HTTP响应中看到以下信息:
HTTP/1.1 301 Moved Permanently\r\n Location: https://www.new-url.com\r\n
对于302(临时重定向):
当服务器返回302状态码时,表示请求的资源临时被移动到新的位置。同样,服务器会在响应中添加一个Location头部,来指定资源的新位置。浏览器会暂时使用新的URL进行后续的请求,但不会缓存这个重定向。
可能在HTTP响应中看到以下信息:
HTTP/1.1 302 Found\r\n Location: https://www.new-url.com\r\n
无论是 HTTP301 还是HTTP 302,重定向都需要依赖Location选项来指定资源的新位置。这个Location选项是一个标准的HTTP响应头部,用于告诉浏览器应该将请求重定向到哪个新的URL地址。
7. HTTP Header
Header | 内容 |
---|---|
Content-Type: | 数据类型(text/html)等 |
Content-Length: | body的长度 |
Host: | 客户端告知服务器,所请求的资源是在哪个主机的哪个端口上 |
User-Agent: | 声明用户的操作系统和浏览器的版本信息 |
referer: | 当前页面是从哪个页面跳转过来的 |
Location: | 搭配3xx重定向状态码使用,告诉客户端接下来要去哪里访问 |
Cookie: | 用于在客户端存储少量信息,通常用于实现会话(session)的功能 |
7.1 connection报头
HTTP中的Connection字段是HTTP报文头的一部分,它主要用于控制和管理客户端与服务器之间的连接状态。HTTP是无连接的,但有时候我们希望与一个网页保持持久连接。Connection字段就用于管理持久连接(也称为长连接)。持久连接允许客户端和服务器在请求-响应完成后不立即关闭TCP连接,以便在同一个连接上发送多个请求和接收多个响应。
HTTP/1.1:
- 在HTTP/1.1协议中,默认使用持久连接。当客户端和服务器都不明确指定关闭连接时,连接将保持打开状态,以便后续的请求和响应可以复用同一个连接。
HTTP/1.0:
- 在HTTP/1.0协议中,默认连接是非持久的。如果希望在HTTP/1.0上实现持久连接,需要在请求头中显式设置
Connection:keep-alive
。
语法格式:
Connection:keep-alive
:表示希望保持连接以复用TCP连接。
Connection:close
:表示请求/响应完成后,应该关闭TCP连接。
8. HTTP Cookie
8.1 HTTP Cookie介绍
HTTP Cookie(也称为 Web Cookie、浏览器Cookie或简称Cookie)是服务器发送到用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户偏好等。
用途:
-
用户认证和会话管理(最重要)。
一般用于保持用户的登录状态,可设置过期时间。如b站的登录Cookie信息设置了两年,但华为云的Cookie过期非常快。
-
跟踪用户行为。
如记录用户的浏览记录,以便设置个性化推荐。
-
缓存用户偏好等。
如b站缓存用户的播放设置喜好等。
8.2 Cookie工作原理
当用户第一次访问网站时,服务器会在响应的HTTP头中设置Set-Cookie
字段,用于发送Cookie到用户的浏览器。浏览器在接收到Cookie后,会将其保存在本地(通常是按照域名进行存储)。 在之后的请求中,浏览器会自动在HTTP请求头中携带Cookie字段,将之前保存的Cookie信息发送给服务器。
8.3 Cookie分类
-
Seesion Cookie
:会话Cookie,在浏览器关闭时失效。(内存级) -
Persistent Cookie
:持久Cookie,带有明确的过期日期或持续时间,可以跨多个浏览器会话存在。(文件级)
如果cookie
是一个持久性的cookie
,那么它其实就是浏览器进程生成的,特定目录下的一个文件。但cookie
文件不能直接查看,因为cookie
文件通常以二进制或sqlite
格式储。 但浏览器一般设置了在浏览器下查看特定网页的Cookie
的方式:
8.4 Cookie设置
HTTP存在一个报头选项:Set-Cookie
用来在浏览器中设置Cookie
的值。客户端(浏览器)在接收到响应头后,会自动获取Set-Cookie
并自行设置并保存Cookie
。
设置格式
Set-Cookie: <name>=<value>
示例:
Set-Cookie: username=peter; expires=Thu, 18 Dec 2024 12:00:00
UTC; path=/; domain=.example.com; secure; HttpOnly
含义:
<name>=<value>
:name为Cookie的名称,value为Cookie的值。
expires=<date>
:设置Cookie的过期时间,设置了expires
则代表Cookie
是一个Persistent Cookie
。Cookie
的时间必须遵从RFC 1123 标准,即 [星期], [d] [m] [y] [hour]:[min]:[second] UTC
:Thu, 18 Dec 2024 12:00:00
。
注意星期和月份为首字母大写的英文单词缩写。
UTC
为计算时间的一种方式,还有如GMT
,但推荐使用UTC
(更精准)。
path=<some_path>
:是Cookie在网页的web目录中有效的范围,如果设置为/
表示这条cookie在这个域名的web根目录下所有路径都有效。
domain=<domain_name>
:指定哪些主机可以接受该Cookie。默认为设置它的主机。设置中的.
前缀表示包含所有子域名。
secure
:仅当使用HTTPS协议时才发送Cookie。这有助于防止Cookie在不安全的HTTP连接中被截获。
HttpOnly
:标记Cookie为HttpOnly,意味着该Cookie不能被客户端脚本(如JavaScript)访问。这有助于防止跨站脚本攻击(XSS)。
注意事项:
- 每个
Cookie
属性之间用;
和 - 名称和值之间使用
=
分隔。 - 如果Cookie的名称或值包含特殊字符(如空格、分号、逗号等),则需要进行URL编码。
Cookie的安全性
使用secure
标志可以确保Cookie
仅在HTTPS连接上发送,从而提高安全性。使用HttpOnly
标志可以防止客户端脚本(如JavaScript)访问Cookie
,从而防止XSS攻击。
但由于Cookie
经常需要写入一些用户的敏感信息,而HTTP的请求和响应是可以被拦截的,单独使用Cookie非常不安全。所以一般Cookie
还会配合Session
使用。
9. HTTP Session
9.1 Session介绍
Session与Cookie类似,但Session是存储在服务器端的,服务器用来跟踪用户与服务器交互期间用户状态的机制。Cookie是客户端(浏览器)记录用户信息的机制,但同样的服务器端有时也需要记录用户的信息,所以就需要Session来做这个工作(因为HTTP协议是无状态的)。
9.2 Session工作原理
当用户首次访问网站时, 服务器会为用户创建一个唯一的 Session ID
, 并通过Cookie
将其发送到客户端。客户端在之后的请求中会携带这个 Session ID
, 服务器通过 Session ID
来识别用户, 从而获取用户的会话信息。服务器通常会将 Session
信息存储在内存、 数据库或缓存中。
9.3 Session的特点
安全性:
-
与
Cookie
相似, 由于Session ID
是在客户端和服务器之间传递的, 因此也存在被窃取的风险。但是由于Session的具体内容存储在服务器,Cookie
被盗时只是泄漏了Session ID
,私密的信息没有泄漏。所以说使用Session
是相对安全的。 -
Session ID
还用于服务端进行客户端有效性的管理, 比如检测异地登录并做出一定的处理(如要求短信验证敏感操作)。 -
Session
也可以通过HTTPS
和设置合适的Cookie
属性(如HttpOnly
和Secure
) 来增强安全性。
超时和失效:
- Session 可以设置超时时间, 当超过这个时间后, Session 会自动失效。
- 服务器也可以主动使 Session 失效, 例如让Session在当用户登出时失效。
用途:
-
用户认证和会话管理。
-
存储用户的临时数据(如购物车内容)。
-
实现分布式系统的会话共享(通过将会话数据存储在共享数据库或缓存中)。
10. HTTP历史版本介绍
10.1 HTTP/0.9
1991年,HTTP/0.9版本作为HTTP协议的最初版本,用于传输基本的超文本HTML内容。当时的互联网还处于起步阶段,网页内容相对简单,主要以文本为主。
特点:
- 仅支持GET请求方法。
- 仅支持纯文本传输,主要是HTML格式。
- 无请求和响应头信息。
10.2 HTTP/1.0
1996年,随着互联网的快速发展,网页内容逐渐丰富,HTTP/1.0版本应运而生。为了满足日益增长的网络应用需求,HTTP/1.0增加了更多的功能和灵活性。然而,HTTP/1.0的工作方式是每次TCP连接只能发送一个请求,性能上存在一定局限。
特点:
- 引入了POST和HEAD请求方法。
- 添加了请求和响应头信息,支持多种数据格式(MIME)。
- 支持缓存(cache)。
- 添加了状态码(status code),支持多字符集。
10.3 HTTP/1.1
1999年,随着网页加载的外部资源越来越多,HTTP/1.0的性能问题愈发突出。HTTP/1.1通过引入持久连接和管道化等技术,有效提高了数据传输效率。同时,互联网应用开始呈现出多元化、复杂化的趋势,HTTP/1.1的出现满足了这些需求。
特点:
- 引入持久连接(persistent connection),支持管道化(pipelining)。
- 允许在单个TCP连接上进行多个请求和响应,提高了性能。
- 引入分块传输编码(chunked transfer encoding )。
- 支持Host头,允许在一个IP地址上部署多个Web站点。
10.4 HTTP/2.0
2015年,随着移动互联网的兴起和云计算技术的发展,网络应用对性能的要求越来越高。HTTP/2.0通过多路复用、二进制帧格式等技术,显著提高了数据传输效率和网络性能。同时,HTTP/2.0还支持加密传输(HTTPS),提高了数据传输的安全性。
特点:
- 支持多路复用(multiplexing),一个TCP连接允许多个HTTP请求。
- 支持二进制帧格式(binary framing),优化数据传输。
- 支持头部压缩(header compression),减少传输开销。
- 支持服务器推送(server push),提前发送资源到客户端。
10.5 HTTP/3.0
2022年,随着5G、物联网等技术的快速发展,网络应用对实时性、可靠性的要求越来越高。HTTP/3.0通过使用QUIC协议,提高了连接建立速度和数据传输效率,满足了这些需求。同时,HTTP/3.0还支持加密传输(HTTPS),保证了数据传输的安全性。
特点:
- 使用QUIC协议替代TCP协议,基于UDP构建的多路复用传输协议。
- 减少了TCP三次握手及TLS握手时间,提高了连接建立速度。
11. Fiddler
fiddler在启动之后,会劫持浏览器的请求,再由fiddler向服务器端发送请求。同时服务器端向浏览器发送应答时,fiddler也会劫持应答,之后再转交给浏览器。所以fiddler可以获取请求的端口号和IP地址。
12. 相关命令
连接并向网页发送请求方法的命令:
telnet [IP] [port]
ctrl+]
GET /HTTP/1.1
快速测试网页连接命令:
curl [IP] [port]
测试目标网页延迟命令:
ping [IP]