【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

本文参考《图解Http》——上野宣

一、 HTTP协议概述

HTTP协议(HyperText Transfer Protocol,超文本传输协议)位于应用层,用于客户端和服务端的通信。(请求访问文本或图像是一端称为客户端,而提供资源响应的一端称为服务端。)
HTTP协议有以下特点:

  • 应用HTTP协议时,必定是一端担任客户端角色,另一端担任服务端角色
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • HTTP协议是通过请求和响应的交换来达成通信的(基于请求-响应模式)
    请求从客户端发出,最后服务端响应请求并返回。先从客户端开始建立通信,服务端在没有接收顶起哦请求之前是不会发送响应的。
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • HTTP是无状态的(无状态保存)
    HTTP是基于TCP的,当一个TCP连接关闭后,所有的HTTP请求/响应信息将全部消失。
    HTTP协议自身不具备保存之前发送过的请求或响应的功能,也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。

所谓的无状态就是每次请求完成后,不会在客户端和服务器上保存任何的信息,对于客户端和服务器来说,根本不知道上一次请求的信息是什么,甚至不知道本次连接的对端是不是上次连接的那一端,它的生命周期随着TCP/IP连接的关闭结束了。

【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
使用HTTP协议,每当有新的请求发送时,就会有对应新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。可是,随着Web的不断发展,因无状态而导致业务处理变得棘手的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能够掌握是谁送出的请求,需要保存用户的状态。
HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。

  • HTTP是无连接的
    无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间,并且可以提高并发性能,不能和每个用户建立长久的连接,请求一次相应一次,服务端和客户端就中断了。但是无连接有两种方式,早期的http协议是一个请求一个响应之后,直接就断开了,但是现在的http协议1.1版本不是直接就断开了,而是等几秒钟,这几秒钟是等什么呢,等着用户有后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的,默认的好像是3秒中现在,但是这个时间是可以通过咱们后端的代码来调整的,自己网站根据自己网站用户的行为来分析统计出一个最优的等待时间。

二、 HTTP工作原理

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

以下是 HTTP 请求/响应的步骤:

  1. 客户端连接到Web服务器 一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP连接。

  2. 发送HTTP请求 通过TCP,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

  3. 服务器接受请求并返回HTTP响应 Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

  4. 释放连接TCP连接 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection
    模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

  5. 客户端浏览器解析HTML内容 客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
  5. 释放 TCP连接;
  6. 浏览器将该 html 文本并显示内容。

三、HTTP请求

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

HTTP请求报文格式
HTTP请求报文由状态行、请求头(请求首部字段)、请求正文(内容实体)三部分组成:

  • 状态行:包括请求方法、URI、协议版本;

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

  • 请求正文:就是HTTP请求的数据
    请求报文构成如图所示:【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • HTTP请求方法
    HTTP请求报文的状态行中,有一个请求方法。方法的作用在于,可以指定请求的资源按照期望产生某种行为。常用的方法如图所示:
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • GET:获取资源

GET方法用来请求访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;如果是像CGI(Common Gateway Interface,通用网关接口)那样的程序,则返回经过执行后的输出结果。
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • POST:传输实体主体
    POST方法用来传输实体的主体(向服务器发送要修改的数据)
    虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法。虽说POST的功能与GET很相似,但POST的主要目的并不是获取响应的主体内容,而是向服务器传输信息。
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
  • PUT:传输文件

PUT方法用来传输文件(向服务器上传资源)。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。
但是,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的Web网站不使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST(Representational State Transfer,表征状态转移)标准的同类Web网站,就可能会开放使用PUT方法。

使用PUT方法的请求·响应的例子
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
① 响应的意思其实是请求执行成功了,但无数据返回。

  • DELETE:删除文件

DELETE方法用来删除文件(删除服务器资源),是与PUT相反的方法。DELETE方法按请求URI删除指定的资源。
但是,HTTP/1.1的DELETE方法本身和PUT方法一样不带验证机制,所以一般的Web网站也不使用DELETE方法。当配合Web应用程序的验证机制,或遵守REST标准时还是有可能会开放使用的。

使用DELETE方法的请求·响应的例子
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • HEAD:获得报文首部

HEAD方法和GET方法一样,只是不返回报文主体部分。只获取报文的首部,用于确认URI的有效性及资源更新的日期时间等。
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
图:和GET一样,但不返回报文主体

  • OPTIONS:询问支持的方法

OPTIONS方法用来查询针对请求URI指定的资源支持的方法。

使用OPTIONS方法的请求·响应的例子
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • TRACE:追踪路径

TRACE方法是让Web服务器端将之前的请求通信环回给客户端的方法。
发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200 OK的响应。
客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作。
但是,TRACE方法本来就不怎么常用,再加上它容易引发XST(Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了。
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • CONNECT:要求用隧道协议连接代理

CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
CONNECT方法的格式如下所示。
CONNECT代理服务器名:端口号HTTP版本

使用CONNECT方法的请求·响应的例子
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

四、HTTP响应

服务器收到客户端发来的HTTP请求后,根据HTTP请求中的动作要求,会做出具体的动作,将结构回应给客户端,称为HTTP响应。
响应报文格式
响应报文由三部分组成:状态行、响应头、响应正文

  • 状态行:包括协议版本、响应结果状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语;
  • 响应头(可选):包括搭建服务器的软件、发送响应的时间、回应数据的格式等信息;
  • 响应正文(主体):就是响应的具体数据。
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
  • HTTP状态码
    HTTP状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
    数字中的第一位指定了响应类别,后两位无分类。响应类别有以下5种。
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
  1. 1XX的响应结果表明正在被处理。
  • 100 Continue 继续。客户端应继续其请求。
  • 101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议。
  1. 2XX的响应结果表明请求被正常处理了。
  • 200 OK
    表示从客户端发来的请求在服务器端被正常处理了。
    在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。比如,使用GET方法时,对应请求资源的实体会作为响应返回;而使用HEAD方法时,对应请求资源的实体主体不随报文首部作为响应返回(即在响应中只返回首部,不会返回实体的主体部分)。
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • 204 No Content
    该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。比如,当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新。
    一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • 206 Partial Content

该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  1. 3XX重定向
    3XX响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。
  • 301 Moved Permanently
    永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。也就是说,如果已经把资源对应的URI保存为书签了,这时应该按Location首部字段提示的URI重新保存。
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
    像下方给出的请求URI,当指定资源路径的最后忘记添加斜杠“/”,就会产生301状态码。
    http://example.com/sample
  • 302 Found
    临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。
    和301 Moved Permanently状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。比如,用户把URI保存成书签,但不会像301状态码出现时那样去更新书签,而是仍旧保留返回302状态码的页面对应的URI。
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
  • 303 See Other

该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
303状态码和302 Found状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码有区别。
比如,当使用POST方法访问CGI程序,其执行后的处理结果是希望客户端能以GET方法重定向到另一个URI上去时,返回303状态码。虽然302 Found状态码也可以实现相同的功能,但这里使用303状态码是最理想的。
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)
当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。
301、302标准是禁止将POST方法改变成GET方法的,但实际使用时大家都会这么做。

  • 304 Not Modified
    该状态码表示客户端发送附带条件的请求 时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304 Not Modified(服务器端资源未改变,可直接使用客户端未过期的缓存)。
    【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系。
  • 307 Temporary Redirect
    临时重定向。该状态码与302 Found有着相同的含义。尽管302标准禁止POST变换成GET,但实际使用时大家并不遵守。
    307会遵照浏览器标准,不会从POST变成GET。但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况。
  1. 4XX的响应结果表明客户端是发生错误的原因所在。
  • 400 Bad Request

该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。另外,浏览器会像200 OK一样对待该状态码。
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • 401 Unauthorized

该状态码表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。
返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用以质询(challenge)用户信息。当浏览器初次接收到401响应,会弹出认证用的对话窗口。
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • 403 Forbidden

该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分对原因进行描述,这样就能让用户看到了。
未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源IP地址试图访问)等列举的情况都可能是发生403的原因。
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • 404 Not Found

该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  1. 5XX的响应结果表明服务器本身发生错误。
  • 500 Internal Server Error

该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

  • 503 Service Unavailable

该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry-After首部字段再返回给客户端。
【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)

状态码和状况的不一致 不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。比如Web应用程序内部发生错误,状态码依然返回200 OK,这种情况也经常遇到。

URI和URL

  • URI—Uniform Resource Identifier通用资源标志符

Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是用一个来URI来定位的
URI一般由三部组成①访问资源的命名机制②存放资源的主机名③资源自身的名称,由路径表示,着重强调于资源。

  • URL—Uniform Resource Location统一资源定位符一般

由三部组成
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等

URL代表资源的路径地址,而URI代表资源的名称。

作者:daixinye
链接:https://www.zhihu.com/question/21950864/answer/154309494
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。拿人做例子,假设这个世界上所有人的名字都不能重复,那么名字就是URI的一个实例,通过名字这个字符串就可以标识出唯一的一个人。现实当中名字当然是会重复的,所以身份证号才是URI,通过身份证号能让我们能且仅能确定一个人。那统一资源定位符URL是什么呢。也拿人做例子然后跟HTTP的URL做类比,就可以有:动物住址协议://地球/中国/浙江省/杭州市/西湖区/某大学/14号宿舍楼/525号寝/张三.人可以看到,这个字符串同样标识出了唯一的一个人,起到了URI的作用,所以URL是URI的子集。URL是以描述人的位置来唯一确定一个人的。在上文我们用身份证号也可以唯一确定一个人。对于这个在杭州的张三,我们也可以用:身份证号:123456789来标识他。所以不论是用定位的方式还是用编号的方式,我们都可以唯一确定一个人,都是URl的一种实现,而URL就是用定位的方式实现的URI。回到Web上,假设所有的Html文档都有唯一的编号,记作html:xxxxx,xxxxx是一串数字,即Html文档的身份证号码,这个能唯一标识一个Html文档,那么这个号码就是一个URI。而URL则通过描述是哪个主机上哪个路径上的文件来唯一确定一个资源,也就是定位的方式来实现的URI。对于现在网址我更倾向于叫它URL,毕竟它提供了资源的位置信息,如果有一天网址通过号码来标识变成了http://741236985.html,那感觉叫成URI更为合适,不过这样子的话还得想办法找到这个资源咯…

【计算机基础】HTTP协议(请求报文、响应报文、HTTP状态码)