Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP 的特点 #32

Open
18888628835 opened this issue May 24, 2021 · 0 comments
Open

HTTP 的特点 #32

18888628835 opened this issue May 24, 2021 · 0 comments

Comments

@18888628835
Copy link
Owner

HTTP 的特点

基础的 HTTP 知识已经过完了,下面就基础内容对 HTTP 做一个特点总结

灵活可扩展

HTTP 是一个灵活可扩展的传输协议。

最初诞生时,HTTP 协议就本着开放的态度只规定了报文的基本格式,也就是请求行、空格、换行符、header+body 等,报文的各个组成部分并没有做严格规定,可以随开发者定制。

随着互联网的增长,HTTP 协议逐渐增加方法、版本号、状态码、头字段等。而 body 也不再局限于文本形式的 TXT 或者 HTML,增加了图片、音频视频等任意数据,也来源于其灵活可拓展的特点。

而 RFC 文档,更多的可以理解为对已有扩展的承认和标准化,实现了从实际中来,到实践中去的良性循环。

可靠传输

HTTP 协议是一个可靠的传输协议。

这是由于 HTTP 是基于TCP/IP 协议的,而 TCP 协议本身就是可靠的、完整的协议,所以 HTTP 继承了这个特性,能够实现在请求方和应答方进行可靠地传输。

它的具体做法跟 TCP/IP 差不多,都是对实际传输数据做一层包装,加上一个头,然后通过 TCP/IP 协议栈发送或者接收。

我们必须正确理解可靠的含义,可靠的传输意思是在正常的网络环境下,信息的收发必定成功。

HTTP 不能保证100%地传输能够从一方发送到另一方,可靠只是向使用者提供一个“承诺”,会在下层“尽量”保证数据的完整送达。

如果遇到非常恶劣的网络环境,比如连接环境差、网络繁忙等,也是有可能传输失败的。

应用层协议

HTTP 是应用层的协议。

在 TCP/IP 诞生后的十多年,出现了非常多的应用层协议,比如 负责远程登录的 SSH 协议,负责文件传输的 FTP 等等,但是他们都知关注于非常小的应用领域,在通用数据传输领域完全不能打。

HTTP 凭借可携带任意头字段和实体数据的报文结构,以及连接控制、缓存代理等特性,只要不太苛求性能,HTTP 几乎可以传递一切东西,满足各种需求,称得上万能协议。

请求-应答

HTTP 使用的是请求-应答的通信模式。

通俗来说,这个模式就是一发一收,有来有回,就像是函数调用,只要填写好头部字段,调用后就会收到答复。

请求-应答模式同时也明确了 HTTP 协议中双方的定位,永远是请求方先发送请求,是主动的,而应答方只能在收到请求后才能够回复,是被动的,如果没有请求就不会有动作。

在浏览器-服务器中往往浏览器是请求方,服务器是应答方。但如果服务器作为中间代理连接后端服务器,那么它就有可能同时扮演请求-应答的角色。

传统的C/S 系统架构是 Client/Server,也就是客户端/服务器,HTTP 协议的模式下请求方为客户端,应答方是服务器,这种应答模式非常契合传统架构。

随着互联网的发展,也出现了 B/S(Browser/Server)架构,用轻量级的浏览器作为客户端应用,实现客户端瘦身,而服务器则摒弃私有协议而采用通用的 HTTP 协议。

此外,请求-应答模式也完全符合 RPC(Remote Procedure Call) 的工作模式,可以把 HTTP请求封装成远程函数调用,导致了 WebService 等出现。

无状态

HTTP 协议是无状态的。

什么是无状态呢?状态其实就是客户端或者服务器保存的一些数据或者标志,记录通信过程中的变化信息。

作为对比,我们来看一下 TCP 协议,它就是一个有状态的协议,一开始它处于 CLOSED 状态,连接成功后是 ESTABLISHED 状态,断开连接是 FIN-WAIT 状态,最后又是 CLOSED 状态。

这些状态需要 TCP 内部有一些数据结构去维护。简单来说,就是一个标志量,标志着当前所处的状态。例如0代表 CLOSED,2是 ESTABLISHED 等等。

无状态可以形象地称为没有记忆能力,比如,浏览器发送了一个请求,并且附带上自己的身份令牌,比如 Token,服务器就会检查一下权限,然后发送数据回去。过了一会,浏览器再发送一个请求,由于服务器并不记录请求状态,所以也不知道是同一个浏览器请求的,依然要重新验证一下权限,这就是无状态。

在 HTTP 协议中,没有规定的任何状态,客户端和服务器永远都处于无知的状态。连接前两者并不知情,收发报文也是独立的,没有任何的联系,收发报文也不会对服务器或者浏览器造成影响,连接后也不会保存任何信息。

UDP 协议也是一种无状态的协议,但是UDP同时也是无连接的,顺序发包乱序收包,发送出去后就不管了。而 HTTP 则是有连接的,顺序发送,顺序收包,按照收发顺序管理报文。

不过由于 HTTP也是灵活可扩展的协议,虽然标准中没有规定状态,但是完全可以在协议的框架下打个补丁,增加这个特性。

其他特点

HTTP 传输的实体数据可缓存可压缩,可分段获取、支持身份认证、国际化语言等等都是 HTTP 的特点。

小结

HTTP 是灵活的可拓展的,可以添加任意头部字段实现各种功能

HTTP 是可靠的传输协议,基于 TCP/IP 尽量保证数据的完整送达

HTTP 是万能的应用层协议,比FTP、SSH 实现更多功能,可以传送任意数据

HTTP 使用了请求-应答模式,客户端主动发送请求,服务器被动回复请求

HTTP 本质上是无状态的,所谓无状态,通俗来讲就是没有记忆能力,协议不要求记录连接信息,每个请求之间、浏览器和服务器之间都是相互独立,毫无关联的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant