HTTP简介

HTTPHyperText Transfer Protocol),即超文本传输协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。通过HTTP协议,服务器端可以将用户请求的资源(包括图片,文本,多媒体文件等)以一定的格式显示在浏览器上。


HTTP协议版本

http0.9

只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。已不再使用。

http/1.0

     1、引入了MIME技术,使得能够支持多媒体功能

     2、引入keep-alive

http/1.0至今仍被广泛采用,特别是在代理服务器中。

http/1.1

持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。

HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:

     缓存处理

     带宽优化及网络连接的使用

     错误通知的管理

     消息在网络中的发送

     互联网地址的维护

     安全性及完整性


统一资源标识符URI

URI是uniform resource identifier的缩写,统一资源标识符,用来唯一的标识一个资源。URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。我们一般都使用URL来定位所请求的资源。


URL的通用语法:

<scheme>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>

用字符?将其与URL的其余部分分隔开来.例如?key1=value1&key2=value2 片段制定了URL资源中的某个章节

例如:ftp://prep.ai.mit.edu/pub/gnu;type=d

            http://www.joes-hardware.com/inventory-check.cgi?item=12345


HTTP的一次响应过程

wKioL1WSoNDRRB3hAAFFY_xCIIM478.jpg

    1)建立连接

    2)接收请求

    3)处理请求

    4)访问资源

    5)构建响应报文

    6)发送响应

    7)记录日志


Cookie

这个东西由网景公司发明,用来辨别用户身份,存储在客户端中,由浏览器来维护。由于HTTP协议是无状态的,即每一次的资源请求都是独立的,服务器不知道客户端上一次的请求做了什么,这阻碍了交互式Web应用程序的实现,然后cookie就出现了。

当用户第一次访问网站时,服务器进程会为用户生成一个唯一的标识信息,并且将这个标识信息添加到响应报文的首部予以响应(setCookie),客户端收到这个Cookie信息后,就把这个Cookie信息保存至浏览器进程能够访问到的缓存目录下,并把它保存为一个小文件,只要浏览器不关闭,访问同一个域名下的每一个链接时,浏览器在发送的请求报文中置一个首部,这个首部就是Cookie或者Cookie2。服务器端收到这个Cookie后,即可识别客户端。


Http的连接管理

对于Http的连接管理,涉及到很多概念,这里简单解释两种,其一:并行连接;其二:持久连接。

1、并行连接:一个完整的HTML页面包括很多个资源,由各种格式的图片,js文件,css样式文件,文本信息....,每一个资源的请求都是独立的,如果一个一个加载,会显得非常慢;所以,Http支持并行的加载,即同时加载很多个资源,这样给用户的体验是,整个页面都在加载,显得很“快”(这是个错觉:)),并行连接会受到带宽的限制,因为如果带宽一定,会出现多个连接争夺带宽的情况。

2、持久连接用户在短时间内请求多个同一个站点的资源,例如请求一个完整的HTML页面,里面包括了很多个资源,如果没一个资源的请求都需要3次握手建立连接,资源收到之后4次断开,这样响应的速度会非常慢。因此,HTTP/1.1(及HTTP/1.0)允许HTTP设备在事务处理结束之后将TCP连接保持在打开的状态,以便下一个HTTP请求重用现在的连接,直到客户端或服务器端决定将其关闭为止。

     实现持久连接的常见方式就是keep-alive(在HTTP/1.0开始出现),即在Request Header中添加一个名为Connection:Keep-Alive的首选项,服务器端在应答的时候如果支持,则在首选项中也添加一个名为Connection:Keep-Alive的首部,如果没有,客户端则认为服务器端不支持持久连接。


HTTP请求报文和响应报文

一个HTTP报文由3部分组成,分别是:

  (1)、起始行(start line)

  (2)、首部(header)

  (3)、主体(body)

HTTP请求报文格式

<method> <request-URL> <version>
<headers>

<entity-body>

wKioL1WSq6XzeZ-8AAET2bk6NPU367.jpg

<method>             #请求方法,希望对服务器端的资源执行的动作

<request-URL>     #请求的资源的URL

<version>              #报文所使用的HTTP版本,格式HTTP/<major>.<minor>,通常都是HTTP/1.1

<headers>             #请求首部,下面是各种请求首部

<entity-body>       #实体,一般是数据块,请求的报文一般实体为空


HTTP响应报文格式

<version> <status> <reason-phrase>
<headers>

<entity-body>

wKioL1WSq63DX6tXAAErfkvC0WU494.jpg

<version>              #同上

<status>                #状态码。这三个数字描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述

                         #状态的一般类别("成功"、"出错"等)。

<reason-phrase>  #原因短语,数字状态码的可读版本

<headers>             #响应首部

<entity-body>       #同上


1)请求行

1.1方法

以下是各种请求报文中的方法:

get          #用于请求服务器发送某个资源,为安全方法,该方法对应的主体为空

head       #与GET方法类似,但服务器在响应中只返回首部,不会返回实体的主体部分.使用HEAD可以做到在不获取资

               #源的情况下了解资源的情况,通过查看响应中的状态码,看看某个对象是否存在,通过查看首部,测试资源是

               #否被修改了。

put         #PUT方法往服务器写入文档,该方法的语义就是用让服务器用主体部分来创建或替代一个由所请

               #求的URL命名的新文档。存在实体内容。

post        #向服务器发送数据,常用于POST HTML的表单数据,存在主体内容

trace       #由于客户端发起的请求在经过中间节点时,可能会进行修改.。服务器收到该请求时会返回一个TRACE

               #响应,该响应主体中携带它收到的原始请求报文。主体为空

options   #询问服务器支持的各种功能,主体为空

delete     #请求服务器删除指定文档,主体为空

lock         #允许用户锁定资源,该方法为扩展方法

mkcol      #允许用户创建资源,该方法为扩展方法

copy        #便于在服务器上复制资源,该方法为扩展方法

move       #在服务器上移动资源,该方法为扩展方法

1.2request-URL

1.3版本version

版本号会以HTTP/x.y 的形式出现在请求和响应报文的起始行中。为HTTP应用程序提供了一种将自己遵循的协议版本告知对方的方式。版本号说明了应用程序支持的最高HTTP版本。


1.4状态码

告诉客户响应结果,以下是状态码的说明:

100~199 信息性状态码

200~199 成功状态码

300~399 重定向状态码

400~499 客户端错误状态码

500~599 服务器错误状态码

常用的状态码有:200:OK;201:CREATED(上传成功);301: Moved Permanently(永久重定向);302: Found(临时重定向,会在响应报文中使用“Location: 新位置”);304: Not Modified;403:Forbidden(被禁止的);404: Not Found;405: Method Not Allowed;500:Internal Server Error(服务器内部错误);502:Bad Gateway(代理服务器从上游服务器收到一条伪响应);503:Service Unavailable(服务暂时不可用)。


1.5原因短语

原因短语是响应起始行中的最后一个组件。它为状态码提供了文本形式的解释。比如在HTTP/1.0 200 OK 中,OK就是原因短语。原因短语和状态码是成对出现的。原因短语是状态码的可读版本,应用程序开发者将其传送给用户,用以说明请求期间发生了什么情况。


2)首部

首部是HTTP报文中的一些附加信息,提供报文的相关信息。一个HTTP报文中可以包含0个或多个首部,一个首部包括属性和其相对应的值。下面简单介绍下各种首部。

2.1通用首部

通用首部可以应用于任何报文中

2.1.1通用信息首部

Connection           #允许客户端和服务器指定与请求/响应连接有关的选项,所有Connection中列出的首部类型,在

                              #报文转发时必须被删除!

Date                      #报文什么时间创建的

MIME-Version       #给出了发送端使用的MIME版本

Trailer                    #如果报文采用了分块传输编码方式(chunked transfer encoding),就可以用这个首部列出位于

                              #报文拖挂(trailer)部分的首部集合

Transfer-Encoding #告知接收端为了保证报文的可靠传输,对报文采取了什么编码方式

Update                  #给出发送端可能想要转换的新版本或新协议

Via                         #显示了报文经过的中间节点

2.1.2通用缓存首部

Cache-Control       #用于随报文传输缓存指示

Pragma                  #另一种随报文传送指示的方式,但不专用于缓存


2.2请求首部

请求报文中的首部

2.2.1请求信息首部

Client-IP         #客户端的IP

From               #客户端用户的E-mail

Host                #接收请求的服务器的主机名和端口号

Referer           #包含当前请求URI的文档的URL

UA-Color        #给出了客户端CPU的类型或制造商

UA-Disp          #给出了与客户端显示器能力有关的信息

UA-OS            #给出了运行在客户端上的操作系统名称与版本

UA-Pixels        #提供了客户端显示器的像素信息

User-Agent     #将发起请求的应用程序名称告知服务器

2.2.2Accept首部

Accept                      #告诉服务器能够发送哪些媒体类型

Accept-Charset        #告诉服务器能够发送哪些字符集

Accept-Encoding     #告诉服务器能够发送哪些编码格式

Accept-Language    #告诉服务器能够发送哪些语言

TE                             #告诉服务器可以使用哪些扩展传输编码

2.2.3条件请求首部

Expect                         #允许客户端列出某请求所要求的服务器行为

If-Match                     #如果实体标记与文档当前的实体标记相匹配,就获取这份文档

If-Modified-Since       #除非在某个指定的日期之后资源被修改,否则就限制这个请求

If-None-Match           #如果提供的实体标记与当前文档的实体标记不相符,就获取文档

If-Range                     #允许对文档的某个范围进行条件请求

If-Unmodified-Since  #除非在某个指定日期之后资源没有被修改过,否则就限制这个请求

range                          #如果服务器支持范围请求,就请求资源的指定范围

2.2.4安全请求首部

Authorizatin                #包含了客户端提供给服务器的身份认证数据

Cookie                        #客户端用它向服务器传送一个令牌

Cookie2                      #说明请求端支持的cookie版本

2.2.5代理请求首部

Max-Forward                #最大转发次数,与TRACE方法一起使用

Proxy-Authorization     #与代理服务器进行认证时的身份数据

Proxy-Connection        #在与代理建立连接时使用的Connection首部,它主要用于克服Connection

                                     #首部不被一些代理支持的问题


2.3响应首部

响应报文中的首部

2.3.1响应信息首部

Age                                #响应持续时间

Public                             #服务器为其资源支持的请求方法列表

Retry-After                    #如果资源不可用的话,在此日期或时间重试

Server                            #服务器应用程序软件的名称和版本

Title对HTML                  #文档来说,就是HTML的title标签的内容能够

Warning                        #比原因短语更详细的警告报文

2.3.2协商首部

Accept-Range              #对此资源来说,服务器可接受的范围类型

Vary                              #服务器查看的其他首部的列表

2.3.3安全响应首部

Proxy-Authenticate      #来自代理的对客户端的质询列表

Set-Cookie                   #在客户端设置一个令牌,以便服务端对客户端的识别

Set-Cookie2                 #与Set-Cookie类似

WWW-Authenticate    #来自服务器的对客户端的质询列表


2.4实体首部

实体首部提供了有关实体及其内容的大量信息

2.4.1实体信息首部

Allow                         #列出了可以对此实体执行的请求方法

Location                    #告知客户端实体实际上处于何处;用于将接收端重定位到资源的新URL上去

2.4.2内容首部

Content-Base             #解析主体中的相对URL时使用的基础URL

Content-Encoding     #对主体执行的任意编码方式

Content-Language    #理解主体时最适宜使用的自然语言

Content-Length         #主体的长度

Content-Location      #资源实际所处的位置

Content-MD5            #主体的MD5校验和

Content-Range          #在整个资源中此实体表示的字节范围

Content-Type            #这个主体的对象类型

2.4.3实体缓存首部

ETag                           #于此实体相关的实体标记

Expires                       #实体不再有效,要从原始处在此获取次实体的日期和时间

Last-Modified            #这个实体最后一次被修改的日期和时间


3)实体部分

实体部分中的内容即为报文的数据部分,即为正真要传输的数据,当然数据可以是很多种,图片,文字,视频,音频,电子邮件等。


参考:http://lujun9972.github.io/linux/http%E5%9F%BA%E7%A1%80/

          http://www.cnblogs.com/kissdodog/archive/2013/04/01/2993228.html