HTTP协议

一、HTTP的概念

  HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。

  它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,是用于从WWW服务器传输超文本到本地浏览器的传送协议。

  它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

  HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

二、HTTP的工作流程

  1、一次HTTP操作称为一个事务,其工作过程可分为四步:

    1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

    2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

    3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

    4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

  2、客户端浏览器与服务器的交互过程

    1)浏览器向服务器发出连接请求。此为TCP三次握手第一步,此时为SYN,seq:X (x=0)

    2)服务器回应了浏览器的请求,并要求确认,此时为:SYN,ACK,此时seq:y(y为0),ACK:x+1(为1)。此为三次握手的第二步;

    3)浏览器回应了服务器的确认,连接成功。为:ACK,此时seq:x+1(为1),ACK:y+1(为1)。此为三次握手的第三步;

    4)浏览器(192.168.2.33)发出一个页面HTTP请求;

    5)服务器(220.181.50.118)确认;

    6)服务器(220.181.50.118)发送数据;

    7)客户端浏览器(192.168.2.33)确认;

    8)客户端(192.168.2.33)发出一个图片HTTP请求;

    9)服务器(220.181.50.118)发送状态响应码200 OK

三、HTTP请求与响应报文

  1、HTTP请求:HTTP请求是客户端往服务端发送请求动作,告知服务器自己的要求。

          HTTP请求由状态行、请求头、请求正文三部分组成:

      状态行:包括请求方式Method、资源路径URL、协议版本Version;

      请求头:包括一些访问的域名、用户代理、Cookie等信息;

      请求正文:就是HTTP请求的数据。

    备注:请求方式Method一般有GET、POST、PUT、DELETE,含义分别是获取、修改、上传、删除,其中GET方式仅仅为获取服务器资源,方式较为简单,因此在请求方式为GET的HTTP请求数据中,请求正文部分可以省略,直接将想要获取的资源添加到URL中。下图所示就是GET的请求,没有请求正文。

  2、HTTP响应:服务器收到了客户端发来的HTTP请求后,根据HTTP请求中的动作要求,服务端做出具体的动作,将结果回应给客户端,称为HTTP响应。

    HTTP响应由三部分组成:状态行、响应头、响应正文;

      状态行:包括协议版本Version、状态码Status Code、回应短语;

      响应头:包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息;

      响应正文:就是响应的具体数据。

    备注:我们主要关心并且能够在客户端浏览器看得到的是三位数的状态码,不同的状态码代表不同的含义,其中

1xx 表示HTTP请求已经接受,继续处理请求
2xx 表示HTTP请求已经处理完成
3xx 表示把请求访问的URL重定向到其他目录
4xx 表示客户端出现错误
5xx 表示服务端出现错误

四、HTTP状态码

  a) 201-206 都表示服务器成功处理了请求的状态代码,说明网页可以正常访问。

    i. 200(成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。

    ii. 201(已创建)请求成功且服务器已创建了新的资源。

    iii. 202(已接受)服务器已接受了请求,但尚未对其进行处理。

    iv. 203(非授权信息)服务器已成功处理了请求,但返回了可能来自另一来源的信息。

    v. 204(无内容)服务器成功处理了请求,但未返回任何内容。

    vi. 205(重置内容)服务器成功处理了请求,但未返回任何内容。与 204 响应不同,此响应要求请求者重置文档视图(例如清除表单内容以输入新内容)。

    vii. 206(部分内容)服务器成功处理了部分 GET 请求。

  b) 300-307 表示的意思是:要完成请求,您需要进一步操作。通常,这些状态代码是永远重定向的。

    i. 300(多种选择)服务器根据请求可执行多种操作。服务器可根据请求者来选择一项操作,或提供操作列表供其选择。

    ii. 301(永久移动)请求的网页已被永久移动到新位置。服务器返回此响应时,会自动将请求者转到新位置。

    iii. 302(临时移动)服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

    iv. 303(查看其他位置)当请求者应对不同的位置进行单独的 GET 请求以检索响应时,服务器会返回此代码。

    v. 304(未修改)自从上次请求后,请求的网页未被修改过。服务器返回此响应时,不会返回网页内容。

    vi. 305(使用代理)请求者只能使用代理访问请求的网页。如果服务器返回此响应,那么,服务器还会指明请求者应当使用的代理。

    vii. 307(临时重定向)服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

  c) 4XX 表示请求可能出错,会妨碍服务器的处理。

    i. 400(错误请求)服务器不理解请求的语法。

    ii. 401(身份验证错误)此页要求授权。

    iii. 403(禁止)服务器拒绝请求

    iv. 404(未找到)服务器找不到请求的网页。

    v. 405(方法禁用)禁用指定的方法。

    vi. 406(不接受)无法使用请求的内容特性响应请求的网页。

    vii. 407(需要代理授权)此状态码与 401类似,但指定请求者必须授权使用代理。如果服务器返回此响应,还表示请求者应当使用代理。

    viii. 408(请求超时)服务器等候请求时发生超时。

    ix. 409(冲突)服务器在完成请求时发生冲突。

    x. 410(已删除)请求的资源永久删除后,服务器返回此响应。

    xi. 411(需要有效长度)服务器不接受不含有有效内容长度标头字段的请求

    xii. 412(未满足前提条件)服务器未满足请求者在请求中设置的其中一个前提条件

    xiii. 413(请求实体过大)服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。

    xiv. 414(请求的 URL过长)请求的 URL( 通常为网址)过长,服务器无法处理。

    xv. 415(不支持的媒体类型)

    xvi. 416(请求范围不符合要求)

    xvii. 417(未满足期望值)

  d) 500-505 表示服务器在尝试处理请求时发生内容错误。这些错误可能是服务器本身的错误,而不是请求出错。

    i. 500(服务器内部错误)

    ii. 501(尚未实施)服务器不具备完成请求的功能。

    iii. 502(错误网关)服务器作为网关或代理,从上游服务器收到了无效的响应。

    iv. 503(服务不可用)

    v. 504(网关超时)服务器作为网关或代理,未及时从上游服务器接收请求。

    vi. 505(HTTP 版本不受支持)

五、HTTP请求方式(post、get)

  1. get是从服务器上获取数据,post是向服务器传送数据。

  2. GET请求把参数包含在URL中,将请求信息放在URL后面,POST请求通过request body传递参数,将请求信息放置在报文体中。

  3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。  

  4. get安全性非常低,get设计成传输数据,一般都在地址栏里面可以看到,post安全性较高,post传递数据比较隐私,所以在地址栏看不到, 如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到。

  5. GET请求能够被缓存,GET请求会保存在浏览器的浏览记录中,以GET请求的URL能够保存为浏览器书签,post请求不具有这些功能。

  6. HTTP的底层是TCP/IP,GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。

  7.GET产生一个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);POST产生两个TCP数据包,对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

posted @ 2019-09-03 12:01  元哥0317  阅读(183)  评论(0编辑  收藏  举报