您的位置:首页 > 理论基础 > 计算机网络

HTTP基础

2015-06-30 21:46 603 查看
HTTP简介

HTTP(HyperText 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的一次响应过程



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>


<method> #请求方法,希望对服务器端的资源执行的动作<request-URL> #请求的资源的URL<version> #报文所使用的HTTP版本,格式HTTP/<major>.<minor>,通常都是HTTP/1.1<headers> #请求首部,下面是各种请求首部<entity-body> #实体,一般是数据块,请求的报文一般实体为空
HTTP响应报文格式
<version> <status> <reason-phrase>
<headers>

<entity-body>



<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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息