《图解HTTP》学习笔记

作者: d9fc24a0c9a9 | 来源:发表于2017-10-31 22:38 被阅读65次

    网络基础知识

    URL和URI

    URI(Uniform Resource Idenifier)统一资源标识符。即由某个协议方案标识的资源定位标识符。协议方案是指访问资源所使用的的协议方案名称。使用HTTP协议时,协议方案就是http,此外还有ftp,telnet,file等。

    URI用字符串标识某一互联网资源,而URL标识资源的地点(互联网上所处的位置)。可见URL是URI的子集。

    URI的格式

    绝对URI的格式如下:


    • 协议方案名
        使用http或https等协议方案名获取访问资源时需要指定协议类型。不区分字母大小写,最后附加一个冒号(:)。
    • 登录信息
        指定用户名和密码作为从服务器端获取资源时必要的登录信息,此项是可选项
    • 服务器地址
        使用绝对URI必须指定待访问的服务器地址。服务器地址可以是域名或IP地址
    • 服务器端口号
        指定服务器连接的端口号,此项也是可选项,若省略则自动使用默认端口号。
    • 带层次的文件路径
        指定服务器上的文件路径来定位特定的资源。
    • 查询字符串
        针对已经指定的文件路径内的资源,可以使用查询字符串传入任意参数,此项可选。
    • 片段标识符
        使用片段标识符通常可标记出以获取资源中的子资源(文档内的某个位置),此项也是可选项

    HTTP协议基础

    HTTP请求报文组成

    请求报文是由请求方法,URI,协议版本,可选的请求首部和内容实体构成的。

    HTTP响应报文组成

    x响应报文是由协议版本,状态吗(表示请求结果的数字代码),用于解释状态码的原因短语可选的响应首部字段以及实体主体构成

    HTTP是无状态协议

    HTTP是一种不保存状态的协议,即无状态协议。HTTP协议自身部队请求和响应之间的通信状态保存,也就是说在HTTP这个级别,协议对于发送过的请求和响应都不做持久化处理。

    HTTP的无状态是为了尽快地处理大量食物,确保协议的可伸缩性,但是为了实现期望的保持状态的功能,引入了Cookie技术来保存状态。

    请求URI定位资源

    当客户端请求访问资源而发起请求时,URI需要将作为请求报文中的请求URI包含在内,可以有以下三种方法指定请求的URI:

    • URI作为完整的请求URI

      -在首部字段host中写明网络域名或IP地址
    • 用(星号代替请求的URI)
        除此之外,如果不是访问特定的资源而是对服务器本身发起请求,可以用一个*号来代替URI。

    HTTP方法

    HTTP1.1所支持的方法如下:

    • GET:获取资源
        GET方法用来请求访问已被URI识别的资源。指定的资源经过服务器端解析后返回相应内容。
    • POST:传输实体主体
        POST用来传输实体主体,与GET方法很相近,但是POST的主要目的并不是获取响应的主体内容。
    • PUT:传输文件
        PUT方法用来传输文件,要求在请求报文的主体中包含主体中包含文件内容,然后保存到请求的URI指定的位置。

    由于HTTP/1.1的PUT方法自身不带任何验证机制,任何人都可以上传文件,存在安全问题,因此一般WEB网站不适用该方法。

    • HEADE:获得报文头部
        HEAD方法和GET方法一样,只是不返回报文主体部分,用于确认URI的有效性以及资源更新日期时间等。
    • DELETE
        DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法安请求URI删除指定的资源。

    DELETE方法与PUT方法一样不带验证机制,因此存在安全问题。

    • OPTIONS:询问支持的方法
        OPIONS方法用来查询针对请求URI指定资的资源支持的方法。
    • TRAXE:追踪路径
        TRACE方法是让WEB服务端将之前的请求通信环路回给客户端的方法。

    在发送请求时,在Max_Forwards首部字段中填入数值,没经过一个服务器端该数字就减一,当数值刚好为零,就停止传输,最后接收到请求的服务器端则返回状态码200OK的响应。

    • CONNECT:要求用隧道协议代理代理
        CONNECT方法要求在与代理服务器通信时家里隧道,使用隧道协议进行TCP通信。

    主要是用SSL和TLS协议把通信内容加密后经网络隧道传输。

    HTTP持久连接

    为了解决HTTP初始版本中,每进行一次HTTP通信就要断开一次TCP连接,HTTP/1.1和部分HTTP/1.0提出了持久连接,特点是:只要通信双方任意一端没有明确提出断开连接,则继续保持TCP连接状态

    持久化连接的好处在于减少了TCP重复连接与断开所造成的开销,减轻了服务器端的负载

    管线化

    管线化就是即不用等待响应亦可直接发送下一个请求。


    使用Cookie管理状态

    Cookie技术通过请求和响应报文中写入Cookie信息来控制客户端的状态。

    Cookie会根据从服务器端发送的响应报文内的一个叫做Set_Cookie的首部信息,通知客户端保存Cookie。当客户端下次再往该服务器发送请求时,客户端会在请求报文中加入Cookie值后发送出去。

    服务器端收到客户端发送过来的Cookie后,回去检查究竟是从哪一个客户端发来的请求信息,然后对比服务器上的记录,最后得到之前的状态信息。

    HTTP报文内的HTTP信息

    HTTP报文

    HTTP报文大致可以分为报文首部报文主体两块。两者由最初出现的空行(CR+LF)来划分。通常并不一定有报文主体。

    请求报文与响应报文的结构

    • 请求行
        包含用于请求的方法,请求URI和HTTP版本。
    • 状态行
        包含表明相应结果的状态码,原因短语和HTTP版本。
    • 首部字段
        包含表示请求和响应的各种条件和属性的个另类首部,主要有:通用首部,请求首部和实体首部。

    编码提升传输速率

    HTTP传输数据时既可以按照数据原貌进行传输,也可以在传输过程中通过编码提升传输速率。

    报文主体和实体主体的差异

    • 报文
        报文是HTTP通信的基本单位,由8位组字节流组成通过HTTP通信传输。
    • 实体
        作为请求或响应的有效载荷数据(补充项)被传输,主要有实体首部实体主题组成
        HTTP报文主体用于传输请求或响应的实体主体。

    报文主体和实体主体的差异:通常报文主体等于实体主体,当只有在传输中进行编码操作时,实体主体的内容发生变化时,才导致两者发生差异。

    HTTP的状态码

    状态码的的职责是当客户端向服务器发送请求时,描述返回的请求结果,状态码的类别如下表:。


    image

      下面介绍比较常用的状态码:

    2XX

    2XX的响应结果表明请求被正常处理

    • 200 OK
        表示从客户端发来的请求在服务器端被正常处理了。

    随改状态码一起返回的信息回音方法的不同而发生改变。比如,使用GET方法时,对应请求资源的实体会作为响应返回。而使用HEADER方法时,对应请求资源的实体首部不随报文主体作为响应返回(响应中只返回首部,不返回实体的主体部分)。

    • 204 Not Content
        该状态码代表服务器接受的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。

    一般在只需从客户端往服务器发送消息,而对客户端不需要发送新信息内容的情况下使用。

    • 206 Partial Content
        该状态码表示客户端进行了范围请求,而服务器成功执行了这部分GET请求。

    响应报文中包含由Content-Range指定范围的指定实体内容。

    3XX重定向

    3XX响应结果表明浏览器要执行某些特殊的梳理以正确处理请求。

    • 301 Moved Permanently
        永久重定向。该状态码表示请求的资源已经被重新分配了新的URI,以后应该使用资源现在所指的URI。
      image
    • 302 Found
        临时重定向。该状态码表示请求的资源已经被分配了新的URI,希望用户(本次)能使用新的URI访问。
      image

    302和301Moved Permanently状态码相似,但302状态码代表的资源不是被永久的移动,只是临时行的。换句话说,已经移动的资源对应的URI将来还有可能改变。

    • 303 See Other
        该状态码标识由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
      image

    303状态码和302 Not Foud状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源。

    当301,302,303响应状态返回码时,几乎所有的浏览器都会把POST改成GET,并删除请求报文的主体,之后请求会自动发送。

    • 304 Not Modified
        自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。

    304状态码返回时,不包含任何响应的主体部分。304被划分在3XX类别中,但是和重定向没有关系。该返回码通常用于请求报文中包含有If-Match,If-Modified-since,If-None-Match,If-Ranage,If-Unmodified-Since的附加请求条件。

    • 307 Tempirary Rediret
        临时重定向。该状态码与302 Found有着相同的含义,但该方法会遵守标准不允许将POST改为POST。

    4XX客户端错误

    4XX的响应结果表明客户端是发生错误的原因所致

    • 400 Bad Request
        该状态码表示求情报文中存在语法错误,当错误发生时,需要修改请求的内容后再次发送请求。另外,浏览器会像200 OK一样对待该状态码。
      image
    • 401 Unauthorized
        该状态码表示发送的请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。另外之前已经进行过1次请求,则表明用户认证失败。
      image

    返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate的首部泳衣质询用户信息。当浏览器初次接受到401响应,会弹出认证用的对话窗口。

    • 403 Forbiden
        该状态码表明地请求资源的访问被服务器拒绝了。服务器端没必要给出拒绝的详细理由。
      image
    • 404 Not Found
        该状态码表明服务器上无法找到请求的资源。除此之外,也可以以在服务器端拒绝请求并且不想说明理由时使用。
      image

    5XX 服务器错误

    5XX响应结果表明服务器本身发生错误

    • 500 Internal Sever Error
        500 (服务器内部错误) 服务器遇到错误,无法完成请求.另外也可能是Web应用存在Bug或某些临时的故障。
      image
    • 501 Service Unavaiable
        该状态码表明服务器暂时处于超载或正在进行停机维护,现在无法完成请求。
      image

    WEB服务器

    用单台虚拟主机实现多个域名

    虚拟主机即物理层面有一台服务器,但只要使用虚拟主机的功能,则可以假想已具有多台服务器。

    在相同的IPP地址下,由于虚拟主机可以寄存多个不同的主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名和URI。

    通信数据转发程序:代理,网关,隧道

    • 代理
        代理是一种具有转发功能的应用程序,它扮演了位于服务器和客户端之间的中间人角色,接受由客户端发送的请求并转发给服务器,同时也接受服务器端返回的响应并转发给客户端。

    代理不改变客户端请求的URI,直接将请求转发给前方持有资源实体的源服务器。从源服务器返回的响应通过代理服务器再转发给客户端,在多级代理服务器级联转发时,需要在附加首部字段via标记出经过的主机信息。

    使用代理服务器的理由:利用缓存技术减少网络带宽的流量,组织内部针对特定的网站控制,以获取访问日志为主要目的
      代理使用方法的分类:(1)缓存代理;(2)透明代理。

    • 网关
        网关是转发其它服务器通信数据的服务器。

    网关的工作机制和代理十分相似,而网关能使通信线路上的服务器提供非HTTP协议服务,使用网关能提高通信的安全能性,可以在客户端与网关之间的通信线路加密以确保连接的安全。

    • 隧道
        隧道是相隔甚远的客户端和服务器之间进行中转,并保持双方通信连接的应用程序。

    隧道可按要求建立起一条与其它服务器通信的线路,届时使用SSL等加密通信手段。隧道的目的是确保客户端与服务器端进行安全的通信。

    HTTP首部

    HTTP协议的请求和响应报文中必定包含HTTP首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。

    HTTP首部字段

    使用首部字段是为给了浏览器和服务器提供把报文主体的大小,所使用的的语言,信息认证等内容。

    首部字段的结构

    首部字段名: 字段值
    

    例如,在HTTP首部字段中使用Content_Type这个字段来表示报文主体的类型。

    Content_Type: text/html
    

    4种类型的首部字段

    • 通用首部字段
        请求报文和响应报文都会用到的首部。


      image
    • 请求首部字段
        从客户端向服务器端发送请求报文时使用的首部,补充了请求的附加内容,客户端信息,响应内容相关优先级等信息。


      image
    • 响应首部字段
        从服务器向客户端返回响应报文时用的首部字段。补充了响应的附加内容,也会要求客户端附加额外的内容信息。


      image
    • 实体首部字段
        针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等于实体相关的信息。


      image
    • 为Cookie服务的首部字段
        Cookie的工作机制是用户状态识别及管理。虽然没被编入标准化的HTTP/1.1的RFC2616中,但在WEB方面得到了广泛的应用。

    Web网站为了管理用户的状态会通过Web浏览器,把一些临时数据写入用户的计算机内,接着当用户访问该Web网站时,可通过通信方式取回之前发放的Cookie。

      Cookie的首部字段如下表:


    image
    • Set-Cookie
    Set-Cookie: status=enable;expre= Tue,05 july 2011 07:32:26 GMT;path=/;domain.havk.jp;
    

      Set-Cookie的字段属性:

    属性 说明
    NAME=VALUE 赋予Cookie的名称和其值(必须项)
    expire=DATE Cookie的有效期(若不指明则默认为浏览器关闭之前)
    path=PATH 用于限制指定Cookie的发送范围的文档目录(若不制指定默认为文档所在的文件目录)
    Domain 指定的域名可做到与结尾匹配一致
    Secure 仅在HTTPS安全通信时才发送cookie
    HttpOnly 加以限制,使Cooki不能被Javascript脚本访问
    • Cookie
    Cookie: status=enable
    

    HTTPS

    HTTP的缺点

    • 通信使用明文(不加密),内容可以被窃听;
    • 不验证通信方的身份,因此可能遭遇伪装;
    • 无法验证报文的完整性,所以报文有可能被篡改;


      image
      image

    解决HTTP缺点的HTTPS

      HTTP+加密+认证+完整性保护=HTTPS

    image

    HTTPS的实质

      HTTP是身披SSL外壳的HTTP
      HTTPS并不是一种新的协议。只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Secure)协议代替。

    通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通,SSL是独立于HTTP的协议,所以不光HTTP协议,其它应用层协议如SMTP和Telent都可以和SSL配合使用。

    两种加密方式

    • 对称加密
        加密和解密使用同一个密钥的加密方式成为共享密钥加密,也叫做对称加密。

    以共享密钥方式加密时必须要将密钥发送给对方,如果通信被监听密钥可能会落入攻击者之手,那么加密就失去意义。

    • 非对称加密
        加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。
      image

    HTTPS采用混合加密方式

      HTTPS采用共享密钥加密公开密钥加密两者并用的混合加密机制。

    在交换密钥(共享密钥)环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。

    image

    证明公开密钥的正确性

      公开密钥加密方式存在一些问题,无法证实公钥真伪.为了解决这个问题,可以使用由数字证书认证机构(CA,certificate authority)和其相关颁发的公钥证书.


    image

    数字认证机构的公钥为了安全起见,会事先在客户端内部植入常用认证机构的公开密钥。

    HTTPS的安全通信机制

    image

      具体步骤:
    1.客户端通过发送client hello报文开始SSL通信.报文中包含客户端支持的SSL指定版本,加密组件列表(所使用的加密算法 密钥长度等)
    2.服务器可进行SSL通信时,会议Server Hello报文作文回应.报文中含SSL版本 加密组件.服务器的加密组件内容是从接受客户端加密组件内筛选出来的.
    3.之后服务器发送certificate报文.报文中包好公开密钥证书.
    4.服务器发送server hello done报文通知客户端.最初阶段握手协商部分结束.
    5.SSL第一次握手结束后,客户端以client key exchange报文作为回应.报文包含通信加密中使用的随机密码串.该报文已用步骤3中的公钥加密;
    6.客户端继续发送change cipher spec报文.该报文会提示想服务器,在此报文之后的通讯会采用pre-master secret密钥加密
    7.客户端发送finished报文 该报文包含连接至今前部报文的整体校验值.这次握手协商是否成功,要以服务器是否能够正确解密该报文作文判定标准.
    8.服务器同样发送change cipher spec报文
    9.服务器同样发送finished报文
    10.C&S finishe报文交换完毕之后,ssl连接就算建立完成.通信会受到SSL的保护.从此开始进行应用层的协议通信,即发送HTTP响应
    11.应用层协议通信,即发送HTTP响应
    12.最后客户端断开连接.断开连接时,发送close_notity报文.上图做了一些省略
    在以上流程中,应用层发送数据时会附加一种叫做MAC(message authentication code)的报文摘要.MAC能够查知报文是佛遭到篡改.从而保护报文的完整性.

    SSL的的缺点

      速度慢:(1)通信慢(2)大量消耗CPU及内存资源导致处理速度慢。

    image

    确认访问用户身份的认证

    HTTP使用的认证方式

    • BASIC认证(基本认证)
        是Web服务器与同喜客户端之间进行的认证方式。
      image
    • DIGES认证(摘要认证)
        为了弥补BASIC不加密的缺点,DIGEST同样适用质询/响应的方式,但不会像BASIC直接发送明文。
      image

    因为发送给对方的只是相应摘要以及知讯码产生的计算结果,所以比起BASIC认证,密码泄露的可能性较小。

    image
    • SSL客户端认证

    SSL客户端认证是借由HTTPS的客户端证书完成的认证方式。凭借客户端整数认证,服务器可确认访问是否来自自己登陆的客户端。

    image

    SSL客户端采用双因素认证:第一个认证因素的SSL客户端证书用来认证客户端计算机,另一个认证因素的密码则用来确定这是用户本人的行为。

    • From认证(基于表单认证)
        客户端会向服务器上的Web应用程序发送登录信息,按登录信息的验证结果认证。

    (完)

    相关文章

      网友评论

        本文标题:《图解HTTP》学习笔记

        本文链接:https://www.haomeiwen.com/subject/ogpipxtx.html