HTTP消息结构
HTTP
是基于
客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。
一个HTTP
“客户端”是一个应用程序(Web浏览器或其他客户端),通过连接到服务器达到向服务器发送一个或多个HTTP
的请求的目的。
一个HTTP
“服务器”同样也是一个应用程序(通常是Web服务,如TomCat服务器),通过接受客户端的请求并向客户端发送HTTP
响应数据。
HTTP
使用统一资源标识符(Uniform Resource Identifiers, URI
)来传输数据和建立连接(TCP
)。
HTTP 协议基本特性:
- HTTP 是无连接的:
HTTP
客户端,即浏览器发出请求后,客户端等待响应。服务器处理该请求并发送回响应,然后客户端断开连接。客户端和服务器仅在当次请求中互相了解,至于上一次是否有连接或者连接的信息是无从得知的。 - HTTP是独立于媒体的: 这意味着,只要客户端和服务器都知道如何处理数据内容,任何类型的数据都可以通过
HTTP
发送。客户端和服务器都需要使用适当的 MIME 类型 指定内容类型。 - HTTP是无状态的: 如上所述,HTTP 是无连接的,这是 HTTP 是无状态协议的直接结果。服务器和客户端仅在当前请求期间彼此知道,之后他们俩彼此忘记。由于协议的这种性质,客户端和浏览器都无法在整个网页的不同请求之间保留信息。
1. 客户端请求消息(HTTP请求报文)
HTTP
会话由 HTTP
客户端(即用户的浏览器)通过用户代理打开,并且连接请求消息被发送到 HTTP
服务器(即Web服务器)。
请求消息也称为“客户端请求”,由以下几行组成:
- 请求行(
Request Line
):由请求方法、URL
(包含参数)和协议版本组成 - 请求头(
Request Header
):由多个key-value
组成 - 空行:请求报文使用空行将请求头部和请求数据分离
- 请求数据(
Request Data
):Get()
方法没有携带数据,Post()
方法会携带一个body
传递响应后,Web 服务器将关闭连接。这种连接称为无状态连接,因为它仅在数据交换期间存在。
1.1 请求行
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:
Method` `Request-URI` `HTTP-Version` `CRLF
Method
:表示请求方法;Request-URI
: 是一个统一资源标识符;HTTP-Version
:表示请求的HTTP
协议版本;CRLF
:表示回车和换行(除了作为结尾的CRLF
外,不允许出现单独的CR
或LF
字符)。
请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET
: 请求获取Request-URI
所标识的资源
POST
:在Request-URI
所标识的资源后附加新的数据
HEAD
:请求获取由Request-URI
所标识的资源的响应消息报头
PUT
: 请求服务器存储一个资源,并用Request-URI
作为其标识
DELETE
:请求服务器删除Request-URI
所标识的资源
TRACE
:请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT
:保留将来使用
OPTIONS
:请求查询服务器的性能,或者查询与资源相关的选项和需求
1.2 请求头
HTTP
消息报头包括:普通报头、请求报头、响应报头、实体报头,每一个报头域都是由名字 + : + 空格 +
值组成,消息报头域的名字是大小写无关的。
1.2.1 普通报头
在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
字段名 | 说明 |
---|---|
Cache-Control | 控制缓存行为 |
Connection | 连接的管理 |
Date | 普通报头域表示消息产生的日期和时间 |
Pragma | HTTP 1.0 中的保温指令控制 |
1.2.2 请求报头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。常见的请求报头包括:
字段名 | 说明 |
---|---|
Accept | 客户端可处理的媒体类型:Accept:image/gif |
Accept-Charset | 客户端可处理的字符集 |
Accept-Encoding | 客户端的编码方式 |
Accept-Langulage | 客户端指定的语言类型 |
Authrization | web认证信息 |
Expect | 期待服务器的特定行为 |
Host | 请求报头域主要用于指定被请求资源的 Internet 主机和端口号 |
User-Agent | 请求报头域允许客户端将它的操作系统、浏览器和其它属性 |
Referer | 请求中的 url 上一跳地址 |
1.2.3 响应报头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。常见的响应报头包括:
字段名 | 说明 |
---|---|
Age | 资源的创建时间 |
Location | 客户端重定向至指定的URL |
Retry-After | 再次发送请求的时机 |
www-Authenticate | 服务器对客户端的认证 |
1.2.4 实体报头
请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文和请求所标识的资源的元信息。
字段名 | 说明 |
---|---|
Allow | 资源所支持的HTTP请求类型 |
Content-Encoding | 数据编码方式 |
Content-Language | 数据的语言类型 |
Content-Length | 实体的内容大小 |
Content-Location | 替代对应资源的URI |
Content-Type | 实体报头域用语指明发送给接收者的实体正文的媒体类型 |
Expires | 数据过期时间 |
Last-Modified | 资源的最后修改时间 |
2. 服务器响应消息(HTTP响应报文)
HTTP响应也由四个部分组成,分别是:
- 状态行
- 消息报头
- 空行
- 响应正文