一、HTTP概述
(一)什么是HTTP协议?
当在web页面输入url后,浏览器会向web服务器请求资源以显示web页面,而它们之间使用的就是HTTP协议(HyperText Transfer Protocol,超文本传输协议),浏览器就是基于HTTP协议进行文档传输的。
(二)HTTP协议的特点
1、客户端与服务端通过请求与响应的方式完成通信
客户端与服务端的通信是客户端先发起的,客户端发送请求,然后服务端做出响应。
2、HTTP协议是不保存状态的协议
HTTP协议是无状态的,它不会对请求和响应的状态进行保留,这也是HTTP协议为了处理大量事务所做出的设计,但同时也会产生一些不利,比如登录淘宝后再跳转其它页面,需要重新登录,为了解决这个问题就引入了cookie和session技术。
二、HTTP报文
客户端与服务端之间的交互是建立在HTTP协议的基础之上的,它们之间交互的数据信息被称为报文。报文大致被分为报文首部和主体两部分,但不一定非要有报文主体,它们之间以回车符和换行符分割,客户端请求的数据被称为请求报文,服务端返回的数据被成文响应报文。
(一)请求报文
具体的请求报文中类似如下的内容:
GET /index.html HTTP/1.1 #请求行 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 #各种首部字段 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cache-Control: max-age=0 Connection: keep-alive #空行 (CR+LF)
...
可以看到请求行和各种首部字段(HTTP首部字段)都属于报文首部内容。
1、请求行
请求行由请求方法、Request-URI、HTTP协议版本构成。
- 请求方法
方法 |
说明 |
支持的HTTP协议版本 |
GET |
请求获取Request-URI所标识的资源 |
1.0、1.1 |
POST |
在Request-URI所标识的资源后附加新的数据 |
1.0、1.1 |
PUT |
请求服务器存储一个资源,并用Request-URI作为其标识 |
1.0、1.1 |
HEAD |
请求获取由Request-URI所标识的资源报文首部 |
1.0、1.1 |
DELETE |
请求服务器删除Request-URI所标识的资源 |
1.0、1.1 |
OPTIONS |
请求查询服务器的性能,或者查询与资源相关的选项和需求 |
1.1 |
TRACE |
请求服务器回送收到的请求信息,主要用于测试或诊断 |
1.1 |
CONNECT |
要求用隧道协议连接代理 |
1.1 |
- Request-URI
Request-URI是一个统一资源标识符,标识某一互联网资源(例如/index.html),而常用的 URL 表示资源的地点(互联网上所处的位置),所以URL是URI的子集。
- HTTP协议版本
表示请求的HTTP协议版本, 比如HTTP/1.1,HTTP/1.0。
2、HTTP首部字段
在请求报文中的报文首部包括请求行和HTTP首部字段,HTTP首部字段有通用首部字段、请求首部字段、实体首部字段。这些首部字段的由字段名和字段值构成,字段名和字段值之间以“:”分隔。
- 通用首部字段
请求报文和响应报文都会使用的字段
首部字段名 |
说明 |
Cache-Control |
控制缓存的行为 |
Connection |
两个作用:控制不再转发给代理以及管理持久连接 |
Date |
创建报文的日期时间 |
Pragma |
报文指令 |
Trailer |
会事先说明在报文主体后记录了哪些首部字段 |
Transfer-Encoding |
指定报文主体的传输编码方式 |
Upgrade |
升级为其他协议 |
Via |
追踪客户端和服务器之间的请求和响应报文的传输路径 |
Warning |
通常会告知用户一些与缓存相关的问题的警告 |
- 请求首部字段
从客户端向服务端发送请求时使用的首部字段,常见请求首部字段:
首部字段名 |
说明 |
Accept |
浏览器可接受的MIME类型 |
Accept-Charset |
浏览器可接受的字符集。 |
Accept-Encoding |
浏览器能够进行解码的数据编码方式。 |
Accept-Language |
浏览器所希望的语言种类。 |
Authorization |
Web认证信息,通常出现在对服务器发送的WWW-Authenticate头的应答中 |
Host |
请求资源所在服务器 |
Content-Length |
表示请求消息正文的长度。 |
If-Modified-Since |
客户端通过这个首部告诉服务器,资源的缓存时间 |
Referer |
客户端通过这个首部告诉服务器,它是从哪个资源来访问服务器的(防盗链)。包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。 |
User-Agent |
User-Agent头域的内容包含发出请求的用户信息,浏览器类型。 |
From |
请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。 |
Range |
实体的字节范围请求 |
- 实体首部字段
针对请求实体规定的首部字段,对于请求方式是GET的话就没有请求实体,如果是POST等请求方式是有请求实体的。所以在请求和响应报文中都有可能包含实体部分,也就是说可能包含下面这些首部:
首部字段名 |
说明 |
Allow |
服务端资源可支持的HTTP方法 |
Content-Encoding |
实体主体适用的编码方式 |
Content-Language |
告诉客户端实体主体的自然语言 |
Accept-Language |
浏览器所希望的语言种类。 |
Content-Length |
实体主体的大小(单位:字节) |
Content-Location |
报文主体返回对应资源的URI |
Content-MD5 |
由一串由MD5算法生成的值,其目的在于检查报文 主体在传输中是否保持完整,以及确认传输到达。 |
Content-Range |
实体主体的位置范围 |
Content-Type |
实体主体的媒体类型 |
Expires |
实体主体过期的日期时间 |
Last-Modified |
资源的最后修改日期时间 |
(二)响应报文
响应报文顾名思义就是服务端返回给客户端的数据信息。
上面就是响应报文的结构形式,具体响应报文类似以下的内容:
HTTP/1.1 200 0k#状态行 Content-Length: 865 #HTTP首部字段 Content-Type: text/html; charset=utf-8 Date: Mon, 30 Sep 2019 03:00:13 GMT Server: WSGIServer/0.2 CPython/3.5.2 X-Frame-Options: SAMEORIGIN #空行###################### <html lang="en"> #报文主体 <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"/> </head> <body> ... ... </body> </html>
状态行和HTTP首部字段属于响应报文的报文首部内容。
1、状态行
包含表明响应结果的状态码,原因短语和 HTTP 版本。
- 状态码
当客户端发送请求后,依照服务端返回的状态码来确定请求处理的情况。
状态码分为5类:
状态类别 |
说明 |
1xx |
指示信息,表示请求已接收,继续处理 |
2XX |
成功,表示请求已被成功接收、理解、接受 |
3xx |
重定向,要完成请求必须进行更进一步的操作 |
4xx |
客户端错误,请求有语法错误或请求无法实现 |
5xx |
服务器端错误,服务器未能实现合法的请求 |
以下状态码是常用的:
类别说明 |
状态码 |
原因短语 |
说明 |
2xx成功 |
200 |
Ok |
请求已正常处理 |
204 |
No Content |
请求处理成功,但没有任何资源可以返回给客户端 |
|
3xx重定向 |
301 |
Moved Permanently |
请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。 |
302 |
Found |
和301相似,但302代表的资源不是永久性移动,只是临时性的,以后还可能变。 |
|
303 |
See Other |
资源的URI已更新,临时按新的URI以GET方式请求资源 |
|
304 |
Not Modified |
资源已找到,但未符合请求的条件,返回304 |
|
307 |
Temporary Redirect |
临时重定向。与302有相同的含义。 |
|
4xx客户端错误 |
400 |
Bad Request |
服务器端无法理解客户端发送的请求,请求报文中可能存在语法错误。 |
401 |
Unauthorized |
发送的请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的认证信息 |
|
403 |
Forbidden |
不允许访问那个资源。该状态码表明对请求资源的访问被服务器拒绝了(例如无权限,未授权等)。 |
|
404 |
Not Found |
服务器上没有请求的资源,也有可能是请求路劲错误。 |
|
5xx服务器错误 |
500 |
Internal Server Error |
该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web应用存在的 bug 或某些临时的故障。 |
503 |
Service Unavailable |
服务器正在忙碌。该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。 |
-
原因短语
原因短语在上述状态码中已经说明
-
HTTP协议版本
表示响应的HTTP协议版本, 比如HTTP/1.1,HTTP/1.0,与请求报文请求行中的一样。
2、HTTP首部字段
在响应报文的响应首部中,状态行后就是HTTP首部字段,它与请求报文的请求首部中的HTTP首部字段不同之处在于将请求首部字段变成了响应首部字段。
- 通用首部字段
参考请求报文中的通用首部字段
- 响应首部字段
首部字段名 |
说明 |
Accept-Ranges |
告知客户端,服务器是否接受字节范围请求 |
Age |
告知客户端,服务器资源创建经过的时间 |
ETag |
告知客户端资源的实体标识。它是一种可以将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag。 |
Location |
令客户端重定向至指定URI |
Proxy-Authenticate |
代理服务器对客户端的认证信息 |
Retry-After |
告知客户端应该在多久之后再次发送请求 |
Server |
告知客户端当前服务器上安装的HTTP服务器应用程序的信息 |
Vary |
该首部字段可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令 |
WWW-Authenticate |
服务器对客户端的认证信息,它会告知客户端适用于访问请求URI所指定资源的认证方案(Basic还是Digest)和带参数提示的质询。状态码401 Unauthorized响应中,要使用该首部字段。 |
- 实体首部字段
参考请求报文中的实体首部字段
三、HTTP报文补充
(一)报文主体与报文实体
1、报文
是HTTP通信中的基本单位,站点一次性要发送的数据块,通过HTTP通信传输。
2、报文实体
作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
3、报文主体
用于传输请求或响应的实体主体。
4、报文主体与报文实体
通常报文主体等同于报文实体,只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
如下图所示:
(二)HTTP首部
HTTP报文整体分为报文首部与报文主体两部分,中间以空行分隔,无论是请求报文还是响应报文,它们的首部包含请求行(响应行)与HTTP首部。
HTTP首部中除了通用首部字段、请求首部字段、响应首部字段、实体首部字段外还有其它的一些字段。
1、为cookie服务的首部字段
首部字段名 |
说明 |
Set-Cookie |
响应首部字段,Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie |
Cookie |
请求首部字段,服务器端会从请求报文中去发现Cookie这个首部字段信息,然后与服务器上的记录做对比检查,得到之前的状态信息 |
2、其它
- X-XSS-Protection
首部字段 X-XSS-Protection 属于 HTTP 响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器 XSS 防护机制的开关。
X-XSS-Protection:0 #将 XSS 过滤设置成无效状态 X-XSS-Protection:1 #将 XSS 过滤设置成有效状态X-XSS-Protection:1;mode=block #表示启用XSS过滤器X-XSS-Protection:1;report=<reporting-uri> #表示启用 XSS 过滤
- DNT
首部字段 DNT 属于 HTTP 请求首部,其中 DNT 是 Do Not Track 的简称,意为拒绝个人信息被收集,用户选择了这个字段就可以免于被第三方网站追踪网络痕迹。
DNT:0 #同意被追踪 DNT:1 #拒绝被追踪
参考:图解HTTP书籍