HTTP报文

Wesley13
• 阅读 1105

一、HTTP概述

(一)什么是HTTP协议?

  当在web页面输入url后,浏览器会向web服务器请求资源以显示web页面,而它们之间使用的就是HTTP协议(HyperText Transfer Protocol,超文本传输协议),浏览器就是基于HTTP协议进行文档传输的。

(二)HTTP协议的特点

1、客户端与服务端通过请求与响应的方式完成通信

客户端与服务端的通信是客户端先发起的,客户端发送请求,然后服务端做出响应。

2、HTTP协议是不保存状态的协议

HTTP协议是无状态的,它不会对请求和响应的状态进行保留,这也是HTTP协议为了处理大量事务所做出的设计,但同时也会产生一些不利,比如登录淘宝后再跳转其它页面,需要重新登录,为了解决这个问题就引入了cookie和session技术。

二、HTTP报文

  客户端与服务端之间的交互是建立在HTTP协议的基础之上的,它们之间交互的数据信息被称为报文。报文大致被分为报文首部和主体两部分,但不一定非要有报文主体,它们之间以回车符和换行符分割,客户端请求的数据被称为请求报文,服务端返回的数据被成文响应报文。

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报文

上面就是响应报文的结构形式,具体响应报文类似以下的内容:

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首部。

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书籍

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
海军 海军
3年前
5分钟快速梳理你的HTTP体系
HTTP定义1.HTTP(超文本传输协议)是客户端与服务端之间信息交流的桥梁。2.在信息交流之前必须要做的就是客户端通过连接TCP/IP协议80端口,以便服务端侦听HTTP请求。3.HTTP是一种通用的,无状态的应用层协议,基于标准客户机/服务器模型。HTTP特点1.采用“请求/
Stella981 Stella981
3年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Stella981 Stella981
3年前
Http协议、Tomcat、servlet
HTTP协议Http,超文本传输协议是互联网上最广泛的一种网络协议,所有的www文件都必须遵守这个标准。Http协议由http请求和http响应组成http请求:1.请求行请求方式POST、GET、PUT、DELETE等请求的资源/DemoEE/form.html协议版本http/1.12.请求头cookie浏览器
Stella981 Stella981
3年前
Servlet主要相关类核心类 容器调用的过程浅析 servlet解读 怎么调用 Servlet是什么 工作机制
WEB简介Web项目是B/S结构浏览器/服务器模式的浏览器发起请求,服务器作出响应请求的发起和响应使用HTTP协议进行通讯所谓协议也就是一种固定格式而Socket是应用层与传输层的一层编程接口,屏蔽了传输层的细节所以Web项目也就是通过Socket发送HTTP请求和响应的过程只不过请求是浏览器发出来的响应是服务器发
Wesley13 Wesley13
3年前
http协议请求响应详解
http协议请求响应详解一、http协议简介HTTP是HyperTextTransferProtocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程及数据本身的格式。二、HTTP1.0的基本运行方式1、基于HTTP协议(https://www.osc
Stella981 Stella981
3年前
Http基础解析
Http基础解析\\概念\\:HyperTextTransferProtocol超文本传输协议\传输协议:定义了,客户端和服务器端通信时,发送数据的格式\特点:1\.基于TCP/IP的高级协议2\.默认端口号:803\.基于请求/响应模型的:一次请求对应一次响应4\.
Wesley13 Wesley13
3年前
HTTP协议的头信息详解
HTTP协议的头信息详解HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。
Stella981 Stella981
3年前
Http工作原理(转)
  HTTP协议(HyperTextTransferProtocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。         在了解HTTP如何工作之前,我们先了解计