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

    1、什么是协议

      协议就是规则或者可以理解为一定的方式。

      通信协议:指两个终端之间按照一定的规则去传输消息,这个规则就是通信协议。通信协议有很多种,http是其中的一种。

      我们使用浏览器时会频繁使用HTTP协议,跟我们有直接关系的是协议的内容,而依据HTTP协议对内容进行封装,形成指定的结构则是由浏览器完成的。

    2、HTTP协议应用环境

      HTTP协议的中文名是超文本传输协议,一般应用在浏览器和服务器端的通信。

    3、HTTP协议的内容

      http协议包含两部分内容,请求协议响应

      请求协议

      请求协议约定发送请求的内容分为三部分:请求行报头报文

        请求行:是由 请求方法资源标识符协议版本  三项内容构成

        报   头: 起元数据作用的键值对,HTTP定义了标准的报头,程序也可以自己定义报头(???不太理解怎样去实现)。 报头域以空行结尾

            Host: www.cnblogs.com      此报头域指定了被请求资源的Internet的主机名和端口号  端口号省略 默认为80

            Connection: keep-alive    此报头意义为处理完这一请求之后,保持连接状态,重用连接以便减少资源消耗。Connection 有两个值 另一个是Close

            Accept: text/html,       此报头表面客户端希望接受到哪些类型的文本,示例表示客户端希望接受html文本  

            User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X         MetaSr 1.0          此报头域向服务器提供了客户端的操作系统及浏览器内核等信息。

            Referer: http://www.cnblogs.com/   此报头告诉服务器是从那个页面的连接过来的

            Cookie:此报头域与一般报头域略有不同,此报头域包含一些属性,一般是由程序自定义的。,记录方式如下:  Cookie:.CNBlogsCookie=474FB4DBFF6C5C3A99DD0EA836CD1012A6D4B83C6CC45709C48DA946C2A46C84530610BDF668611A8375A9EF3B3FF4298630CAFCA37252D4BC313DA98D502EBA37DF6E41B754F5ED22408CE7A8398B4D38558BDD; __gads=ID=f2391b6c979e4036:T=1438422438:S=ALNI_MaLQMSJB_8sf2VVY32A_7oDG3g1WA; CNZZDATA1684828=cnzz_eid%3D1319387984-1438439046-null%26ntime%3D1438439453; _gat=1; _ga=GA1.2.1105204119.1438422447                                                 

        报   文(可为空):在get方法中,报文一般为空;post方法中,报文的格式在下面会讲到。

        常用的请求方法:

         get: 使用get请求方法,报文一般为空,请求参数和值一般放在URL中,以“URL?name1=value1&name2=value2……”形式发送(URL内容及请求参数放在请求行中)。

        post:方法一般将请求参数放在报文中,请求参数的形式有很多种,键值对、JSON体、字符串等;如QQ注册页面Post提交表单

    verifycode=FZAR&qzone_flag=1&country=1&province=11&city=1&isnongli=0&year=1999&month=2&day=1&isrunyue=0&password=57a1cbeafe9131c674e328608d99330df0b0ac380f9b360cb9660aba93ba6ea217e5e2de13d020f7ab66a7e1cb84d393f5541f72609fd243e8d64e328871447e683dcc9a1338034ed0ae766d4473dba0b2ae9e049b8e1106dbd47a7e6464d8e1164c7a5ef5148a42d12fd5a66771ac3d2288557d257edc430fb43ac5b36ff8c7&nick=%E7%9B%BC%E7%9B%BC&email=false&other_email=false&elevel=1&sex=1&qzdate=&jumpfrom=58030&telphone=&smsvc=undefined&csloginstatus=2&a6s7b3=p3z5e&

        关于post与get的区别 请看这里

         head:  HEAD就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。

      响应协议

      响应协议约定的响应内容分也为三部分:状态行响应报头正文

         状  态 行:HTTP-Version Status-Code Reason-Phrase   其中HTTP-Version表示版本号,Status-Code表示状态码,Reason-Phrase表示状态的文本描述

         响应报头:格式与请求报头格式是一样的,只是名字含义有所不同,根据名字也很容易推测出其含义,因此就不多赘述。

         报     文:响应报文格式可以是HTML格式,也可是字符串、键值对等!

         那么浏览器应该是怎么识别报文的呢?报文的形式也就那么几种,返回的报头中会说明返回的报文是哪种形式,这样浏览器就可以识别了。

       值得一提的是,在测试中发现,当点击一个按钮时,会产生好多组请求响应,也就说用户的一个操作得到一个页面信息,并非是一个请求一个响应完成的,而是多个请求和多个响应完成的。大概原因也许是这样的,就是在请求的html中用到了其他资源,这时候浏览器会自动发起资源请求。例如:

      这句话就会<img src="./images/asf-logo.gif" align="right" alt="Apache Logo" border="0">  就会触发一个请求!

      HTTP归根结底也只是应用层的协议,属于比较上层的协议;一般来说,HTTP协议都是建立在TCP/IP协议基础之上的。

       大概架构如图:

             

    关于TCP/IP协议,将另作研究!

    4、HTTP协议的特点

      连接方式 

    HTTP之所以建立在TCP/IP之上,有一个显著的特点就是在连接上比较节省时间。

    在HTTP0.9和1.0版本中,是不持续连接 服务器收到客户的应答后即断开连接,节省传输时间

    在1.1版本中 持续连接 一个连接可以传送多个对象。  这绝对是与一般的TCP/IP有区别的,至于是什么区别,待搞清楚之后再做记叙。

      无状态

      什么是无状态:http是不会为了下一次连接而维护这次连接所传输的信息,为了保证服务器内存。web在与浏览器一次通信完毕后,不会保留任何和这一请求有关的信息,如主机IP,浏览器内核等。
      比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。 

      无状态带来的好处就是节省了服务器的内存占用,提高了并发访问的能力。  

      但是无状态也会带来一些负面影响,cookies在一定程度上解决了这个问题。

     5、HTTP协议中的缓存机制 

       服务器收到请求时,会在200OK中回送该资源的Last-Modified和ETag头,客户端将该资源保存在cache中,并记录这两个属性。当客户端需要发送相同的请求时,会在请求中携带If-Modified-Since和If-None-Match两个头。两个头的值分别是响应中Last-Modified和ETag头的值。服务器通过这两个头判断本地资源未发生变化,客户端不需要重新下载,返回304响应。

      6、断点续传与多线程下载

      断点续传

      HTTP协议的GET方法,支持只请求某个资源的某一部分;
      206 Partial Content 部分内容响应;
      Range 请求的资源范围;
      Content-Range 响应的资源范围;
      在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传。
      分块请求资源实例:
      Eg1:Range: bytes=306302- :请求这个资源从306302个字节到末尾的部分;
      Eg2:Content-Range: bytes 306302-604047/604048:响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节;
      客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载。从而达到快速下载的目的。目前流行的FlashGet和迅雷基本都是这个原理。

      多线程下载

      下载工具开启多个发出HTTP请求的线程;
      每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000;
      合并每个线程下载的文件。

      7、HTTP认证

      基本认证是一种用来允许Web浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。

      把 "用户名+冒号+密码"用BASE64算法加密后的字符串放在http request 中的header Authorization中发送给服务端。
      客户端对于每一个realm,通过提供用户名和密码来进行认证的方式。
      包含密码的明文传递

      当浏览器访问使用基本认证的网站的时候, 浏览器会提示你输入用户名和密码,如下图:

    关于HTTP认证及代理服务器实在是不想打字了。。。。而且并没有深入应用。。大概说一下除了基本认证 还有摘要认证 

      首先发送请求信息,服务器返回信息;客户端需要将服务器返回的信息加上自己的信息(用户名密码)进行MD5加密(虽然无数次的调用MD5加密函数 却没有研究过到底是怎么加密的)。加密后的信息发送给服务器 服务器进行验证 成功 则返回请求的资源

    8.HTTP代理服务器

      使用http服务器具有很多优势

      匿名访问:对于真正的服务器来说 不知道真正客户的信息(个人感觉这一点没多大用处,原因在于HTTP的无状态性  不会记录客户的连接信息)。

      速度快:速度快的原因是由于HTTP的缓存机制及代理服务器内存大形成的。。很有用!

      翻   墙:原理很容易理解,你够不到的东西由代理服务器够到 拿给你!

      还想继续深入下去,可又觉得这些也许够用了。。至于以后到底做不做这些方向,也不一定。。。现在想研究TCP/IP了。。。

  • 相关阅读:
    恢复 root 本地无权限 Access denied for user 'root'@'localhost' (using password: NO)
    linux 下 PHP Notice: session_start(): ps_files_cleanup_dir 报错 问题剖析
    linux 下mysql 开启远程连接
    linux 下mysql 字段插入的值超过 预设大小报错
    CSS、HTML5、JS
    WPF、Sivelright、UWP
    Quartz.net作业调度
    nginx+iis、NLB、Web Farm、Web Garden、ARR
    workflow
    SqlSugar ORM
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/4633827.html
Copyright © 2011-2022 走看看