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

  • 相关阅读:
    把信贷风险管理浓缩为50个要点(赶紧收藏吧)!
    AjaxControlToolkit没有通过WebResource.axd加载css导致ajaxToolkit:TabPanel无法显示正确的样式
    启动vmware中的虚拟机的时候,提示Failed to lock the file
    linq to xml There are multiple root elements.
    How to create a List of ValueTuple?
    SET IDENTITY_INSERT 和 DBCC CHECKIDENT
    NOT IN clause and NULL values
    ASP.NET Session and Forms Authentication and Session Fixation
    asp.net下的cookieName
    flywaydb and sql server
  • 原文地址:https://www.cnblogs.com/dytl/p/3739480.html
Copyright © 2011-2022 走看看