HTTP基本原理
文章目录
本章节讲述了HTTP的基本原理,了解从浏览器中输入URL到获取网页内容之间都发生了什么。
1. URI和URL
URI的全称为Uniform Resource Identifier,即为统一资源标识符; URL的全称为Uniform Resource Locator,即统一资源定位符。 举例来说,https://github.com/favicon.ico 即是一个URI也是一个URL,意思是有一个favicon.ico图标资源,我们用上面一行的URI/URL指定了访问它的唯一方式,其中包含了访问协议https、访问路径(即根目录)和资源名称,通过这一个链接,便可以从互联网上找到某个资源,这个链接就是URI/URL。
URI里包括了URL和URN,URN的全称为Uniform Resource Name,即统一资源名称,URN只为资源命名而不指定如何定位这个资源
URI统一资源标识符 | |
URL统一资源定位符 | URN统一资源名称 |
在目前的互联网中,URN使用得非常少,几乎所有的URI都是URL,URL的基本组成格式如下:
scheme://username:password@hostname:port/path;parameters?query#fragment
-
Scheme (协议):
协议指定了访问资源所使用的协议或规则。它通常是用于访问资源的协议,例如http
、https
、ftp
、mailto
等。它告诉浏览器或其他客户端如何获取资源。另外,Scheme也被称作protocol。 -
Username (用户名) 和 Password (密码):
这两个部分是用于在URL中指定访问资源所需的用户名和密码。通常,它们与身份验证相关联,并用于访问受密码保护的资源。 -
Hostname (主机地址):
可以是域名和IP地址,主机名指定了资源所在的服务器的域名或IP地址。它是资源的物理位置。比如,https://www.baidu.com,这个URL的Hostname就是www.baidu.com;https://8.8.8.8,这个URL的Hostname就是8.8.8.8,它是一个IP地址。 -
Port (端口):
端口是指资源所在服务器上用于与客户端通信的端口号。它是可选的,如果未指定,会使用默认端口。例如::80
表示使用默认HTTP端口,:443
表示使用默认HTTPS端口。 -
Path (路径):
路径指定了服务器上资源的具体位置或目录结构。它用于定位资源在服务器上的位置。 -
Parameters (参数):
参数是一种附加在路径中的额外信息,通常以分号;
分隔。在实践中,参数并不常用,而是使用Query参数。 -
Query (查询):
查询参数是以问号?
开头的一串参数列表,用于向服务器传递额外的参数。多个参数之间使用&
符号分隔。例如:?id=123
表示传递id参数为123,?category=books&sort=price
表示传递category参数为books,sort参数为price。 -
Fragment (片段):
片段用于标识资源中的特定部分。在Web页面中,片段通常用于定位页面中的某个具体位置,例如页面内的锚点。它以井号#
开头。例如:#section1
表示定位到id为section1的元素。
2. HTTP和HTTPS
2.1. HTTP
http的全称是Hypertext Transfer Protocol,即超文本传输协议,其作用就是把超文本数据从网络传输到本地服务器,能保证高效而准确地传输超文本文档。如今,人们普遍使用的是HTTP1.1版本,当然也有不少网站支持HTTP2.0版本。
年份 | 版本 | 描述 |
---|---|---|
1991 | HTTP 0.9 | 首个HTTP版本,非常简单,只支持GET方法,并且没有头部信息。 |
1996 | HTTP 1.0 | 引入了更多的请求方法(如POST)、响应状态码、头部字段和HTTP版本号。 |
1997 | HTTP 1.1 | 目前最广泛使用的版本,引入持久连接、管道化连接、Host头字段等特性。 |
2007 | HTTP 1.1 (RFC 2616) | 正式发布HTTP 1.1的RFC文档。 |
2015 | HTTP/2 | 改进了性能,引入二进制协议、多路复用、头部压缩和服务器推送等特性。 |
2018 | HTTP/2 (RFC 7540) | 正式发布HTTP/2的RFC文档。 |
2019 | HTTP/3 | 基于UDP协议的版本,改进了性能和安全性,使用QUIC传输协议。 |
2020 | HTTP/3 (RFC 9000) | 正式发布HTTP/3的RFC文档。 |
2.2.HTTPS
HTTPS的全称是Hypertext Transfer Protocol over Secure Socket Layer,是以安全为目标的HTTP通道,简单来说就是HTTP的安全版,即在HTTP下加入SSL层,简称HTTPS。HTTPS的安全基础是SSL,因此通过该协议传输的内容都是经过SSL加密的,SSL主要作用有以下两种:①建立一个信息安全通道,保证数据传输安全性;②确认网站的真实性。
3. HTTP的请求过程
在浏览器地址栏输入一个URL,按下回车之后就可以观察所得到的内容。实际上,这个过程是浏览器先向网站所在的服务器发送一个请求,网站服务器接收到请求后对其进行处理和解析,然后返回对应的响应,接着传回浏览器,浏览器对响应里的源代码解析并呈现出来,得到的就是眼前的东西为了直观说明上述过程,我们用Chrome浏览器开发者模式下的Network监听组件来做一下,演示网站www.baidu.com:
- 打开Chrome浏览器鼠标右键并选择“检查”菜单,即可打开浏览器的开发者工具,并切换到Network面板,我们可以看到Network面板中出现了很多条目,其中每一条目就代表一次请求和接受相应的过程:
-
我们观察,其各列的含义如下:
- 第一列Name:请求的名称。一般会用URL的最后一部分内容作为名称。
- 第二列Status:响应的状态码。这里基本显示的是200,代表响应是正常的。通过状态吗我们可以知道发送的请求是否得到正常的回应。
- 第三列Type:请求的文档类型。如document,代表我们这一次请求的是一个HTML文档,内容是一些代码。
- 第四列Initiator:请求源。用来标记请求是由拿个对象或进程发起的。
- 第五列Size:从服务器下载资源的大小,如果不是从服务器取得的,会显示其他东西。
- 第六列Time:从发出请求到获取响应所花的总时间。
- 第七列Waterfall:网络请求的可视化瀑布流。
- 其他:Protocol:请求的协议类型,http/1.1代表HTTP1.1版本,h2代表HTTP2.0版本
-
点击一个条目,来观察更具体的信息:
-
首先是General部分,其中Request URL是请求的URL,Request Method为请求的方法,Status Code为响应状态码,Remote Address为远程服务器的地址和端口,Referred Policy为Referred判别策略。referer是用来防止 CORS(跨站请求伪造)的一种最常见及有效的方式。对于自身服务器,通过客户端发来的请求中带有的referer信息,可以判断该请求是否来源于本网站。这样就可以一定程度上避免其他网站盗取自身服务器信息,或者可以通过referer来实现广告流量引流。
-
接着是Response Headers,代表的是响应头。响应头是响应的一部分,其中包含了服务器的类型、文档类型、日期等信息。
-
最后是Request Headers,代表的是请求头。请求头中包含了浏览器标识、Cookie、Host等信息,服务器会根据这些信息判断请求是否合法,这些在以后爬取网页信息的时候会经常用到,可以称为“伪装”。
-
4. 请求(重要)
请求Request,由客户端发往服务器,分为四部分内容:请求方法(Request Method)、请求的网址(URL)、请求头(Requests Headers)、请求体(Requeset Body),下面进行介绍:
4.1. 请求方法(Request Method)
请求方法,用于标识请求客户端请求服务端的方式,常见的请求方式由GET和POST。在浏览器中直接输入URL并回车就会发送一个GET请求,请求的参数就会直接包含在URL里,而POST请求通常在提交表单时候发起的,例如,对于一个登录界面,如果我们用的是GET请求,那么我们的密码就会直接暴露在URL中,如果使用的是POST请求,那么数据通常就以表单形式发送,则不会体现在URL中。 除了这两个请求外,还有其他的请求:
请求类型 | 描述 |
---|---|
GET | 请求获取指定资源。通过URL中的参数传递数据,对于敏感数据不安全,通常用于获取数据。 |
POST | 在指定资源上提交数据,用于创建新资源或对资源进行修改。请求数据在请求体中传递。 |
PUT | 请求在指定位置创建或更新资源。类似于POST,但PUT是幂等的,多次请求不会产生不同结果。 |
DELETE | 请求删除指定资源。用于删除服务器上的资源。 |
PATCH | 请求对资源进行局部修改。只更新资源的部分内容。 |
HEAD | 类似于GET,但只返回响应头,不返回实际资源内容,用于检查资源是否存在和获取元信息。 |
OPTIONS | 请求查询服务器支持的请求方法。用于获取服务器支持的HTTP方法列表。 |
CONNECT | 要求在与代理服务器通信时建立隧道,用于使用SSL/TLS进行加密通信。 |
TRACE | 回显服务器接收到的请求,用于调试或测试。 |
4.2. 请求的网址(URL)
请求的网址,唯一确定客户端想请求的资源。
4.3. 请求头(Requests Headers)
请求头,用来说明服务器要使用的附加信息,比较重要的信息有:Cookie、Referer、User-Agent等。下面简要说明一些常用请求头信息:
请求头 | 含义和作用 | 示例 |
---|---|---|
Accept | 告知服务器客户端能够接受的响应内容类型。 | Accept: text/html, application/json |
Accept-Language | 告知服务器客户端可接受的语言类型。 | Accept-Language: en-US, zh-CN;q=0.9 |
Accept-Encoding | 告知服务器客户端可接受的内容编码方式,用于数据压缩传输。 | Accept-Encoding: gzip, deflate |
Host | 指定请求的目标服务器的域名或IP地址和端口号。 | Host: www.example.com:8080 |
Cookie | 在HTTP请求中携带存储在客户端的Cookie信息,用于会话状态保持。例如,输入用户名和密码登录一个网站后,每次刷新和请求该站点其他页面,都会保持登录状态,这就是Cookie的功劳。 | Cookie: session_id=123456; user_id=987654 |
Referer | 表示当前请求的来源页面的URL,用于跟踪和统计。 | Referer: https://www.example.com/page1 |
User-Agent | 标识客户端应用程序或浏览器的信息,帮助服务器优化响应。 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 |
Content-Type | 指定请求体中的数据类型,用于POST请求等需要传递数据的请求。Content-Type的设置对于数据的正确解析和处理非常重要。例如,如果服务器期望接收JSON数据,而客户端却发送了普通文本数据,服务器可能无法正确解析数据。 | Content-Type: application/json; charset=utf-8 |
4.4. 请求体(Requeset Body)
请求体,一般承载的内容是POST请求中的表单数据,对于GET请求请求体为空。以下是一些常见的Content-Type类型及其描述:
Content-Type | 描述 |
---|---|
application/json | JSON数据,常用于在客户端和服务器之间传递结构化数据。 |
application/x-www-form-urlencoded | 表单数据,通常用于在请求中传递表单数据,数据以普通URL编码格式传递。 |
multipart/form-data | 表单数据上传,支持上传文件和文本数据,用于文件上传和表单数据同时提交。 |
text/html | HTML格式的网页内容,用于返回网页。 |
text/plain | 普通文本数据,没有特殊格式,通常用于返回纯文本数据。 |
image/jpeg | JPEG图片格式。 |
image/png | PNG图片格式。 |
image/gif | GIF图片格式。 |
application/xml | XML数据格式,用于在客户端和服务器之间传递结构化数据。 |
application/pdf | PDF文件格式。 |
application/javascript | JavaScript代码,用于在客户端执行脚本。 |
application/octet-stream | 二进制数据流,通常用于传输未知或不可预知的二进制数据。 |
audio/mpeg | MPEG音频文件格式,通常用于音频文件。 |
video/mp4 | MP4视频文件格式,通常用于视频文件。 |
5. 响应
响应,即Response,由服务器返回给客户端,可以分为三部分:响应状态码(Response Status Code)、响应头(Response Headers)、响应体(Response Body)。
5.1. 响应状态码
表示服务器的响应状态,下面列出了常见状态码及错误原因:
状态码 | 错误原因描述 |
---|---|
100 | Continue - 服务器收到请求的起始部分,客户端应继续发送剩余部分。 |
101 | Switching Protocols - 请求切换协议,服务器正在切换到新协议。 |
204 | No Content - 请求已成功处理,但没有返回内容。 |
206 | Partial Content - 客户端只请求资源的一部分,服务器成功返回部分内容。 |
300 | Multiple Choices - 请求的资源有多个可供选择的表示形式。 |
301 | Moved Permanently - 资源的URL已永久更改,需要使用新URL重新请求。 |
302 | Found - 资源的URL临时性更改,客户端应继续使用原始URL。 |
304 | Not Modified - 客户端缓存的资源是最新的,无需返回内容。 |
400 | Bad Request - 请求有误,服务器无法理解。 |
401 | Unauthorized - 请求未经授权,需要进行身份验证。 |
403 | Forbidden - 请求被服务器拒绝,通常因为权限不足。 |
404 | Not Found - 请求的资源不存在。 |
405 | Method Not Allowed - 请求方法不允许,通常因为请求方法不正确。 |
406 | Not Acceptable - 请求的资源不符合请求头中的Accept设置。 |
409 | Conflict - 请求与服务器上的资源冲突,通常用于并发操作冲突。 |
410 | Gone - 请求的资源已被永久删除,不再可用。 |
413 | Payload Too Large - 请求体太大,服务器拒绝处理。 |
415 | Unsupported Media Type - 请求的媒体类型不被支持。 |
429 | Too Many Requests - 客户端发送请求过于频繁,达到限制。 |
500 | Internal Server Error - 服务器内部错误,通常因为代码错误。 |
502 | Bad Gateway - 服务器作为网关或代理,从上游服务器接收到无效的响应。 |
503 | Service Unavailable - 服务器当前无法处理请求,通常因为过载或维护。 |
504 | Gateway Timeout - 服务器作为网关或代理,未及时从上游服务器接收到响应。 |
5.2. 响应头
响应头包含了服务器对请求信息的应答信息,如Content-Type、Server、Set-Cookie等。
- Date:用于标识响应产生的时间。
- Last-Modified:用于指定资源的最后修改时间。
- Content-Encoding:用于指定响应内容的编码。
- Server:包含服务器的信息,例如名称、版本号等。
- Content-Type:文档类型,指定返回的数据是什么类型,如text/html代表返回HTML文档,等。
- Set-Cookie:设置Coolkie,告诉浏览器下次请求时把Cookie给带上,见上面“请求”部分。
- Expires:用于指定响应的过期时间,可以让代理服务器或者浏览器将加载的内容更新到缓存中。当再次访问相同的内容时,就可以直接从缓存中加载,达到降低服务器负载缩短加载时间的目的
5.3. 响应体
这是最关键的部分响应的正文数据都存在于响应体中,在浏览器开发者工具中点击Preview,就可以看到网页的源代码,也就是响应体的内容,这是爬虫的解析目标。
6. HTTP2.0
这部分先简单讲解HTTP2.0的相关内容,详细之后在做解释。
HTTP2.0在传输层做了很多的优化,它的主要目标是通过支持完整的请求与响应复用来减少延迟,并通过有效压缩HTTP请求头字段的方式,将协议开销降至最低,同时增加请求优先级和服务器推送的支持。HTTP2.0相比与HTTP1.1来说做了这样的优化:
- 二进制分帧层
- 多路复用
- 流控制
- 服务端推送
HTTP的普及还不完善,目前大部分网站依然以HTTP1.1为主,另外,一些编程语言还未完全支持HTTP2.0,比如对于python来说hyper、httpx等库已经支持http2.0了,但广泛使用的requests库依然只支持HTTP1.1。