http1.1简要介绍

最近做到一个项目要求从IP照相机上读取图像到本地加以处理。这就涉及到网络通讯的问题,而我对网络通讯基本是菜鸟,以前做图像处理用到的图像都是本地摄像头抓取的,而这次要求用到http网络协议。

  说到网络协议,自然就让人联想到http了,而这也是我要用到的。所以我还是规规矩矩,先读一读http1.1的协议书. http1.1协议书有176页,要把所有问题都搞明白也不是一时半会儿的问题。对于我来讲,也没有这个必要。所以,只要掌握一些基本的概念,能用起来就行。
  Http协议是TCP/IP应用层协议。自1990年起,已经被应用于万维网全球信息服务系统。它是一种基于请求/响应(request/response)式的协议,即客户端(Userclient,如你所使用的浏览器)要访问网络上的资源或服务时,即向拥有该资源或服务的服务器发送请求(Request).服务器接到请求后,对请求内容加以分析并返回响应(response)信息。

  1. 消息总共有4个组成部分。其格式如下:

    generic-message = start-line
    *(message-header CRLF)
    CRLF
    [ message-body ]

    o 第一部分为起始行,根据消息的类型其内容也不同,但是其中一定涵盖本条消息的最重要讯息。比如对于请求消息,起始行中就包括了url地址;对于响应消息,起始行中包含着服务器对于请求的响应结果。
    o 第二部分是消息的头文件。包括一个或者多个头域。HTTP的头域包括通用头,请求头,响应头和实体头四类。其中,请求消息的头组成为:通用头,请求头,实体头;响应消息的头组成为:通用头,响应头,实体头。
    o 第三部分什么都没有,就是一空行。用以作为头和消息主体之间的分割指示。
    o 第四部分为消息的主体信息。对于我们抓取图像来讲,请求消息的主体实际上是空的,而返回的响应消息的主体则是图像本身。

  2. 通用头和实体头(General header & Entityheader)
    在对请求和响应作介绍之前,让我们先来看看在这两类消息中都出现的两类头域。 即通用头和实体头.

    • 通用头,通用头又由以下几个通用头域组成,一个域实际上是一个键值对。其基本格式是 键名:键值。

      • Cache-Control头域
        指定请求消息所遵循的缓存机制。
      • Date 头域
        表示消息发送的世界标准时间.
      • Transfer-Encoding头域
        指明对本消息体所作的编码,这个和后面讲到的Content-Encoding头域不一样,Transfer-Encoding是为了在发送端和接受端之间安全传送数据,而对消息主体进行一定的转换,常用的转换方式为chunked,就是对消息主体进行分块。 而Content-Encoding是对实体进行的压缩方式。
      • Connection头域
        Connection头域有两个可能值。Close告诉服务器在完成本次请求的响应后断开连接。Keepalive告诉服务器,在完成本次请求的响应后,保持连接,等待后续请求。
      • 其余的通用头域不一一介绍了
    • 实体头

      • Allow头域
        指明请求的URI资源所允许的用户操作方法。 一般出现在响应消息中,是由服务器发给用户端,指明对于当前资源,用户可以采取哪些操作。 例如,Allow: GET, HEAD,PUT。 在使用“PUT”方法的请求中,由于此方法是将请求消息中的实体上传到服务器并在其中建立一个由用户给定的URI指向该资源,所以此时请求消息也可以包含此头域。
      • Content-Encoding头域
        见上面Transfer-Encoding和下面Accept-Encoding.
      • Content-Length头域
        消息实体的八位字节长度。注意是消息实体的长度而不是整个消息的长度,在我们的图像中,则是返回的图像的大小。
      • Content-Location头域
        这一项比较难以理解,http1.1的协议书上说得也不是很清楚,所以不同的浏览器对此有不同的理解。Content-Location所包含的也是一个URI,有的浏览器将此URI作为请求资源的镜像,但是协议书中又说其值可以作为消息实体的BaseURI,很显然BaseURI 和请求资源本身的URI不一定指向一个内容。我的理解是对于请求的某一资源,可能网络上有关于此资源的不同的变体,比如一篇文章可能有中文,英文不同的版本。这些变体可以单独存在单独访问,当一个变体被访问时,其他变种的URI便可以被包含在响应消息的Content-Location头域中。
      • Content-Range 头域
        用于指定传输的消息实体在整个实体中的位置,这个主要用于指定该响应包含的部分对象为整个对象的哪个部分。 比如我们用Flashget多线程下载文件时,可以把整个实体切割为多个部分,这样每个响应就包含了它所涵盖的内容在整个文件中的相对位置,下载完之后就可以把各部分连接成一个整体了。
      • Content-Type头域
        实体的媒体类型, 如Content-Type: application/xml
  3. 请求

    • 请求行

      • 请求消息的起始行称为请求行(requestline).
        Request-Line =Method SP Request-URI SP HTTP-Version CRLF
        [SP 是指space,空格。CRLF 行结束符,回车。]
        method是要求作用于网络资源的方法。http协议中给出了8中给定方法外加一种可扩展方法。比如”POST”方法是向指定的URI提交内容,这个内容就包含在请求消息的第4部分,即请求消息的主体。服务器会对提交的内容加以处理,比如说我们在论坛上回帖。 另一种常见的方法是”GET”方法,只获取资源而不对资源作任何修改,我们这里抓取图像就是用的这个方法,由于它不对资源进行修改,其消息的主体是空的。”PUT”方法类似于“POST”,将资源上传给服务器,并在其中创建指定的URI用以指向该资源。其余的方法就不做一一介绍了。
        Request-URI 是指向资源的通用资源标志符。
        Http-Version是使用的http协议的版本,一般都是http/1.1.
        最后给出一个请求行的例子:
        GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
    • 请求头
      请求消息的头由通用头(generalheader),请求头(requestheader)和实体头(entityheader)组成。通用头,和实体头已在上面作了介绍,下面介绍请求头的各项头域。

      • Accept头域
        指定接受的媒体类型。比如我们可以把接收媒体类型定义为:
        Accept: “image/*”;
        “*”表示接受各种类型的图像。
      • Accept-Charset头域
        通知服务器用户端可读取的字符集。 一个字符集是一套指定字符和对应八位字节之间的转换的对应列表。
      • Accept-Encoding头域
        请求消息的Accept-Encoding是对应于响应消息的Content-Encoding头域的。他用来告诉服务器哪种类型的压缩是可以接受的。Accept-Encoding和Content-Encoding的压缩方式有:gzip, compress, deflate和identity(表示只采用特定媒体类型的编码而无压缩)。
      • Accept-Language头域
        是指定可接受的响应所包含的人类语言。
      • Authorization头域
        包含一些服务器所需要的认证信息,比如用户名和密码
      • Host头域
        客户端指定自己想访问的服务器的域名和端口号。通过请求行中的Request-URI获得,比如对于上面给出的GEThttp://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
        Host为:Host: www.w3.org
      • Proxy-Authorization头域
        对于使用代理服务器的用户,如果代理服务器要求身份验证,则要填写这一项的认证信息。
      • Referer 头域
        这是一个错别字,英文中并没有referer这个词,其实他表示的是referrer,而由于在早期的http协议中使用了这个错别字,为了向后兼容,就只好将错就错,仍然使用了referer。
        它的值是一个URI网址,用于指定你从什么地方链接到你所请求的资源。通常我们在一个网页里面点击一个链接,则当前的网址就是referer的值,如果我们是通过自己输入网址向服务器发送请求,则这一项为空。
      • User-Agent 头域
        向服务器提供产生此请求的客户端程序,比如User-Agent:Mozilla/5.0。
      • 其余各项就不一一说明了。
  4. 响应

    • 状态行

      • 响应消息的起始行称为状态行,其格式为:
        Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
        HTTP-Version就是Http服务器所采用的http版本信息,一般是Http/1.1
        Status-Code是一个三位整数,根据不同的响应结果其值也不相同。三位整数中的第一位数字对应某一类的响应结果。比如以1开头的1xx表示请求接受,正在进行继续处理。 2xx则表示请求成功,请求的操作已被执行。 3xx表示从定向,需要后续操作来完成该请求。4xx则是指示客户端错误,请求中包含错误的语法或服务器不能满足请求的操作。 5xx表示服务器错误,服务器不能满足正确的请求. Reason-Phrase是对Status-Code的简短文字说明。最常见响应消息的状态行是 HTTP/1.1 200 OK
    • 响应头

      • Accept-Ranges
        服务器告诉用户是否接受用户发送的服务器中某个实体的一部分,用以完整其实体。
      • Age头域
        当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
      • ETage头域
        指示资源是否被修改。比如前一次请求某个 html文件时,获得了其 ETag,当这次又请求这个文件时, 浏览器就会把先前获得的ETag 值发送给服务器,然后服务器会把这个 ETag 跟该文件的当前ETag 进行对比,然后就知道这个文件有没有改变了。
      • Location头域
        用于从定向请求的内容,不如用户要求的资源已经被移动的别的地方的时候,则返回新的位置。
      • Proxy-Authenticate头域
        代理服务器响应客户端程序,要求其提供代理身份验证信息。 和proxy-Authorization请求头域对应。
      • Server头域
        服务器表明自己使用的软件及版本信息。如Server:Apache/2.0.61(Unix)和User-Agent 请求头域对应。
      • WWW-Authenticate 头域
        服务器响应客户端程序,要求其提供身份验证信息给服务器,类似于proxy-Authenticate, 与Authorization请求头域对应。
  5. 实例

    • 好了,最后然我们给出一组请求和相应的完整实例吧
    • Request:
      GET /analytics/images/logo_ga.gif HTTP/1.1
      Host: www.google.com
      User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5
      Accept: image/png,image/;q=0.8,/*;q=0.5
      Accept-Language: en-us
      Accept-Encoding: gzip,deflate
      Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
      Keep-Alive: 300
      Connection: keep-alive
      Referer: http://www.google.com/analytics/
      Cookie:__utma=173272373.1345292232322261000.1229975695.1229975695.1229975695.1;__utmb=173272373.1.10.1229975695; __utmc=173272373;__utmz=173272373.1229975695.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PREF=ID=fbd55a95cc612355:TM=1229975691:LM=1229975691:S=i5A2sLvLEz14KEtp
      Response:
      HTTP/1.1 200 OK
      Content-Type: image/gif
      Last-Modified: Tue, 08 May 2007 15:11:17 GMT
      Expires: Sun, 17 Jan 2038 19:14:07 GMT
      Cache-Control: public
      Date: Mon, 22 Dec 2008 19:54:52 GMT
      Server: gws
      Content-Length: 2478
      Age: 20213
      [Message body data here]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值