协议实战系列:-HTTP协议简介
题记 :
在实际开发中,频繁的接触网络请求,通信传输等, 而做为开发者对常用协议的使用,掌握已是每个开发者的必备技能,下面我们一起学习下。常用的一些开发协议,HTTP协议,Samba协议,Webdav 协议,以及DLNA等协议。
一、HTTP协议简介:
什么是HTTP?全称是HyperText Transfer Protocal,即:超文本传输协议,从1990年开始就在WWW上广泛应用,是现今在WWW上应用最多的协议,常用的有1.0 ,1.1 ,目前使用的版本是1.1。Http 协议是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
Http是应用层协议,当你上网浏览网页的时候,浏览器和Web服务器之间就会通过HTTP在Internet上进行数据的发送和接收。
Http是一个基于请求/响应模式的、无状态的协议。即我们通常所说的Request/Response。
二、TCP协议基础知识介绍:
完成三次握手,主机A与主机B开始传送数据。
由于http处于最上层的应用层,所以其HTTP报文需要经过多次封装,才能在网络间传递
三、HTTP协议版本区别:
HTTP目前常用的版本有1.0, 1.1;HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常 的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道 客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
四、HTTP URL
HTTP URL格式如下:
http://host[“:”port][abs_path]
其中HTTP表示要通过HTTP协议来定位网络资源。host表示合法的Internet主机域名或IP地址。port用于指定一个端口号,拥有被请求资源服务器主机监听该端口的TCP连接,如果port是空的,或者没有给出,则使用默认的缺省值80.abs_path表示指定请求资源的URI(Uniform Resource Identifier,统一资源标示符),如果URL中没有给出abs_path,那么当他作为请求URI时,必须以”/”的形式给出。
五、HTTP 消息格式
消息头:用于描述客户端请求哪台主机,以及客户端的一些环境信息等。如上图所示,我们是通过post方式,使用的HTTP版本号http1.1, 主机是:localhost,即本地主机。实体信息:test。
常用请求消息头 :
Accept: text/html,image/* 说明浏览器接受的数据类型
Accept-Charset: ISO-8859-1 说明浏览器使用的字符编码
Accept-Encoding: gzip,compress 说明浏览器支持的压缩格式
Accept-Language: en-us,zh-cn 说明浏览器的语言环境
Host: www.it315.org:80 说明浏览器要访问的主机名
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT 文件的修改事件,用于做缓存
Referer: http://www.it315.org/index.jsp 说明请求来自哪里,防盗链 (做实验)
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 说明浏览器内核
Cookie 向服务器发送Cookie
Connection: close/Keep-Alive 说明连接状态
Date: Tue, 11 Jul 2000 18:23:51 GMT 客户端计算机时间
HTTP 1.1 新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE和CONNECT方法。
但常用的只有post,get。其它几种方式基本都用不到,这两种方式也有很大 的区别以及不同的适用场景。
常用的方法含义:
GET:获得资源 【不含entity-body】
HEAD:获得文档头部,开发时使用 【不含entity-body】
POST:向服务器发送需要处理的数据 【含entity-body】
PUT:将请求主体放存储在服务器上,比如上传一个图片 【含entity-body】
DELETE:从服务器上删除一个资源,比如删除一个图片 【不含entity-body】
OPTIONS:在服务器上执行哪些方法 【不含entity-body】
TRACE:对可能经过代理服务器传送到服务器上去的报文进行追踪 【不含entity-body】
get方式与post 方式区别:
1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST 方法是把提交的数据放在HTTP包的Body中.
2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可 以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
以被缓存w e为了比较这两种方式,我写了一个web 测试项目,在此工程中有一个1.html。关键代码如下:
<body> <form method="post" action="/1.html"> <input type="text" name="user" /> <input type="submit" value="submit" /> </form> </body>
body中有一个表单,通过form的method指定表单的提交方式分别为post,get。运行情况如下:
get方式:
post方式:
请大家注意观察上面两幅图的地址栏与httpwatch中的请求头,实体信息行。
2. HTTP 响应:
在接受和处理消息后,服务器会返回一个HTTP响应消息。与HTTP请求类似,HTTP响应也由三个部分组成,分别是: 状态行,消息报头,响应正文。
状态行:用于描述服务器对请求的处理结果。HTTP-Version Status-Code Reason-Phrase CRLF ,如: HTTP/1.1 200 OK (CRLF)
消息头 :用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据
实体内容代表服务器向客户端回送的数据
http常用响应头
Content-Length: 80 通知浏览器发送数据的长度
Content-Language: zh-cn 通知浏览器语言环境
Content-Type: text/html; charset=GB2312 通知浏览器文件的格式和编码
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT 告诉浏览器文件的修改时间
Refresh: 1;url=http://www.it315.org 通知浏览器自动刷新
Content-Disposition: attachment; filename=aaa.zip 通知浏览器以下载的方式打开资源
Set-Cookie:SS=Q0=5Lb_nQ; path=/search 发cookie
Expires: -1//3种禁止缓存的头字段
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive 连接状态
Date: Tue, 11 Jul 2000 18:23:51 GMT 系统时间
HTTP状态码:
常见HTTP状态码:
200——请求成功
301——资源(网页等)被永久转移到其他URL
302——跳转,跳转地址通过响应头中的Location属性指定
400——客户端请求有语法错误,不能被服务器识别
403——服务器收到请求,但是拒绝提供服务(认证失败)
404——请求的资源(网页等)不存在
500——内部服务器错误
503——服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常
HTTP支持两种建立连接的方式:非持久连接和持久连接(HTTP1.1默认的连接方式为持久连接):
非持久连接:
让我们查看一下非持久连接情况下从服务器到客户传送一个Web页面的步骤。假设该页面由1个基本HTML文件和10个JPEG图像构成,而且所有这些对象都存放在同一台服务器主机中。再假设该基本HTML文件的URL为:http://www.baidu.com。
下面是具体步骡:
1) HTTP客户初始化一个与服务器主机http://www.baidu.com中的HTTP服务器的TCP连接。HTTP服务器使用默认端口号80监听来自HTTP客户的连接建立请求。
2) HTTP客户经由与TCP连接相关联的本地套接字发出—个HTTP请求消息。这个消息中包含路径名/somepath/index.html。
3) HTTP服务器经由与TCP连接相关联的本地套接字接收这个请求消息,再从服务器主机的内存或硬盘中取出对象/somepath/index.html,经由同一个套接字发出包含该对象的响应消息。
4) HTTP服务器告知TCP关闭这个TCP连接(不过TCP要到客户收到刚才这个响应消息之后才会真正终止这个连接)。
5) HTTP客户经由同一个套接字接收这个响应消息。TCP连接随后终止。该消息标明所封装的对象是一个HTML文件。客户从中取出这个文件,加以分析后发现其中有10个JPEG对象的引用。
6) 给每一个引用到的JPEG对象重复步骡1-4。
上述步骤之所以称为使用非持久连接,原因是每次服务器发出一个对象后,相应的TCP连接就被关闭,也就是说每个连接都没有持续到可用于传送其他对象。每个TCP连接只用于传输一个请求消息和一个响应消息。就上述例子而言,用户每请求一次那个web页面,就产生11个TCP连接。
持久连接:
非持久连接的缺点
1) 客户得为每个待请求的对象建立并维护一个新的连接。对于每个这样的连接,TCP得在客户端和服务器端分配TCP缓冲区,并维持TCP变量。对于有可能同时为来自数百个不同客户的请求提供服务的web服务器来说,这会严重增加其负担。
2) 如前所述,每个对象都有2个RTT的响应延长——一个RTT用于建立TCP连接,另—个RTT用于请求和接收对象。
3) 每个对象都遭受TCP缓启动,因为每个TCP连接都起始于缓启动阶段。不过并行TCP连接的使用能够部分减轻RTT延迟和缓启动延迟的影响。
而在持久连接情况下,服务器在发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。整个Web页面(上例中为包含一个基本HTMLL文件和10个图像的页面)自不用说可以通过单个持久TCP连接发送:甚至存放在同一个服务器中的多个web页面也可以通过单个持久TCP连接发送。
参考文章:http://www.cnblogs.com/byghui/archive/2013/03/21/2969535.html
http://www.cnblogs.com/rosesmall/archive/2012/04/09/2439726.html
http://z1041950008.iteye.com/blog/2190509