「HTTP」- 报文格式

  CREATED BY JENKINSBOT

基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果等)。
HTTP默认使用80/TCP端口号。

HTTP报文是承载在TCP协议上的,它在 TCP 中所处位置如下:

报文格式

HTTP 报文(请求报文和响应报文)的组成:
1)起始行:在请求报文中用来说明要执行的操作,在响应报文中说明执行结果。
2)首部字段:用于补充关于请求和响应的附加信息。如请求报文首部字段Host指定了被请求资源的Internet主机,响应报文首部字段Content-Type表明报文主体中的内容是什么类型。
3)主体:请求报文主体是客户端要发送给Web服务器的数据,响应报文主体则是Web服务器要返回给客户端的数据,如html文本、图片、视频等。

请求报文和响应报文只有起始行的语法不同:
method:客户端对服务器端资源执行的动作,是一个单独的词,比如GET、POST。
request-URL:请求的资源在服务器上的路径。
version:报文所使用的HTTP版本。格式为HTTP/<主要版本号>.<次要版本号>。
status-code:HTTP状态码,用于表示请求操作的执行结果,状态码是三位数字。
reason-phrase:原因短语,使用人类可读的方式对状态码进行解释。

请求报文(Request)

客户端发送的HTTP请求消息包括由请求行、请求头部、空行、请求数据四个部分组成;

下图给出了请求报文的一般格式:

更形象的图示,通常如下(下图未体现空行):

请求行

请求行由 3 个字段组成:
1)请求方法(Method):HTTP 操作方法,或HTTP使用的请求方法。作用于URI中指定的目标资源。比如常见的GET/POST等。HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型。
2)统一资源标识(URI):URI 是一个统一资源标识符,它标识了请求所针对的资源。
3)HTTP/Version(协议版本):协议版本旨在允许发送方指示消息的格式和理解后续HTTP通信的能力。

请求行示例:

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

根据 HTTP 标准,HTTP 请求可以使用多种请求方法:
HTTP1.0定义了三种请求方法:GET、POST和HEAD方法。
HTTP1.1新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE和CONNECT方法。
GET:请求指定的页面信息,服务端将返回具体内容数据;请求的数据会附加在URL之后,以“?”分割URL和数据,数据在URL中对所有人都是可见的;
POST:提交数据,例如提交表单;请求的数据放置在HTTP请求消息的消息正文中,不作为URL的一部分。设备默认支持此请求方法;
HEAD:类似于GET请求,但是返回的响应中没有具体的内容,用于获取报头
PUT:更新和修改数据
DELETE:请求删除指定的页面
CONNECT:用于HTTP代理
OPTIONS:允许客户端查看服务器的性能
TRACE:回显服务器收到的请求,主要用于测试或诊断
PATCH:用来对已知资源进行局部更新

请求头部

请求头部允许客户端向服务器传递关于请求的附加信息。这些字段充当请求修饰符,其语义相当于编程语言方法调用中的参数。

请求头部示例:

Accept: text/html
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

Header:value:请求报文的头部,有特定字段要求。格式为header字段和值
Request body:(可选)请求消息体。有些方法不携带body信息

请求报文头部可以包含多个字段,例如Accept、Authorization、Host、From等等参数,这里不再详细列举。

空行

用于标识请求数据的开始。它的作用是通过一个空行,告诉服务器请求头部到此为止。

请求数据

若方法字段是GET,则此项为空,没有数据。若方法字段是POST,则通常来说此处放置的是要提交的数据。
请求数据示例:

user=admin&password=123456

响应报文(Response)

HTTP响应消息由四个部分组成,分别是:状态行、响应头部、空行和响应正文。

更形象的图示,通常如下(下图未体现空行):

状态行

响应消息的第一行是状态行,由协议版本、状态码、原因短语组成,每个元素由空格字符分隔。
1)协议版本(HTTP/Version):HTTP操作方法,作用于URI中指定的目标资源。协议版本旨在允许发送方指示消息的格式及其理解后续HTTP通信的能力。
2)状态码(Status code):HTTP状态码,是个 3 位整数结果码,用于向客户端返回操作结果。
3)原因短语(Message):HTTP状态消息。旨在对状态码进行简短的文本描述,帮助理解。

状态行示例:

HTTP1.1 200 OK

响应头部

Header:value:响应报文的头部,有特定字段要求。格式为header字段和值

响应头部允许服务器传递关于响应的附加信息,这些头部字段提供了关于服务器的相关信息以及URI所标识资源的信息。

响应头用于描述服务器及数据的基本信息。服务器通过响应头,可以通知客户端如何处理后续它回复的数据。

响应头部示例:

Server: JSP3/2.0.14

空行

它的作用是通过一个空行,告诉客户端响应头部到此为止。

响应正文

响应的消息体,如果客户端请求的数据类型是纯数据则返回纯数据。如果请求的是HTML页面,则返回HTML代码。

Request body:(可选)响应消息体。有些方法不携带body信息

报文示例

首部字段:
01)Host:Web服务器的主机名和端口号。
02)User-Agent:发起请求的应用程序名称。
03)Accept:告诉服务器能够发送哪些媒体类型。
04)Accept-Language:告诉服务器能够发送哪些语言。
05)Date:当前的GMT时间。
06)Server:服务器名字。
07)Last-Modified:文档的最后改动时间。
08)ETag:于此实体相关的实体标记。
09)Accept-Ranges:告知客户端,服务器是否支持范围请求。
10)Vary:服务器会根据这些首部的内容挑选出最适合的资源版本发送给客户端。
11)Content-Length:表示内容长度。
12)Content-Type:表示文档类型。

参考 RFC2616 文档,获取详细首部字段信息。

客户端请求消息

客户端向服务器发送含有用户名密码的请求消息,进行登录认证。

服务器响应消息

服务器向客户端返回响应消息,认证成功。