透视HTTP协议

May 29, 2022

08 | 键入网址再按下回车,后面究竟发生了什么?

最简单的浏览器到服务器的流程:

  1. 浏览器从地址栏的输入中获得服务器的IP地址和端口号;
  2. 浏览器用TCP的三次握手与服务器建立连接;
  3. 浏览器向服务器发送拼好的报文;
  4. 服务器收到报文后处理请求,同样拼好报文再发给浏览器;
  5. 浏览器解析报文,渲染输出页面

HTTP协议基于底层的TCP/IP协议,所以必须要用IP地址建立连接;如果不知道IP地址,就要用DNS协议去解析得到IP地址,否则就会连接失败;

建立TCP连接后会顺序收发数据,请求方和应答方都必须依据HTTP规范构建和解析报文;

为了减少响应时间,整个过程中的每一个环节都会有缓存。

在浏览器里点击页面连接后发生了什么?

浏览器判断这个连接是要在当前页面打开还是新开标签页,接着从地址栏中获取输入的连接的服务器ip地址和端口号。浏览器用三次握手与服务器建立连接,然后向服务器发送拼接好的报文,服务端接受到后同样拼好报文再发给浏览器。浏览器解析报文,渲染输出页面。

如果是一个不存在的域名,那么浏览器的工作流程是怎样?

浏览器判断是不是IP地址,不是就进行域名解析,依次通过浏览器缓存、系统缓存、host文件,还是没有找的请求DNS服务器获取IP解析(解析失败的浏览器尝试换别的DNS服务器,最终失败的进入错误页面)。有可能获取到CDN服务IP地址,访问CDN先看是否缓存了,缓存了响应用户,无法缓存,缓存失败或者无缓存,回源到服务器。经过防火墙外网网关路由到nginx路由层。ng缓存中存在的直接返回,不存在的负载到web服务器。web服务器接收到请求后处理,路径不存在404.存在的返回结果,cdn加入缓存响应用户。

09 | HTTP报文是什么样子的?

报文结构

拿TCP报文来举例,它在实际要传输的数据之前附加了一个20字节的头数据,存储TCP协议必须的额外信息,例如发送方的端口号、接收方的端口号、包序号、标志位等。

有了这个附加的TCP头,数据包才能够正确传输,到了目的地后把头部去掉,就可以拿到真正的数据

HTTP协议也是与TCP/UDP类似,不过与其不同的是,它是纯文本的协议,所以头部数据都是ASCII码的文本。

HTTP协议的请求报文和响应报文的结构基本相同,由三大部分组成:

  1. 起始行:描述请求或响应的基本信息;
  2. 头部的字段集合:使用key-value形式更详细地说明报文;
  3. 消息正文:实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。

HTTP 协议规定报文必须有 header,但可以没有 body,而且在 header 之后必须要有一个“空行”,也就是“CRLF”,十六进制的“0D0A”。

请求行/起始行

简要描述客户端想要如何操作服务器端的资源

由三部分构成:

  1. 请求方法: 表示对资源的操作,如GET/POST
  2. 请求目标:标记请求方法要操作的资源,通常是一个url
  3. 版本号: 表示报文使用的HTTP协议版本

通常用空格分割这三部分,最后用CRLF换行表示结束

状态行

服务器响应的状态

  1. 版本号:标识报文使用的HTTP协议版本;
  2. 状态码
  3. 原因

    HTTP/1.1 404 Not Found
    HTTP/1.1 200 OK

头部字段

请求行或者状态行再加上头部字段集合就构成了HTTP报文里完整的请求头或响应头。

如果拼 HTTP 报文的时候,在头字段后多加了一个 CRLF,导致出现了一个空行,会发生什么?

空行后的数据当作body返回

讲头字段时说“:”后的空格可以有多个,那为什么绝大多数情况下都只使用一个空格呢?

节省资源

10 | 应该如何理解请求方法?

标准请求方法

  1. GET
  2. HEAD: 获取资源的元信息
  3. POST: 向资源提交数据,相当于写入或上传数据
  4. PUT
  5. DELETE
  6. CONNECT: 建立特殊的连接隧道;
  7. OPTIONS: 列出可对资源实行的方法;
  8. TRACE:追求请求 - 响应的传输路径

GET/HEAD

HEAD与GET类似,也是请求从服务器获取资源,服务器的处理机制也是一样的,但服务器不会返回请求的实体数据,只会传回响应头,也就是资源的元信息

POST/PUT

POST通常表示是“新建”,PUT是“修改”

其他方法

DELETE删除服务器资源

CONNECT,要求服务器为客户端和另一台远程服务器建立一条特殊的连接隧道,这时web服务器在中间充当代理的角色

OPTIONS方法要求服务器列出可对资源实行的操作方法,在响应头的Allow字段里返回

TRACE多用于对HTTP链路的测试或诊断,可以显示出请求-响应的传输路径。但存在漏洞,会泄漏网站信息,web服务器通常是禁止使用

12 | 响应状态码该怎么用?

状态码

  • 1xx:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
  • 2xx: 成功,报文已经收到并被正确处理
  • 3xx: 重定向,资源位置发生变动,需要客户端重新发送请求
  • 4xx: 客户端错误,请求报文有误,服务器无法处理
  • 5xx: 服务器错误,服务器在处理请求时内部发生了错误

1xx

1xx类状态是属于提示信息,提示当前协议处理处于中间状态

101 Switching Protocols, 意思是客户端使用Uprade头字段,要求在http协议的基础上改成其他协议以继续通信,比如websocket。而如果服务端也同意变更,就会发送101状态码。但这之后的数据传输就不会再用http

2xx

200 ok

204 No Content,响应头后没有body数据

206 Partial Content是http分块下载或断点传续的基础,在客户端发送请求获取资源的部分数据出现,但body里的数据不是资源的全部,而是其中的一部分

206状态还伴随Content-Range头字段,表示响应报文里body数据的具体范围,供客户端确认。例如Content-Range:bytes 0-99/2000, 此次获取的是总计2000个字节的前100个字节

3xx

表示客户端请求的资源发生了变动。客户端必须用新的URI重新发送请求获取资源,也就是通常说的重定向

301 Moved Permanently永久重定向,此次请求的资源已经不再了,需要改用新的URI访问

302 Fond 临时重定向,请求的资源还在,但暂时需要用另一个URI访问。

301 302都会在响应头里使用Location字段指明后续要跳转的URI。

304 Not Modified,用于If-Modified-Since等条件请求,表示资源未修改,用于缓存控制。“重定向到已缓存文件”

4xx

表示客户端发送的请求报文有误,服务器无法处理

400 Bad Request通用错误码,表示请求报文有错误

403 Forbidden表示服务器禁止访问资源

404 Not Found表示资源在服务器上未找到,所以无法提供给客户端

405 Method Not Allowed: 不允许使用某些方法操作资源,例如不能post只能get

5xx

表示客户端请求报文正确,但服务器在处理内部发生了错误,无法返回应有的响应数据,是服务器端的错误码

500 Internal Server Eroor通用错误码

501 Not Implemented表示客户端请求的功能还不支持

502 Bad GateWay服务器作为网关或代理时返回的错误码

503 Service Unavailable服务器当前很忙,暂时无法响应服务。503响应报文通常还会有一个Retry-After字段,指客户端可以在多久以后再次尝试发送请求

13 | HTTP有哪些特点?

灵活可扩张

HTTP最初诞生只规定了报文的基本格式,比如用空格分割单词等,报文里各个组成部分没有做严格的语法语义限制

可靠传输

HTTP协议基于TCP/IP,而TCP本身是一个“可靠”的传输协议

应用层协议

有很多应用层协议,但他们都关注很小的应用领域,例如FTP只传输文件、SMTP只能发送邮件、SSH只能远程登录。

请求-应答

请求-应答模式是HTTP协议最根本的通信模型,一发一收,有来有去。

无状态

HTTP协议是无状态

“状态”就是客户端或者服务器端里保存的一些数据或者标志,记录了通信过程中的一些变化信息。

TCP是有状态,一开始处于CLOSED状态,连接成功后是ESTABLISHED状态,断开连接后是FIN-WAIT状态,最后又是CLOSED状态。

“状态”就需要在TCP在内部用一些数据结构去维护。而HTTP在整个协议里没有规定任何的“状态”。客户端和服务器永远是在一种“无知”的状态。建立连接前两者互不知情,每次收发报文也都是相互独立的,没有任何的联系


Profile picture

百事可乐

Let it snow, let it snow, let it snow