HTTP协议专门用于定义浏览器与服务器之间交互数据的过程以及数据本身的格式
HTTP概述
HTTP是一种客户端(用户)请求和服务器(网站)应答的标准,它作为一种应用层协议,应用于分布式、协作式和超媒体信息系统。它作为一种请求/响应式的协议,客户端在与服务器建立连接后,就可以向服务器发送请求,这种请求被称为HTTP请求,服务器接收到请求后会做出响应,被称为HTTP响应。
HTTP协议的特点:
- 支持客户端(浏览器就是一种Web客户端)/服务器模式
- 简单快速。客户端向服务器请求服务时,只需传送请求方式和路径。常用的请求方式有GET、POST等,不同的请求方式规定的客户端和服务器联系的类型也不同。HTTP比较简单,使得HTTP服务器的程序规模小,通信速度快
- 灵活。HTTP允许传输任意类型的数据,正在传输的数据类型由Content-Type加以标记
- 无状态。HTTP时无状态协议。无状态是指协议对于事务处理没有记忆能力,如果后续处理需要前面的信息,则必须重新传输,因此这样可能会导致每次连接传送的数据量增大
HTTP1.0和HTTP1.1
基于HTTP1.0协议的客户端与服务器在交互过程中,每次发送请求信息都需要重新建立连接(建立TCP连接、发送HTTP请求、回送HTTP响应和关闭TCP连接),即客户端与服务器建立连接后,每次只能处理一个HTTP请求
基于HTTP1.1协议的客户端与服务器支持持久连接,即在一个TCP连接上可以传送多个HTTP请求和响应并且在发送下次请求时,无需等待上次请求的返回结果,服务器会根据客户端发送请求的先后顺序一次返回响应结果
HTTP1.1不仅继承了HTTP1.0的优点,而且有效解决了HTTP1.0的性能问题,显著减少了浏览器与服务器交互所需要的时间
HTTP消息
当用户在浏览器中访问某个URL地址、单击网页的某个超链接或者提交网页上的form表单时,浏览器都会向服务器发送请求数据,即HTTP请求消息
服务器收到请求数后,会将处理后的数据发送给客户端,即HTTP响应消息
HTTP请求消息和HTTP响应消息统称为HTTP消息
在HTTP消息中,除了服务器的响应实体内容(例如HTML网页、图片等)外,其他消息对用户都是不可见的,例如请求方式、HTTP协议版本号、请求头和响应头等。观察这些“隐藏”信息,可利用浏览的网络查看工具(Network)
1、HTTP请求消息
在HTTP中,一个完整的请求消息由请求行、请求头和实体内容3个部分组成,每个部分都有不同的功能
实体内容(数据体)可以被认为是附加在请求之后的文本或二进制文件,只有请求方式为post的时候,实体内容才会有数据(即请求参数)
1.1 HTTP请求行
HTTP请求行位于请求消息第一行,它包括三个部分,分别是请求方式、资源路径和HTTP版本
实例:
GET /index.html HTTP/1.1
1.2 HTTP请求头
在HTTP请求消息中,请求行之后便是若干请求头。请求头主要是用来向服务器传递附加消息,例如客户端可以接收的数据类型、压缩方式、语言以及发送请求的超链接所属页面的URL地址等信息
请求头由头字段名称和值组成,头字段名称和值之间用冒号和空格分隔(头字段名称不区分大小写,但习惯上将单词的第一个字母大写 )
常见的头字段 | 说明 |
Accept | 指出客户端能够处理的MIME类型 |
Accept-Charset | 告知服务器客户端所使用的的字符集 |
Accept-Encoding | 指定客户端能够进行解码的数据编码方式(通常指某种压缩方式) |
Accept-Language | 指定客户端期望服务器返回哪个国家语言的文档 |
Authorization | 当客户端访问受口令保护的网页时,Web服务器会发送401响应状态码和WWW-Authenticate响应头,要求客户端使用Authorization请求头来响应 |
Proxy-Authorization | 作用于用法与Authorization头字段基本相同,该请求头是服务器向代理服务器发送的验证信息 |
Host | 指定资源所在的主机名和端口号 |
If-Match | 当客户端再次向服务器请求这个网页文件时,可以使用If-Match附带以前缓存的实体标签内容,这个请求被视为一个条件请求 |
If-Modified-Since | 作用与If-Match类似,只不过它的值为GMT格式的时间 |
Range | 指定服务器只需返回文档中的部分内容及内容范围,这对较大文档的断点续传非常有用 |
If-Range | 只能伴随Range头字段一起使用,其值可以是实体标签或GMT格式的时间 |
Max-Forward | 指定当前请求可以途径的代理服务器数量,每经过一个代理服务器,此数值-1 |
Referer | 常被网站管理人员用来追踪网站的访问者时如何导航进入网站的,同时还可以用于网站的防盗链 |
User-Agent | 指定浏览器或者其他客户端程序使用的操作系统及版本、浏览器及版本、浏览器渲染引擎、浏览器语言等,以便服务器针对不同类型的浏览器而返回不同的内容 |
2、HTTP响应消息
当服务器收到浏览器的请求后,会发送请求消息给客户端。一个完整的响应消息主要包括响应状态行、响应头和实体内容,每个组成部分都代表了不同的含义
2.1 HTTP响应状态行
HTTP响应状态行位于响应消息的第一行,它包括三个部分,分别是HTTP版本、一个表示成功或者失败的状态码和对状态码进行描述的文本信息
示例:
HTTP/1.1 200 OK
状态码由三位数字组成,表示请求是否被理解或满足,第一位数字定义了响应的类型
1xx:表示请求已接收,需要继续处理
2xx:表示请求已成功被服务器接收、理解并接受
3xx:为完成请求,客户端需进一步细化请求
4xx:客户端的请求有错误
5xx:服务器出现错误
Web开发中的常见状态码 状态码 说明 200 表示服务器成功处理了客户端的请求。客户端的请求成功,响应消息返回正常的请求结果 302 表示请求的资源临时从不同的URL响应请求,但请求者应继续使用原有位置来进行以后的请求。例如,在请求重定向中,临时URL应该是响应的Location头字段所指向的资源 304 如果客户端有缓存的文档,它会在发送的请求消息中附加一个 If-Modified-Since 请求头,表示只有请求的文档在If-Modified-Since指定的时间之后发生过更改,服务器才需要返回新文档。状态码304表示客户端缓存的版本是最新的,客户端应该继续使用它。否则,服务器将使用状态码 200 返回所请求的文档 404 表示服务器找不到请求的资源。例如,访问服务器不存在的网页经常返回此状态码 500 表示服务器发生错误,无法处理客户端的请求。大部分情况下,是服务器的程序发生了错误,一般会提供具体的错误信息
2.2 HTTP响应头
在HTTP响应消息中,第一行为响应状态行,紧接着便是若干响应头,服务器通过响应头向客户端传递附加信息,包括服务程序名、被请求资源需要的认证方式、客户端请求资源的最后修改时间、重定向地址等信息
常见的响应头字段 | 说明 |
Accept-Ranges | 用于标识服务器自身支持范围请求,该头字段的具体值用于定义范围请求的单位,单位值可以为none或bytes |
Age | 用于指出当前网页文档可以在客户端或代理服务器中缓存的有效时间,设置值为一个以秒为单位的时间数 |
ETag | 用于向客户端传送代表实体内容特征的标记信息,这些标记信息称为实体标签,每个版本的资源的实体标签是不同的,通过实体标签可以判断在不同时间获得的同一资源路径下的实体内容是否相同 |
Location | 用于通知客户端获取请求文档的新地址,其值为一个使用绝对路径的URL 地址 |
Retry-After | 可以与503状态码配合使用,告诉客户端在什么时间可以重新发送请求。也可以与任何一个3xx状态码配合使用,告诉客户端处理重定向的最小延时时间。Retry-After 头字段的值可以是 GMT格式的时间,也可是一个以秒为单位的时间数 |
Server | 用于指定服务器软件产品的名称 |
Vary | 用于指定影响了服务器所生成的响应内容的那些请求头字段名 |
WWW-Authenticate | 当客户端访方问受口令保护的网页文件时,服务器会在响应消息中回送01(Unauthorized)响应状态码和WWW-Authenticate 响应头,指示客户端应该在Authenticate 请求头中使用WWW-Authenticate 响应头指定的认证方式提供用户名和密码信息 |
Proxy-Authenticate | Proxy-Authenticate 头字段用于代理服务器的用户信息验证,用法与WWW-Authenticate 头字段类似 |
Refresh | 用于告诉浏览器自动刷新页面的时间,它的值是一个以秒为单位的时间数 |
Content-Disposition | 如果服务器希望浏览器不是直接处理响应的实体内容,而是让用户选择将响应的实体内容保存到一个文件中,就需要使用Content-Disposition 头字段 |