HTTP
HTTP(Hypertext Transfer Protocol) 超文本传输协议。HTTP 协议定义了浏览器怎么向万维网服务器请求万维网文档,以及服务器怎么把文档传送给浏览器。
1 - HTTP 的操作过程
HTTP 是应用层的协议,使用 TCP 连接进行可靠的传送。当我们上网浏览网页的时候,浏览器与 Web 服务器之间就会通过 HTTP 协议在互联网上进行数据的发送和接收。
万维网的大致工作方式如下:
每个 Web 站点都有一个服务器进程,它不断地监听 TCP 的端口 80,以便发现是否有浏览器向它发出连接建立请求;一旦监听到连接建立请求并建立了 TCP 连接后,浏览器就向 Web 服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应;最后,TCP 连接就被释放了。
在浏览器和服务器之间的请求和响应的交互,必须按照规定的格式和遵循一定的规则,这些格式和规则就是超文本传输协议 HTTP。
-
基于 请求/响应 模式
从浏览器请求一个页面文档时,将请求报文发送给 Web 服务器;服务器收到 HTTP 请求报文后,把所请求的文档作为响应报文返回给浏览器。
-
HTTP 协议本身是无连接的
HTTP 使用了面向连接的 TCP 作为传输层协议,保证了数据的可靠传输。但是 HTTP 本身是无连接的,通信的双方在交换 HTTP 报文之前不需要先建立 HTTP 连接。
-
HTTP 协议是无状态的
也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相同,服务器并不记得曾经访问过的这个客户,也不记得为该客户曾经服务过多少次。
2 - 持续连接
在 HTTP 1.0 中,当连接建立后,浏览器发送一个请求,服务器回应一个消息,之后,连接就被关闭。当浏览器下次请求的时候,需要重新建立连接,很显然这种需要不断建立连接的通信方式造成的开销比较大。早期的web页面通常只包含html文本,因此即使建立连接的开销较大,也不会有太大的影响。
现在的 web 页面往往包含多种资源(图片、动画、声音等),每次获取一种资源,就建立一次连接,这样就增加了服务器的开销,造成了互联网上的信息堵塞。因此在 HTTP 1.1 版本中,提出了一个持续连接(Persistent Connections)的机制,并将其作为 HTTP1.1 中建立连接的缺省行为。通过这种连接,web 服务器在发送响应后仍然在一段时间内保持这条连接 ,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的 HTTP 请求报文和响应报文。而且,客户端还可以发送流水线请求,也就是说客户端可以连续发送多个请求,而不需要等待每一个响应的到来。
3 - HTTP 的报文结构
HTTP 有两类报文:
-
请求报文
从客户向服务器发送请求报文
-
响应报文
服务器对客户的应答
HTTP 请求报文和响应报文都是由3个部分组成:
-
开始行,用于区分是请求报文还是响应报文。开始行的三个字段之间都以空格隔开。
-
在请求报文中的开始行叫请求行
-
在响应报文中的开始行叫状态行
-
-
消息报头,用来说明浏览器和服务器传递的一些附加信息,每一个消息报头中都由
名称: 具体的值
组成。根据不同上下文,可将消息头分为:
-
General headers
: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头。-
通用报头可以应用于请求报头和响应报头,但不可以是实体头部。
-
最常见的通用报头包括:
Date
、Cache-Control
或Connection
。
通用报头 描述 Date 包含了报文创建的日期和时间 Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)。缓存请求指令有:no-cache(协商缓存验证)、no-store(不使用任何缓存)、max-age、max-stale、min-fresh、only-if-cached;缓存响应指令有:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。 Connection 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成 -
-
Request headers
: 包含更多有关要获取的资源或客户端本身信息的消息头。 -
Response headers
: 包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头。 -
Entity headers
: 包含有关实体主体的更多信息,比如主体长(Content-Length)度或其MIME类型。-
实体报头是描述了一个 HTTP 消息有效载荷(即关于消息主体的元数据)的 HTTP 报头
-
常见的实体报头有:
Content-Length
、Content-Language
、Content-Encoding
、Content-Type
和Expires
等。
实体报头 描述 Content-Length 消息的长度,用十进制数字表示的八位字节的数目 Content-Language 说明访问者希望采用的语言或语言组合,多个语言标签需要用逗号隔开 Content-Encoding 用于对特定媒体类型的数据进行压缩,它的值为使用的压缩模式 Content-Type 用于指示资源的MIME类型 Expires 实体报头域给出响应过期的日期和时间 -
-
-
消息主体
-
在请求报文中一般都不用
-
在响应报文中可以有、也可以没有
-
3.1 请求报文
3.1.1 请求行
请求报文的第一行 “请求行” 只有3个内容,即方法、请求资源的 URL、以及 HTTP 的版本。
请求报文中常用的几种方法:
方法(操作) | 意义 |
---|---|
OPTION | 请求一些选项的信息 |
GET | 请求读取由 URL 所标志的信息 |
HEAD | 请求读取由 URL 所标志的信息的首部 |
POST | 给服务器添加信息(例如,注释) |
PUT | 在指明的 URL 下存储一个文档 |
DELETE | 删除指明的 URL 所标志的资源 |
TRACE | 用来进行环回测试的请求报文 |
CONNECT | 用于代理服务器 |
请求行的格式如下:
注意:在 GET 后面有一个空格,接着是某个完整的 URL,其后面又有一个空格,最后是 HTTP/1.1。
3.1.2 请求头
请求头 是 HTTP 头的一种,它可在 HTTP 请求中使用,并且和请求主体无关。
常见的请求报头:
请求头 | 描述 |
---|---|
Accept | 用于指定客户端接受哪些类型的信息 |
Accept-Charset | 用于指定客户端接受的字符集,缺省是任何字符集都可以接受 |
Accept-Encoding | 类似于Accept,但是它是用于指定可接受的内容编码 |
Accept-Language | 用于指定可接受的一种自然语言 |
Authorization | 用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。 |
Host | 用于指定被请求资源的主机和端口号,它通常从 URL 中提取出来的 |
User-Agent | 客户端所使用的浏览器的名称和版本 |
3.2 响应报文
每一个请求报文发出后,都能收到一个响应报文。响应报文的第一行就是状态行。
3.2.1 状态行
状态行包括3项内容,即 HTTP 的版本、状态码、以及解释状态码的简单短语。
状态码都是三位数字的,分为5大类(以不同的数字开头):
-
1xx
表示通知信息,如请求收到了或正在进行处理 -
2xx
表示成功,如接受或知道了 -
3xx
表示重定向,如要完成请求还必须采取进一步的行动 -
4xx
表示客户的差错,如请求中有错误的语法或不能完成 -
5xx
表示服务器的差错,如服务器失败无法完成请求
常见状态码
状态码 | 状态描述 | 说明 |
---|---|---|
200 | Ok | 客户端请求成功 |
400 | Bad Request | 由于客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized | 请求未经授权,这个状态代码必须和www-Authenticate报头域一起使用 |
403 | Forbidden | 服务器收到请求,但是拒绝服务,并常在响应正文中给出拒绝原因 |
404 | Not Found | 请求的资源不存在,例如输入了错误的URL |
500 | Internal Server Error | 服务器发生不可预期的错误,导致无法完成客户端的请求 |
503 | Service Unavailable | 服务器当前不能够处理客户端的请求,一段时间后可能恢复 |
3.2.2 响应头
用于http响应中并且和响应消息主体无关。
常见的响应头有:
响应头 | 描述 |
---|---|
Location | 指定需要将页面重新定向的地址。一般在响应码为3xx的响应中才会有意义。 |
Server | 包含了处理请求的源头服务器所用到的软件相关信息 |
Age | 包含对象在缓存代理中存贮的时长,以秒为单位。 |