HTTP/1.1报文详解

HTTP是基于TCP的,HTTP作为应用层协议,会在TCP/IP协议栈往下传递的时候,不断封装数据帧,如下图:

image-20200818221423546

上面HTTP正文即是以我们HTTP报文格式来组织的。下面我们看看具体的HTTP报文的格式。

3.1、HTTP报文组成部分

HTTP请求和响应都使用如下通用的格式:

image-20200819224006001

start-line:起始行,起始行可以为以下两者之一:

Request-Line:请求行,如:

GET /hello-world2.html HTTP/1.1

Status-Line:状态行,如:

HTTP/1.1 200 OK

*(message-header CRLF):0个或者多个消息头;

CRLF:一个空行;

[message-body]:可选的消息体;

可以分别把请求报文和响应报文分开来描述:

请求报文

image-20200822180651813

响应报文

image-20200822180702049

可以发现,请求报文和响应报文格式就起始行不一样。

下面我们逐个来介绍。

为了尽可能保证内容的准确性,下面报文各种字段说明部分内容,大部分整理自RFC2616和MDN web docs:

Hypertext Transfer Protocol -- HTTP/1.1 2616

HTTP. MDN web docs

《HTTP权威指南》

以上资料内容有冲突的,以RFC2616的为准。

3.2、请求行

请求行格式:

Request-Line = Method SP Request-URI SP HTTP-Version CRLF 3.2.1、Method

方法是区分大消息的,以下是常用的方法:

方法 说明
OPTIONS   列出可以对服务器资源执行哪些方法  
GET   获取资源  
HEAD   获取资源的首部,与GET类似,但是不会响应消息体  
POST   向服务器提交数据  
PUT   将请求主体部分存储在服务器上  
DELETE   删除资源  
TRACE   对可能经过代理服务器传送到服务器上的报文进行追踪  
CONNECT   建立连接隧道  
extension-method   扩展方法  

另外,服务器还可以实现一些自己的请求方法,这些附加的方法是对HTTP规范的扩展,因此也成为扩展方法。

extension-method = token

请求可能的返回结果:

405:表示请求的方法不被允许,这个时候服务器响应头会响应当前资源允许的方法,如:

Allow: GET, HEAD, PUT

501:代表原服务器的该方法未能被识别或者未实现;

下面逐个方法介绍下:

GET

GET方法意味着可以检索 Request-URI标识的任何信息。

如果Request-URI涉及到创建数据,则应该将新建的数据作为响应实体返回。

如果请求消息包含 If-Modified-Since,If-Unmodified-Since,If-Match,If-None_match或If-Range标头字段,则此时的Get为条件GET。通过使用缓存标头,可以尽可能避免不必要的网络传输。

如果请求标头包含Range,则GET方法变为部分GET。

HEAD

HEAD方法与GET方法很类似,但是HEAD方法在在响应中只返回首部,不会反悔消息体。

这就允许客户端再不用获取实际资源的情况下,对资源首部进行检查。如:

检查资源是否有更新:如果获取到的 Content-Length、Content-MD5、ETag、Last-Modified与之前获取到的值不同,那么缓存应该被视为过期;

查看响应状态码,查看资源是否存在;

获取首部更多信息,判断资源情况。

POST

POST方法起初是用来向服务器传输数据的,通常用来提交HTML的表单到服务器。

PUT

PUT方法用于向服务器写入资源,如果Request-URI对应的资源已经存在的话,就进行更新。

注意:

POST用于向服务器发送数据,PUT用于向服务器上的资源中存储数据。

DELETE

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyfdf.html