HTTP简介
HTTP(HyperText Transfer Protocol),即超文本传输协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。通过HTTP协议,服务器端可以将用户请求的资源(包括图片,文本,多媒体文件等)以一定的格式显示在浏览器上。
HTTP协议版本
http0.9
只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。已不再使用。
http/1.0
引入了MIME技术,使得能够支持多媒体功能
引入keep-alive
至今仍被广泛采用,特别是在代理服务器中。
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就出现了。
当用户第一次访问网站时,服务器进程会为用户生成一个唯一的标识信息,并且将这个标识信息添加到响应报文的首部予以响应(),客户端收到这个Cookie信息后,就把这个Cookie信息保存至浏览器进程能够访问到的缓存目录下,并把它保存为一个小文件,只要浏览器不关闭,访问同一个域名下的每一个链接时,浏览器在发送请求报文时,在请求报文中置一个首部,这个首部就是Cookie或者Cookie2。服务器端收到这个Cookie后,就可以识别客户端。
Http的连接管理
对于Http的连接管理,涉及到很多概念,这里简单解释两种,其一:并行连接;其二:持久连接。
并行连接:一个完整的HTML页面包括很多个资源,由各种格式的图片,js文件,css样式文件,文本信息....,每一个资源的请求都是独立的,如果一个一个加载,会显得非常慢;所以,Http支持并行的加载,即同时加载很多个资源,这样给用户的体验是,整个页面都在加载,显得很“快”(这是个错觉:)),并行连接会受到带宽的限制,因为如果带宽一定,会出现多个连接争夺带宽的情况。
持久连接:用户在短时间内请求多个同一个站点的资源,例如请求一个完整的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> #实体,一般是数据块,请求的报文一般实体为空
1)请求行
1.1方法
get #用于请求服务器发送某个资源,为安全方法,该方法对应的主体为空
head #与GET方法类似,但服务器在响应中只返回首部,不会返回实体的主体部分. 安全方法,主体为空
#使用HEAD可以做到
#在不获取资源的情况下了解资源的情况
#通过查看响应中的状态码,看看某个对象是否存在
#通过查看首部,测试资源是否被修改了.
put #PUT方法往服务器写入文档,该方法的语义就是用让服务器用主体部分来创建或替代一个由所请
#求的URL命名的新文档.
post #向服务器发送数据,常用于POST HTML的表单数据
trace #
options #
delete #
lock #
mkcol #
copy #
move #
HTTP响应报文格式
<version> <status> <reason-phrase> <headers> <entity-body>
<version>
<status>
<reason-phrase>
<headers>
<entity-body>
参考:http://lujun9972.github.io/linux/http%E5%9F%BA%E7%A1%80/
http://blog.csdn.net/anger_coder/article/details/12794189
原文地址:http://ljbaby.blog.51cto.com/10002758/1669549