HTTP协议
概述
HTTP(hypertext transport protocol),即超文本传输协议。这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。
HTTP就是一个通信规则,通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。客户端发送给服务器的格式叫“请求协议”;服务器发送给客户端的格式叫“响应协议”。
无状态协议
URL:统一资源定位符,就是一个网址:协议名://域名:端口/路径。
URL的请求协议几乎都是HTTP,它是一种无状态的请求响应,即每次的请求响应之后,连接会立即断开或延时断开(保持一定的连接有效期),断开后,下一次请求再重新建立。由于HTTP协议是无状态协议,因此,服务器不需要知道客户端是谁,只认请求,一次请求对应一次响应。而账号信息等方面的内容是cookie和session在起作用,与HTTP协议本身无关。
HTTP格式
请求与响应一般都分为头部和体部,之间以空行分隔。对于请求体来说,一般出现在 POST方法中,比如表单的键值对。响应体就是在浏览器中看到的内容,比如,HTML/JSON/JavaScript/XML等。这里的重点在这个头部,头部的每一行都有自己的含义,key与value之间以冒号分隔。
请求协议的格式为:
请求首行:请求方式 请求路径 协议和版本,例如:GET /Shipin/2021_07_01_596533.shtml HTTP/1.1。
请求头信息:请求头名称:请求头内容,格式为key:value,例如:Host: www.guancha.cn
空行:用来分隔请求头和请求体
请求体:GET没有请求体,只有POST有请求体
请求和响应实例
对https://www.guancha.cn/Shipin/2021_07_01_596533_s.shtml发起一个GET请求:
GET /Shipin/2021_07_01_596533.shtml HTTP/1.1
Host: www.guancha.cn
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.48 Safari/525.19
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: https://www.baidu.com/link?url=dG930Wgj8gRWERgRMXzzoZ8LH6msrSx5IHJOztzQYCvVfE2KAUZYLz6w4bQx7J3tyGN1bDaLj-pQqrBN4iKKq_&wd=&eqid=8733264d000119ed0000000260dd73c9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: Hm_lvt_8ab18ec6e3ee89210917ef2c8572b30e=1615594031; CNZZDATA1254137364=566347845-1606198967-%7C1615594952
响应如下:
HTTP/1.1 200 OK
Date: Thu, 01 Jul 2021 08:16:48 GMT
Content-Type: text/html
Content-Length: 396
Server: NWS_TCloud_S1
Cache-Control: max-age=60
Expires: Thu, 01 Jul 2021 08:17:48 GMT
Last-Modified: Thu, 01 Jul 2021 08:10:00 GMT
Content-Encoding: gzip
X-NWS-LOG-UUID: 35915ba3-a07c-47df-a0aa-9110fd6b6e27
X-Cache-Lookup: Hit From Disktank3 Gz
X-NWS-UUID-VERIFY: 4e5b3b28ab2d4cb8ced144025dcda47d
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.45
<html>
......
</html>
请求头字段分析
下面对请求与响应中的具体内容进行分析。
GET /Shipin/2021_07_01_596533.shtml HTTP/1.1
这是请求首行,对应格式在前文已经说明。
请求方式是GET,在HTTP协议中,请求方式有很多,如下表所示,其中最常用的就是GET和POST。
方法 | 描述 |
---|---|
GET | 从服务器获取一份文档 |
HEAD | 只从服务器获取文档的首部 |
POST | 向服务器发送需要处理的数据 |
PUT | 将请求的主体部分存储在服务器上 |
DELETE | 从服务器上删除一份文档 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
OPTIONS | 决定可以在服务器上执行哪些方法 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
此例中的HTTP版本为1.1。
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP 0.9:只有基本的文本 GET 功能。
HTTP 1.0:完善的请求/响应模型,并将协议补充完整,定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP 1.1:在 1.0 基础上进行更新,新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
HTTP 2.0(未普及):请求/响应首部的定义基本没有改变,只是所有首部键必须全部小写,而且请求行要独立为 :method、:scheme、:host、:path这些键值对。
Host: www.guancha.cn
Host:对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,通常属于URL的一部分。简单来说,就是向哪个主机请求资源。
Connection: keep-alive
Connection:表示客户端与服务连接类型
- Client 发起一个包含
Connection:keep-alive
的请求,HTTP/1.1使用keep-alive
为默认值。 - Server收到请求后:
- 如果 Server 支持 keep-alive,回复一个包含 Connection:keep-alive 的响应,不关闭连接;
- 如果 Server 不支持 keep-alive,回复一个包含 Connection:close 的响应,关闭连接。
- 如果client收到包含
Connection:keep-alive
的响应,向同一个连接发送下一个请求,直到一方主动关闭连接。
keep-alive在很多情况下能够重用连接,减少资源消耗,缩短响应时间,比如当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都去请求建立连接。
Upgrade-Insecure-Requests: 1
Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http 资源时自动替换成 https 请求,让浏览器不再显示https页面中的http请求警报。
HTTPS 是以安全为目标的 HTTP 通道,所以在 HTTPS 承载的页面上不允许出现 HTTP 请求,一旦出现就是提示或报错。
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.48 Safari/525.19
User-Agent 很重要,用于表明身份。从这里可以看到操作系统、浏览器、浏览器内核及对应的版本号等信息。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept:指浏览器或其他客户端可以接受的MIME(Multipurpose Internet Mail Extensions(多用途互联网邮件扩展))文件类型,服务器可以根据它判断并返回适当的文件格式。
举例:
Accept: */*
:表示什么都可以接收。
Accept:image/gif
:表明客户端希望接受GIF图像格式的资源;
Accept:text/html
:表明客户端希望接受html文本。
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8
:表示浏览器支持的 MIME 类型分别是 html文本、xhtml和xml文档、所有的图像格式资源。
q是权重系数,范围 0 ≤ q ≤ 1,q 值越大,请求越倾向于获得其";"之前的类型表示的内容。若没有指定q值,则默认为1,按从左到右排序顺序;若被赋值为0,则用于表示浏览器不接受此内容类型。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;Application:用于传输应用程序数据或者二进制数据。
Referer: https://www.baidu.com/link?url=dG930Wgj8gRWERgRMXzzoZ8LH6msrSx5IHJOztzQYCvVfE2KAUZYLz6w4bQx7J3tyGN1bDaLj-pQqrBN4iKKq_&wd=&eqid=8733264d000119ed0000000260dd73c9
Referer:表明产生请求的网页来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的。
有时候遇到下载某网站图片,需要对应的referer,否则无法下载图片,那是因为人家做了防盗链,原理就是根据referer去判断是否是本网站的地址,如果不是,则拒绝,如果是,就可以下载;
Accept-Encoding: gzip, deflate
Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式,许多情形下这可以减少大量的下载时间。
举例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0
如果有多个Encoding同时匹配, 按照q值顺序排列,本例中按顺序支持 gzip, identity压缩编码,支持gzip的浏览器会返回经过gzip编码的HTML页面。 如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
gzip 表明实体采用GNU zip编码
compress 表明实体采用Unix的文件压缩程序
deflate 表明实体是用zlib的格式压缩的
identity 表明没有对实体进行编码。当没有Accept-Encoding时,就默认为这种情况
gzip, compress, 以及deflate编码都是无损压缩算法,用于减少传输报文的大小,不会导致信息损失。 其中gzip通常效率最高, 使用最为广泛。
PS:简单来说, gzip压缩是在一个文本文件中找出类似的字符串, 并临时替换他们,使整个文件变小。这种形式的压缩对Web来说非常适合, 因为HTML和CSS文件通常包含大量的重复的字符串,例如空格,标签。
Accept-Language: zh-CN,zh;q=0.9
Accept-Langeuage:指出浏览器可以接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器能够提供一种以上的语言版本时要用到。
Cookie: Hm_lvt_8ab18ec6e3ee89210917ef2c8572b30e=1615594031; CNZZDATA1254137364=566347845-1606198967-%7C1615594952
前面说HTTP是无状态的,那么每次在连接时,服务端如何知道你是上一次的那个?这里通过Cookies进行会话跟踪,第一次响应时设置的Cookies在随后的每次请求中都会发送出去。
浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。
响应头字段分析
HTTP/1.1 200 OK
响应协议为HTTP1.1,状态码为200,表示请求成功,OK是对状态码的解释。
Date: Thu, 01 Jul 2021 08:16:48 GMT
这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。可能会有8小时的时区差。
Content-Type: text/html
告诉客户端,资源文件的类型,然后对资源进行html解析。
比较常见的是Content-Type:text/html;charset=UTF-8
告诉客户端资源的编码方式为utf-8编码,客户端通过utf-8对资源进行解码。有时我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码。
Content-Length: 396
响应体为396字节。
Server: NWS_TCloud_S1
这个是服务器和相对应的版本,只是告诉客户端服务器的信息。
Cache-Control: max-age=60
Cache-Control是响应头中很重要的信息,当客户端请求头中包含Cache-Control:max-age=0请求,明确表示不会缓存服务器资源时,Cache-Control作为作为回应信息,通常会返回no-cache,意思就是说,"那就不缓存呗"。
当客户端在请求头中没有包含Cache-Control时,服务端往往会定,不同的资源不同的缓存策略,此例中Cache-Control:max-age=60,这个意思是,从当前时间开始,在60秒的时间内,客户端可以直接从缓存副本中读取资源,而不需要向服务器请求。
Expires: Thu, 01 Jul 2021 08:17:48 GMT
过期时间,如果过期时间是过去,那就表明这个Cookie要被删。
Content-Encoding: gzip
告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。
Vary: Accept-Encoding
告诉缓存服务器,缓存压缩文件和非压缩文件两个版本,现在这个字段用处并不大,因为现在的浏览器都是支持压缩的。
X-Powered-By: PHP/5.4.45
服务端语言的信息。