zoukankan      html  css  js  c++  java
  • HTTP协议小结

    HTTP/0.9
    已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。

    HTTP/1.0

    这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。
    HTTP/1.1

    当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。

    持久链接:1.1的Connection的默认值是keep-alive, 1.0默认值是close非持久链接

    HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:

        缓存处理
        带宽优化及网络连接的使用
        错误通知的管理
        消息在网络中的发送
        互联网地址的维护
        安全性及完整性


    统一资源标识符:
    http://
    username:passwd
    @www.un.org
    /subdir/file.html
    ?var=value&var2=value2
    #hash

    http://username:passwd@www.un.org/subdir/file.html?var=value&var2=value2#hash
    其中#hash等额外参数 只能发送到前端浏览器,服务器获取不到, 可以用js获取 发送到服务器



    HTTP/1.1协议中共定义了八种方法(也叫“动作”),方法名称是区分大小写的,来以不同方式操作指定的资源:

        OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

        HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部份(内容体)。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
            
        GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。参见安全方法  http规范是不超过255

        POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

        PUT:向指定资源位置上传其最新内容。成功返回201

        DELETE:请求服务器删除Request-URI所标识的资源。

        TRACE:回显服务器收到的请求,主要用于测试或诊断。

        CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

    http格式规范:

    每行,以 结束,header 、content 中间要有一空行

    HTTP 请求
    格式:
    Request line
        GET       /dir/1.html   HTTP/1.1      
        请求方法  资源位置      协议版本
    HTTP headers
         通用 header 、请求 header、实体 header
    Content


    HTTP Response
    格式:
    Status line
         HTTP/1.1 200 OK  

    HTTP headers
        通用 header、响应 header、实体 header
    Content
        <html>...</html>


    响应值:
    100-199:参考信息
    200-299:成功
    300-399:重定向
    400-499:客户端错误
    500-599:服务器错误


    请求 header:
    1,Accept:
       text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
       参数为 Content Type
       q 指定优先级[0-1],0为不接受,默认为1
       如果不指定 */* ,则其他类型优先级为0

       Accept表示浏览器支持的 MIME 类型;
       MIME的英文全称是 Multipurpose Internet Mail Extensions(多功能 Internet 邮件扩充服务),它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。
       text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,subtype 是 type 中范围更明确的类型,即大类中的小类。

    2,Accept-Charset: 浏览器支持的字符编码
          utf-8;q=0.66,*;q=0.6

    3,Accept-Encoding: 浏览器支持的压缩编码
          gzip,deflate,sdch

    4,Accept-Language: 浏览器所支持的语言类型
          zh-CN,zh;q=0.8,en;q=0.6 优先顺序,中文简体,
          zh-cn表示简体中文;zh 表示中文

    5,Authorization: 授权验证
        Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
        401 Unauthorized

        使用HTTP AUTH需要在server端配置http auth信息(一般是webserver启动的时候从配置文件里面读取相关信息)。
        用中文简述一下http auth的过程:
        客户端发送http请求
        服务器发现配置了http auth,于是检查request里面有没有"Authorization"的http header
        如果有,则判断Authorization里面的内容是否在用户列表里面,Authorization header的典型数据为"Authorization: Basic jdhaHY0=",其中Basic表示基础认证, jdhaHY0=是base64编码的"user:passwd"字符串。
        如果没有,或者用户密码不对,则返回http code 401页面给客户端
        标准的http浏览器在收到401页面之后,应该弹出一个对话框让用户输入帐号密码;并在用户点确认的时候再次发出请求,这次请求里面将带上Authorization header

        一次典型的访问场景是:
        浏览器发送http请求(没有Authorization header)
        服务器端返回401页面
        浏览器弹出认证对话框
        用户输入帐号密码,并点确认
        浏览器再次发出http请求(带着Authorization header)
        服务器端认证通过,并返回页面
        浏览器显示页面

        使用http auth的场景不会用cookie,也就是说每次都会送帐号密码信息过去。然后我们都知道base64编码基本上等于明文。这削弱了安全。
        由于种种缺点,http auth现在用的并不多。不过在路由器等场合还是有应用的,原因是http auth最简单,使用起来几乎是零成本。

    6,Cookie: HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。注意,只有cookie的domain和path与请求的URL匹配才会发送这个cookie。
          version=1; skin=new;

          百度首页请求头中的cookie
          Cookie    BDUT=pfc827A04BCD53A0082260624BACA0F9A50A13b031e70272;
                    MCITY=-131%3A; BAIDUID=16FFD38173B664490E853F05898831CA:FG=1;
            BDUSS=VibW5hdW53dk5iM0ZzekFBcUZiVGxaaHJxUUJ2Z2FzdGl2OHpuLUVSR2xGeUJUQVFBQUFBJCQAAAAAAAAAAAEAAACvU9En5~Hn9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKWK-FKlivhSMT;
            H_PS_PSSID=5222_6552_6249_1455_5224_6582_6505_6477_4759_6017_6461_6428_6456_6501_6454_6529_6375;
            BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; BD_CK_SAM=1


    7,User-Agent: Mozilla/5.0 (compatible;域名)
      意思:使用的用户代理是 Mozilla/5.0 (compatible; 域名)。
      详解:
      User-Agent(用户代理),简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
      Mozilla/5.0:Mozilla 是浏览器名,版本是 5.0;
      compatible(兼容的)表示平台是兼容模式;

    8,Host: 域名
      Host表示请求的服务器网址;

    9,TE: 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息
           trailers, deflate

    10,Referer: 先前网页的地址,当前请求网页紧随其后,即来路 ,可用于防盗链
           http://www.sijiaomao.com/

    11,Expect:指客户端要求的特殊服务器行为。若服务器不能理解或者满足 Expect域中的任何期望值,则必须返回417(Expectation Failed)状态
          100-continue

    12,From:发出请求的用户的Email
          genesis@sijiaomao.com

    14,If-Match:如果对象的 ETag 没有改变,其实也就意味着对象没有改变,才执行请求的动作
           "aetaghash"

    15,If-None-Match: 如果对象的 ETag 改变了,其实也就意味着对象也改变了,才执行请求的动作。
           "aetaghash"

    16,If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答,告诉浏览器该对象没有修改
           Sun, 11 May 2014 05:39:55 GMT

    17,If-Unmodified-Since:如果请求的内容在指定的时间之后没修改过,才执行请求的动作(比如返回对象)。
          Sun, 11 May 2014 05:39:55 GMT

    18,If-Range:浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。 浏览器通过发送请求对象的 ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。
          "aetaghash"
          Sun, 11 May 2014 05:39:55 GMT

    19,Max-Forwards:  限制信息通过代理和网关传送的时间
           2

    20,Proxy-Authorization:连接到代理服务器的授权证书
         Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

    21,Range:只请求实体的一部分,指定范围 成功返回206
          bytes=0-499, 1000-1499, 3000-


    22,X-Requested-With: 在服务器端判断request来自Ajax请求还是传统请求
          XMLHttpRequest

    23,X-Forwarded-For: 是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段

                                     中间代理服务器将客户端IP传递给服务器
          client1, proxy1, 192.168.2.125
          
          这一HTTP头一般格式如下:
          X-Forwarded-For: client1, proxy1, proxy2
          其中的值通过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。
          鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。



    响应 header:
    1,Accept-Ranges: 表明服务器是否支持指定范围请求及哪种类型的分段请求
           bytes

    2,Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
           231

    3,Content-Disposition: Content-Disposition 属性是作为对下载文件的一个标识字段
           attachment; filename="example.zip"

           Content-Disposition属性有两种类型:inline 和 attachment  
           inline :将文件内容直接显示在页面
           attachment:弹出对话框让用户下载具体例子   


    4,ETag:请求变量的实体标签的当前值,对象被修改,ETag也会改变,主要供服务器 判断一个对象是否改变了。
           "abcdthisisatag"

    5,Location:用来重定向接收方到非请求URL的位置来完成请求或标识新的资源
           http://www.un.org

    6,Refresh: 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)
           3; url=http://www.sijiaomao.com/

    7,Retry-After:  如果实体暂时不可取,通知客户端在指定时间之后再次尝试
           Tue, 15 Nov 2014 08:12:31 GMT
           200

    8,Server:web服务器软件名称
           "Apache/2.4.2 (Unix)"

    9,Set-Cookie:  设置Http Cookie

          操作中遇到下面问题

          secure=0/false    360,chrome创建不了cookie,火狐能创建 但issecure是true
          issecure=0/false  火狐,360,chrome 都正常

          解释:

    secure httponly 这两个都是只加指令就行,不用赋值

    也就是说 不用设置 secure=0 或 secure=false 
    只要有 secure, 那就是只有https才会有效,没有 secure,那就是httphttps 都有效
    secure 只是限制只能通过https发送回服务器,火狐在有secure时 http下能创建cookie 但不能使用
    HttpOnly  也是,不带赋值的
    例如  Set-Cookie: var=val; Domain=example.com; Path=/; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly


          name=cat; domain=.sjm.org; path=/; expires=Tue, 21 May 2014 12:34:56 GMT; secure; httponly

          name=cat, 需要设置cookie的值(name不能使用“;”和","号),有多个name值时用";"分隔例如:name1=name1; name2=name2
          expires=date: cookie的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"
          path=path: 设置cookie支持的路径,如果path是一个路径,则cookie对这个目录下的所有文件及子目录生效,例如:path="/cgi-bin/",

                            如 果path是一个文件,则cookie指对这个文件生效,例如:path="/cgi-bin/cookie.cgi"。
          domain=domain: 对cookie生效的域名,例如:domain="gzdzw.51.net"
          secure: 如果给出此标志,表示cookie只能通过SSL协议的https服务器来传递。

          httponly,禁止js获取cookie值



    10,Vary:告诉下游代理是使用缓存响应还是从原始服务器请求
           Accept-Language, User-Agent

           Vary: Accept-Encoding 告知缓存代理服务器,客户端请求中发送了不同的 Accept-Encoding 就要缓存不同的版本

           Vary: User-Agent 不合理该禁止,例如不同的浏览器请求相同的内容 会缓存不同的版本





    通用 header

    1,Cache-Control: Cache-Control指定请求和响应遵循的缓存机制
          max-age=600, no-cache="Set-Cookie"

         no-cache="xxx":缓存,但在发回客户端前先作检查,传值则表示不缓存指定的header

         no-store:不缓存任何内容,在IE中=no-cache。

         max-age=120: 缓存最大有效期,秒(Age response header)

         max-stale=600:在缓存过期后还可以继续保存600秒,不赋值则表示可一直有效

         no-transform:禁止缓存代理修改内容

         only-if-cached: 禁止缓存代理访问应用服务器,仅在有缓存时返回内容。

         public: 任何客户端(代理服务器或浏览器)均可缓存

         private: 仅限私有客户端(一般是浏览器)可缓存内容

         must-revalidate: 必须重新验证缓存有效性(默认行为),此指令目的在于显式指明

         proxy-revalidate:代理服务器需要重新验证缓存有效性,浏览器不需要

         s-maxage:指定public客户端上的maxage,private 上忽略。



          在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。
          请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,
          响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。
          网页的缓存通过HTTP消息头中的“Cache-control”来控制,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。

          其作用根据不同的重新浏览方式分为以下几种情况:
          (1)打开新窗口如果指定cache-control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如: Cache-control: max-age=5 表示当访问此网页后的5秒内再次访问不会去服务器。
          (2)在地址栏回车如果值为private或must-revalidate(和网上说的不一样),则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。
          (3)按后退按扭如果值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问。
          (4)按刷新按扭无论为何值,都会重复访问 当指定Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。


    2,Connection: Keep-Alive
      Connection表示客户端与服务连接类型;
      Keep-Alive,表示持久连接;
        close,请求一次后立即关闭

    3,Date: 原始服务器消息发出的时间
         Tue, 21 May 2002 12:34:56 GMT

    4,Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝,相当于 Cache-Control: no-cache。
         no-cache

    5,Keep-Alive:持久连接、连接重用
         300

    6,Trailer: 指出头域在分块传输编码的尾部存在
    Date
    HTTP/1.1 200 OK
    Content-Type: text/html
    Transfer-Encoding: chunked
    Trailer: Date

    05
    line1
    05
    line2
    0
    Date: Tue, 21 May 2012 12:34:56 GMT

    7,Transfer-Encoding: 文件传输编码
         chunked(分块)

    8,Upgrade: 允许服务器指定一种新的协议或者新的协议版本,与响应编码101(切换协议)配合使用。
            HTTP/2.0
            TLS/1.0

    9,Via: 通知中间网关或代理服务器地址,通信协议
          192.168.11.12, example.com
          proxy1, proxy2


    10,Warning:     关于消息实体的警告信息,服务器给客户端发个警告信息
          199 Miscellaneous warning
          110 Response is stale
          112 Disconnected operation
          ...




    实体 header

    1,Allow: 对某网络资源的有效的请求行为,不允许则返回405
         GET, HEAD, POST

    2,Content-MD5: 返回资源的MD5校验值
          ZTFmZDA5MDYyYTMzZGQzMDMxMmIxMjc4YThhNTMyM2I=

    3,Content-Range:在整个返回体中本部分的字节位置
          600-900/1234

    4,Content-Encoding: web服务器支持的返回内容压缩编码类型。
          gzip

    5,Content-Language:响应体的语言
          zh_CN

    6,Content-Length:响应体的长度
          8848

    7,Expires: 响应过期的日期和时间
          Tue, 21 May 2016 12:34:56 GMT

    8,Last-Modified:请求资源的最后修改时间
          Tue, 21 May 2013 12:34:56 GMT

  • 相关阅读:
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(2)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(9)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(10)
    CKEditor在asp.net环境下的使用一例
    《Microsoft Sql server 2008 Internals》读书笔记第五章Table(7)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(11)
    千万数据的连续ID表,快速读取其中指定的某1000条数据?
    javascript中的float运算精度
    .Net与Java的互操作(.NET StockTrader微软官方示例应用程序)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(6)
  • 原文地址:https://www.cnblogs.com/dytl/p/3739480.html
Copyright © 2011-2022 走看看