HTTP | 青训营

92 阅读6分钟

1,HTTP协议是什么?

HTTP协议:全称为Hyper Text Transfer Protocol(超文本传输协议)。HTTP协议是用于从(WWW:World Wide Web,简称万维网)服务器传输超文本到本地浏览器的传输协议。

HTTP协议工作于B/S架构上,浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务端发送请求(Request)。Web服务端根据接收到的请求数据后,向客户端发送响应信息(Response)

HTTP协议是基于TCP/IP通信协议来传输数据的(HTML文件,图片文件等)

2.HTTP协议里面有什么? HTTP工作原理

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

请求报文:

请求行

方法名(GET、POST等)

URL

协议版本

请求头

协议约定(Content-length等)

业务相关(自定义的元数据)

请求体

响应报文:

状态行

协议版本

状态码

状态码描述

响应头

协议约定

业务相关

响应体

常见的方法名: GET、POST、PUT、DELETE、HEAD、CONNECT、OPTIONS、TRACE、PATCH

GET是HTTP 0.9中唯一的一个方法,之后在HTTP 1.0中增加了HEADER和POST,紧接着在HTTP 1.1中又陆续了增加了5个方法。

PATCH和PUT的区别:

PATCH是部分更新,PUT是完整更新\nPATCH是幂等的,PUT不是幂等的

3.HTTP框架的设计与实现

计算机网络中的协议使用了分层设计。分层设计可以简化系统设计,让不同的人专注做某一层次的事情。有了分层的设计,大家只需要使用下一层提供给上层的接口,专注特定层的开发就可以了,至于这个接口底层是如何实现是不用关心的。

分层架构可以让我们更容易做横向扩展。如果系统没有分层,那相关的扩展就会变得不太容易,比如某些Go的 HTTP 框架,到现在也没有支持 http 2,那肯定不是它不想支持。

最后,分层之后可以做到很高的复用。比如,我们在设计模块A的时候,发现这一模块具有一定的通用性,那么我们可以把它抽取独立出来,在设计系统B的时候使用起来,减少工作量。

HTTP 架构从整体上来看,从上往下总共分为了五层,层与层之前使用接口解耦。

从上开始的话就是应用层,这一层是跟用户直接打交道的一层,这一层会对请求进行一个抽象,包括像 request response context 等等。应用层也会提供一些丰富的易用的API。

然后下一层就是中间件层,可以对请求有一些预处理和后处理的逻辑,像可以打一些 accesslog,打一些耗时的点。其他中间件比如 Reacovery 中间件用于捕获 Panic。

之后是路由层,路由层有一个原生的路由实现来提供类似于跟注册、路由寻址的一些操作。这一部分的内容在下一部分会具体进行详细地展开。

然后再往下的话就是协议层。现在 http 1.1 已经不能够满足我们所有的需求了,我们需要支持 HTTP 2、Quic 等等,甚至是在 TLS 握手之后的 ALPN 协商升级操作,那这些都需要能够很方便的支持。

最后一层的话就是网络层,不同的网络库使用的场景并不相同,那也需要一个灵活替换网络库的能力。

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

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

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

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

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

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

4.HTTP的组成

1.建立连接

老板找出自己公司的总计电话并拨通,员工接听电话的过程就是建立连接。

根据用户输入的URL地址,通过DNS、负载均衡等技术找到一台服务器,客户端与服务器端的80端口建立一个TCP连接

2.进行请求

电话被接通之后,老板可能要求某个具体员工进行接听,并且会对该员工下达一些命令,比如帮他取快递,预定酒店,收购公司等。这个过程就是进行请求。

客户端向服务器发送消息,请求URL中指定的页面,要求执行指定的操作。

老板对员工下达的命令中,可以分为很多种,比如有些命令只是简单的事情询问,有些命令要求员工执行某些决定,如收购。

同样,HTTP的请求方式也有很多种,主要的是GET、POST、HEAD等。

3.响应

员工在接收到老板下单的命令后,需要对该命令做出回应。比如直接告知老板他接下来的行程,帮老板预订好酒店后告诉他已经预订成功等。这个过程就是响应(response)

服务器向客户端发送响应。响应以状态码开头。常见的状态码有:200、302、404、500等。

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。

4.关闭连接

老板在下达完命令,并且员工给予响应之后,双方会挂断电话。这个过程就是关闭连接。

客户端或服务端都可以关闭连接。每个请求都是用一个单独的网络连接。

特别的是:服务器不回记忆前面一次连接或者其结果,这种不记忆过去请求的协议被称为无状态(stateless)协议。