深入理解HTTP协议

Posted It‘s so simple

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解HTTP协议相关的知识,希望对你有一定的参考价值。

目录


本文中的一些图片和相关知识点均来自于《图解HTTP》。

1. HTTP请求方法

1.1 GET:获取资源

GET方法用来请求访问已被URI识别的资源。指定的资源经服务器端解析之后返回响应内容,也就是说,如果请求的资源是文本,那就保持原样返回;换句话来说,GET方法本质上设计最初是从服务端去获取资源,浏览器如果用到一个GET方法去发送请求,本质上是为了获取某一种资源的,但是现在所说的GET方法,本质上也是可以向服务端提交少量的数据,而这个数据本质上是提交给URI当中的。
>当然,使用GET方法给浏览器的URI提交数据是有一定的天花板的,因为不同的浏览器对URI的长度有着不同的限制。

总结一下就是GET方法既能向服务器中去获取数据,也能向服务器中提交少量的数据,并且该数据的大小是提交到URI中的。

1.2 POST:传输实体主体

虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法。虽说POST的功能和GET很相似,但POST的主要目的并不是获取响应的主体内容。

举个案例来说:

当你在某个网页进行登录的时候,使用GET方法会将你的用户名和密码放在请求头部的URI中提交给服务器,换而言之,你可以直接在你当前的URL中看到你的用户名和密码;但是如果使用POST方法,会将你的用户名和密码放在请求正文中进行提交,一旦进行抓包,也是能看到你的用户名和密码的,因为HTTP本来就是明文传输的,不存在那个方法更安全,只能说POST方法比GET方法更私密一些。

tips:

1.3 PUT方法:传输文件

PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI的指定位置。但是,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性的问题,因此一般web网站均不使用该方法。也就是说目前PUT方法是不常用的。

1.4 HEAD:获得报文首部

HEAD方法和GET方法一样,只是不返回报文主体部分,一般用来确认资源的有效性。换而言之,HEAD方法是不需要服务端返回响应正文的,使用HEAD方法,服务器只会返回响应首行、响应报头、空行。

1.5 DELETE:删除文件

DELETE方法用来删除文件,是与PUT相反的方法。HTTP/1.1中的DELETE方法和PUT方法一样,均是不带验证机制的,所以也是不常用的。

1.6 OPTIONS:询问支持的方法

OPTIONS方法用来查询针对请求URI指定的资源支持的方法。换句话说就是客户端询问当前服务器都支持哪些方法。

1.7 HTTP请求方法的总结

换个角度来总结的话:

  • HTTP/1.0 和 HTTP/1.1 均支持的请求方法有GET、POST、HEAD、DELETE、PUT。
  • 只有HTTP/1.1协议支持的方法有OPTIONS,TRACE、CONNECT。
  • 只有HTTP/1.0协议支持的方法有LINK,UNLIKE。

2. HTTP响应状态码及其解释

2.1 状态码类别

2.2 2XX:成功状态码

2XX响应结果均表示请求已被正常处理了。

2.2.1 200:OK

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

在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。比如使用GET方法,对应请求资源的实体会作为响应而返回;而使用HEAD方法,对应请求的资源实体不会随着报文主体作为响应返回,即就是在响应中只返回首部,不会返回实体的主体部分。

2.2.2 204:NO Content

该状态码代表服务器接收的请求已经成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。比如,当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不会发生更新。

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

2.2.3 206:Partial Content

该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。

2.3 3XX:重定向状态码

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

2.3.1 301:Moved Permanently

永久性重定向。该状态码表示请求的资源已经被分配到新的URL中,以后应使用资源所指的URL。

2.3.2 302:Found

临时性重定向。该状态码表示请求的资源已被分配到了新的URL中,希望用户(本次)能使用新的URL访问。

和301状态码相似,但是302状态码代表的资源不是被永久移动的,只是临时性质的。换句话说,已移动的资源对应的URL将来还有可能发送改变。比如用户把URL保存成书签,但不会像301状态码出现时那样去更新书签,而是仍旧保留返回302状态码的页面对应的URL。

2.3.3 303:See Other

该状态码表示由于请求对应的资源存在着另一个URL,应使用GET方法定向获取请求的资源。

303 状态码和302状态码有着相同的功能,但303状态码明确表示客户端应采取GET方法获取资源,这点与302状态码有区别。

tips:

2.3.4 304:Not Modified

该状态码表示客户端发送附带条件的请求时(是指采用GET方法的请求报文中出现If-Match、If-Modified-Since等任一首部),服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系

2.3.5 307:Temporary Redirect

临时性重定向。该状态码与302状态码有着相同的含义。尽管302标准禁止POST变换为GET,但实际使用时大家并不遵守。
但是307会遵循浏览器的标准,不会讲POST变为GET。但是,对于处理响应的行为,每种浏览器又可能出现不同的情况。

2.4 4XX:客户端错误

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

2.4.1 400:Bad Request

该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。另外,浏览器会像200 OK一样对待该状态码。

2.4.2 401:Unauthorized

该状态码表示发送的请求需要有通过HTTP认证的认证信息。另外若之前已进行1次请求,则表示用户认证失败。

简短一点来说就是用户认证失败。

2.4.3 403:Forbidden

该状态码表明对请求资源的访问被服务器拒绝了。服务器没有必要给出拒绝的详细理由,但如果想做说明的话,可以在实体的主体部分对原因进行描述,这样就能让用户看到了。

未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源IP地址视图访问)等列举情况都可能发生403的原因。

2.4.4 404:Not Found

该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

2.5 5XX:服务器错误

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

2.5.1 500:Internal Server Error

该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。

2.5.2 503:Service Unavailable

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

tips:

以上是关于深入理解HTTP协议的主要内容,如果未能解决你的问题,请参考以下文章

HTTP协议图--HTTP 报文首部之首部字段(重点分析)

了解HTTP协议

了解HTTP协议

请求响应报文

HTTP报文(message)是什么?请求报文响应报文报文首部(header)报文主体(body)

HTTP通信