协议实战系列(一)------HTTP协议简介


                       协议实战系列:-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协议基础知识介绍:

        手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。
         1. TCP连接:
          建立起一个TCP连接需要经过“三次握手”:  如图
             
       
       第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
       第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包
       第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
完成三次握手,主机A与主机B开始传送数据。 

   2.  协议层次:
               http是应用层的协议,地位类似于SMTP FTP等,是构建在传输层协议TCP之上       
       3. 数据封装 
        由于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 消息格式

        HTTP 消息分为:HTTP 请求和HTTP响应
        1. HTTP 请求:
                 客户端通过发送HTTP请求向服务器请求对资源的访问,HTTP由三部分组成,分别是:请求行,消息报头,请求正文。
                  
                   
        请求行 用于描述客户端的请求方式、请求的资源名称,以及使用的HTTP协议版本号;Method Request-URI HTTP-Version CRLF

        消息头用于描述客户端请求哪台主机,以及客户端的一些环境信息等。如上图所示,我们是通过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    客户端计算机时间

       实体内容(消息体)  浏览器向服务器发送的数据,例如上传的文件、提交的表单等。
        1)HTTP请求方式:
          HTTP 1.0 定义了三种请求方法:GET、POST和HEAD方法。
          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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值