HTTP是一个基于TCP/IP通信协议来传递数据的协议,传输的数据类型为HTML文件、图片文件、查询结果等。HTTP协议一般用于B/S架构。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
HTTP使用统一资源标识符(Uniform Resource ldentifiers,URI)来传输数据和建立连接
URI:Uniform Resource ldentifier 统一资源标识符,用来唯一的标识一个资源。
URL:Uniform Resource Location 统一资源定位符,用来唯一的标识一个资源,而且还指明了如何去locate这个资源。
URN:Uniform Resource Name,统一资源命名,是通过名字来标识资源。
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是由一个URI来定位的。
URI一般由三部组成:
HTTP使用统一资源标识符(URI)来传输据和建立连接。URL(统一资源定位符)是一种特殊种类的URI,包含了用于查找的资源的足够的信息,我们一般常用的就是URL。
一个完整的URL包含下面几部分:
URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上.采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部分组成:
协议(或称为服务方式)
存有该资源的主机IP地址(有时也包括端口号)
主机资源的具体地址。如目录和文件名等
HTTP URL包含了用于查找某个资源的详细信息,格式如: http://host["."port][abs path]
URN: Uniform Resource Name,统一资源命名,通过名字来标识资源。比如mailto:test@baidu.com
URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式,URL和URN都是一种URI。
笼统地说,每个URL都是URI,但不一定每个 URI都是 URL。这是因为 URI还包括一个子类即统一资源名称(URN),它命名资源但不指定如何定位资源。上面的 mailto、news和isbn URI都是URN的示例。
HTTP1.0定义了三种请求方法: GET,POST和HEAD方法。
HTTP1.1新增了五种请求方法: OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
POST请求表示可能会修改服务器上的资源,比如把账号密码放入body中
POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
sex=man&name=Professional
注意:为了确保数据的安全性,应该使用加密通信协议,如HTTPS;尽管POST比GET更安全,但因为POST也是明文传输,所以并不是完全安全的。
HTTP响应是服务器在客户端发送HTTP 请求后经过一些处理而做出的响应,HTTP 响应和HTTP 请求相似,也是由三个部分构成。分别是:
HTTP 响应中包含一个状态码,用来表示服务器对客户端响应的结果,状态码一般由3位构成。
状态码 | 含义 |
1xx | 表示请求已经接受了,继续处理 |
2xx | 表示请求已经处理掉了 |
3xx | 重定向。 |
4xx | 一般表示客户端有错误,请求无法实现。 |
5xx | 一般为服务器端的错误 |
常见状态码 | 含义 |
200 | OK客户端请求成功。 |
301 | Moved Permanently 请求永久重定向 |
302 | Moved Temporarily 请求临时重定向。 |
304 | Not Modified 文件未修改,可以直接使用缓存的文件 |
400 | Bad Request由于客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized 请求未经授权,无法访问 |
403 | Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因。 |
404 | Not Found 请求的资源不存在,比如输入了错误的URL |
500 | Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求 |
503 | Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常. |
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头 (可选),空行(只有CRLF的行),消息正文(可选)组成。
HTTP消息报头包括通用头、请求头、响应头、实体头。
每一个报头域都是由名字+“:“+空格+值组成,消息报头域的名字是大小写无关的
通用头部 | 是客户端和服务器都可以使用的头部,可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能,如Date头部。 |
请求头部 | 是请求报文特有的,它们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据,如Accept头部。 |
响应头部 | 便于客户端提供信息,比如,客服端在与哪种类型的服务器进行交互,如Server头部。 |
实体头部 | 指的是用于应对实体主体部分的头部,比如,可以用实体头部来说明实体主体部分的数据类型,如Content-Type头部。 |
通用头域包含请求和响应消息都支持的头域,通用头域包含缓存头部Cache-Control、Pragma及信息性头部Connection、Date、 Transfer-Encoding、Update、Via。
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age.max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、 no-cache、nostore、no-transform、must-revalidate、 proxy-revalidate、max-age。
请求头用于说明是谁或什么在发送请求、请求源于何处,或者客户端的喜好及能力。服务器可以根据请求头部给出的客户端信息,试着为客户端提供更好的响应。
请求头域可能包含下列字段Accept、Accept-Charset、Accept- Encoding、Accept-Language.Authorization、From、Host、lf-Modified-Since、 lf-Match、lf-None-Match、lf-Range、 lfRange、 lf-Unmodified-Since Max-Forwards、Proxy-Authorization、Range、 Referer、User.Agent。
对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。
响应头向客户端提供一些额外信息,比如谁在发送响应、响应者的功能,甚至与响应相关的一些特殊指令。这些头部有助于客户端处理响应,并在将来发起更好的请求。
响应头域包含Age、Location、Proxy-Authenticate、Public、Retry- After、Server、Vary.Warning、WWW-Authenticate
对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。
实体头部提供了有关实体及其内容的大量信息,从有关对象类型的信息,到能够对资源使用的各种有效的请求方法。总之,实体头部可以告知接收者它在对什么进行处理。
请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。
实体头域包含关于实体的原信息,实体头包括信息性头部Allow、Location,内容头部Content-Base.Content-Encoding、Content-Language、 Content-Length、 Content-Location、 Content-MD5Content-Range、Content-Type,缓存头部Etag、Expires、 Last-Modified、extension-header。
会话:客户端向服务器端发起请求到服务端响应客户端请求的全过程。
会话跟踪:会话追踪指的是服务器对用户响应的监视。
在实际的应用中,客户端往往会发出一系列请求,接着服务器端对每个请求进行响应。对于这些请求响应,如果每次都经过一个单独的TCP连接发送,称为非持久连接。反之,如果每次都经过相同的TCP连接进行发送,称为持久连接。
非持久连接给服务器带来了沉重的负担,每台服务器可能同时面对数以百计甚至更多的请求。持久连接就是为了解决这些问题,其特点是一直保持TCP连接状态,直到遇到明确的中断要求之后再中断连接。持久连接减少了通信开销,节省了通信量。
HTTP条件GET是HTTP 协议为了减少不必要的带宽浪费,提出的一种方案
HTTP条件GET 使用时机:客户端之前已经访问过某网站,并打算再次访问该站点。
HTTP 条件GET 使用的方法:客户端向服务器发送一个包询问是否在上一次访问网站的时间后是否更改了页面,如果服务器没有更新,显然不需要把整个网页传给客户端,客户端只要使用本地缓存即可,如果服务器对照客户端给出的时间已经更新了客户端请求的网页,则发送这个更新了的网页给用户。
HTTP协议采用请求/响应模式,客户端向服务器发送一个请求报文,然后服务器响应请求。一次HTTP请求的过程: