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)协议。