初识 HTTP 协议| 青训营

56 阅读5分钟

HTTP 协议的基本定义

HTTP协议(超文本传输协议)是一种网络通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。默认端口:80。

超文本传输协议(HyperTextTransferProtocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。

HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP是一种协议规范,这种规范记录在文档上,为真正通过HTTP进行通信的HTTP的实现程序。

HTTP 协议主要特征

1、灵活可扩展   

HTTP协议初诞生的时候就比较简单,本着开放的精神只规定了报文的基本格式,比如用空格分隔单词,用换行分隔字段,“header+body”等,报文里的各个组成部分都没有做严格的语法语义限制,可以由开发者任意定制。   

所以,HTTP协议就随着互联网的发展一同成长起来了。在这个过程中,HTTP协议逐渐增加了请求方法、版本号、状态码、头字段等特性。而body也不再限于文本形式的TXT或HTML,而是能够传输图片、音频视频等任意数据,这些都是源于它的“灵活可扩展”的特点。   

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

2、可靠传输   

这个特点显而易见,因为HTTP协议是基于TCP/IP的,而TCP本身是一个“可靠”的传输协议,所以HTTP自然也就继承了这个特性,能够在请求方和应答方之间“可靠”地传输数据。   

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

不过我们必须正确地理解“可靠”的含义,HTTP并不能100%保证数据一定能够发送到另一端,在网络繁忙、连接质量差等恶劣的环境下,也有可能收发失败。“可靠”只是向使用者提供了一个“承诺”,会在下层用多种手段“尽量”保证数据的完整送达。   

3、应用层协议   

在TCP/IP诞生后的几十年里,虽然出现了许多的应用层协议,但它们都仅关注很小的应用领域,局限在很少的应用场景。例如FTP只能传输文件、SMTP只能发送邮件、SSH只能远程登录等,在通用的数据传输方面“完全不能打”。   

所以HTTP凭借着可携带任意头字段和实体数据的报文结构,以及连接控制、缓存代理等方便易用的特性,一出现就“技压群雄”,迅速成为了应用层里的“明星”协议。只要不太苛求性能,HTTP几乎可以传递一切东西,满足各种需求,称得上是一个“万能”的协议。   

4、请求-应答   这个请求-应答模式是HTTP协议根本的通信模型,通俗来讲就是“一发一收”“有来有去”,就像是写代码时的函数调用,只要填好请求头里的字段,“调用”后就会收到答复。   

请求-应答模式也明确了HTTP协议里通信双方的定位,永远是请求方先发起连接和请求,是主动的,而应答方只有在收到请求后才能答复,是被动的,如果没有请求时不会有任何动作。   

当然,请求方和应答方的角色也不是绝对的,在浏览器-服务器的场景里,通常服务器都是应答方,但如果将它用作代理连接后端服务器,那么它就可能同时扮演请求方和应答方的角色。   

HTTP的请求-应答模式也恰好契合了传统的C/S(Client/Server)系统架构,请求方作为客户端、应答方作为服务器。所以,随着互联网的发展就出现了B/S(Browser/Server)架构,用轻量级的浏览器代替笨重的客户端应用,实现零维护的“瘦”客户端,而服务器则摈弃私有通信协议转而使用HTTP协议。   

5、无状态   

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

你一定知道,TCP协议是有状态的,一开始处于CLOSED状态,连接成功后是ESTABLISHED状态,断开连接后是FIN-WAIT状态,后又是CLOSED状态。   

这些“状态”就需要TCP在内部用一些数据结构去维护,可以简单地想象成是个标志量,标记当前所处的状态,例如0是CLOSED,2是ESTABLISHED等等。   

再来看HTTP,那么对比一下TCP就看出来了,在整个协议里没有规定任何的“状态”,客户端和服务器永远是处在一种“无知”的状态。建立连接前两者互不知情,每次收发的报文也都是互相独立的,没有任何的联系。收发报文也不会对客户端或服务器产生任何影响,连接后也不会要求保存任何信息。