当输入一个 URL,实际会发生什么? (2)

HTTP属于应用层,用户触发交互所产生的行为数据和服务端对此的响应都由它封装成HTTP报文,再交由下层协议进行处理。报文的作用是客户端与服务端沟通的载体,双方都要遵循统一规则对信息进行处理,这一规则称为HTTP。

客户端与服务端的交互往往非常复杂,为了使双方都能高效、明确、安全地通信(例如传递意图与状态、承载数据、携带认证信息、控制连接行为与缓存),需要依赖报文中的结构来实现,下面先从结构开始看。

报文结构

HTTP报文的结构分为请求和响应两种,请求报文封装用户操作产生的动作,告知服务器应采取什么行为,响应报文来告知客户端请求的结果。
请求报文格式:

<method> <request-url> <version> // 起始行格式 <headers> // 首部 <body> // 实体

响应报文格式:

<method> <status> <reason-phrase> // 起始行格式 <headers> // 首部 <body> // 实体 起始行

报文的起始行表明了报文的开始,请求和响应各自的起始行的格式也不相同。

请求报文的起始行说明要做什么,结构为方法 + 请求URL + 协议版本,中间用空格做分隔:

GET /api/nht/blog/example HTTP/1.1

响应报头的起始行说明发生了什么,结构为协议版本 + 状态码 + 描述文本,中间用空格做分隔:

HTTP/1.1 200 OK 方法与状态码

方法来告诉服务端请求报文要做的事情,状态码来通知客户端服务端依据请求报文完成动作之后的大致结果。常见的HTTP方法如下:

| 方法 | 含义 | 有无主体 | | ------- | ---------------------------------------------- | -------- | | GET | 从服务端获取资源 | 无 | | HEAD | 只获取资源头部 | 无 | | POST | 向服务端发送数据 | 有 | | PUT | 将客户端发送的数据存到服务端,应用场景多为修改 | 有 | | OPTIONS | 对服务端进行预检,例如服务端支持哪些方法 | 无 | | DELETE | 从服务端删除资源 | 无 | 请求完成时,响应报文中会有一个状态码,用来表示此次请求的状态,是成功了还是失败了,或者时需要重定向。状态码的范围从100到599, 其中有部分是已经定义的。不同的范围表示的含义也不同: | 范围 | 已定义范围 | 含义 | | ------- | ---------------------------------------------- | ---------- | | 100~199 | 100~101 | 信息提示 | | 200~299 | 200~206 | 成功 | | 300~399 | 300~305 | 重定向 | | 400~499 | 400~415 | 客户端错误 | | 500~599 | 500~505 | 服务端错误 | 首部

首部是请求和响应报文中的一些信息,形式为键值对,每对键值结尾是CRLF换行符,它决定了请求或者响应报文的属性,比如Content-Type表明了请求主体的数据类型,Date说明了请求的创建时间。客户端与服务端通过首部来协商具体行为。可以根据请求、响应、结构等,将首部分为五种。

请求首部:是放在请求报文中的首部,它被用来告诉服务端一些信息。

响应首部:为客户端提供一些可能用到的信息。

通用首部:请求与响应报文都包含的首部,例如Date首部

实体首部:对于报文实体主体部分的描述,比如Content-Type,表明其数据类型。

扩展首部:开发者自己添加的首部字段,用来满足定制化需求。

实体 HTTP/1.0 200 OK Server: xxxxxxx Date: Sun,17 Sep 2019 02:01:16 GMT --------------------------------实体首部 Content-Type: text/plain Content-length: 18 --------------------------------实体主体 Hi! I"m a message! --------------------------------

实体部分是可选的,它被用来运送请求或者响应的数据,实体由实体首部 + 实体主体组成,实体首部对实体主体做描述。HTTP/1.1定义了以下的基本实体首部字段:

Content-Type: 实体主体中的数据类型。

Content-Length: 实体主体的长度或者大小。

Content-Language: 和传输的数据最匹配的语言。

Content-Encoding: 来标识服务端编码时所用的编码方式。

Content-Location: 要返回的数据的地址。

Content-Range: 如果是部分实体,用来标记它是实体的哪个部分。

Content-MD5: 实体主体内容的校验和。

Last-Modified: 所传输内容在服务器上创建或者最后修改的日期时间。

Expires: 实体数据试下的日期时间。

Allow: 所请求资源允许的请求方法。

ETag: 资源的特定版本的标识符。可以让缓存更高效,并节省带宽。

Cache-Control: 控制缓存机制的指令。

以上是HTTP报文包含的主要结构,当请求报文到达服务器时,服务器会对报文中的内容解析出来,根据方法、资源路径、首部、和主体来处理请求,然后通过对请求资源的访问结果,来构建响应,回送给客户端。

传输层-TCP

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

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