什么是HTTP协议?
此文章简单叙述了HTTP协议,还有更多底层的东西没有涉及,有什么问题想法也欢迎共同探讨。
诞生
都说 HTTP 是基于应用层的协议,而且是基于 TCP / IP 协议的。
如果你接触过socket
网络编程,就应该明白TCP
和UDP
这两种使用广泛的通信协议如图:
既然TCP/UDP
是广泛使用的网络通信协议,那为啥有多出个http
协议来呢?
-
UDP
协议具有不可靠性和不安全性,显然这很难满足web应用的需要。 -
而
TCP
协议是基于连接和三次握手的,虽然具有可靠性,但仍具有一定的弊端。
就是因为它基于连接,若是有上万用户同时在线呢,那么数万的客户端和服务器一直保持连接状态,那么服务器将无法承载
这就衍生出了HTTP
协议。
通俗点说,就是在请求之后,服务器端立即关闭连接、释放资源。这样既保证了资源可用,也吸取了TCP
的可靠性的优点。
正是因为这一点,所以才说HTTP是无状态的。简单来说就是“服务端不知道你客户端干了什么”,这一点很大情况也是为了性能考虑的(请求后释放资源)
1.概述
HTTP
(HyperText Transfer Protocol)协议是因特网上应用最为广泛的一种网络传输协议,所有WWW
文件都必须遵循这个标准。
它是为了Web服务器
和Web浏览器
之间的通信而设计的HTTP
是一个基于TCP/IP
通信协议来传递数据(HTML
文件,图片文件,查询结果等)。
简单来说,HTTP
就是一种协议,是用于万维网服务器传输超文本到本地浏览器的传送协议。而它是基于TCP/IP
通信协议来传递数据的。
注: HTTP
协议虽然基于TCP/IP
层来使用,但是它也可以在其他任何可靠地传输层上使用
2.基本工作原理
HTTP既然是一种传输协议,那么肯定在传输的过程中存在信息的交互。
交互原理有这四个步骤:连接、请求、应答、关闭连接
-
连接:服务端 与 客户端(一般为Web服务器)建立连接,打开名为
socket
的虚拟文件,此文件建立成功代表连接也建立成功
连接不是必须的,是因为
HTTP
使用了 面相连接的TCP(传输控制协议)
-
请求:客户端 通过建立的
socket
文件向 服务端 提交请求。HTTP
的请求一般是GET / POST
命令(POST
一般由于FORM
参数的传递)。GET
命令的格式为: GET路径 / 文件名HTTP/1.0,其中HTTP/1.0指出Web浏览器使用的HTTP版本。 -
应答:客户端 提出请求后,通过
HTTP
协议传送给服务端。等待服务端处理请求,然后将处理结果返回给客户端 (通过HTTP
),最后在 客户端 上显示出所请求的页面。 -
关闭连接:应答结束后,客户端 与 服务端 必须断开,以保证其他浏览器和服务器建立连接。
3.HTTP的组件系统
3.1.客户端
客户端就是任何能够为用户发起行为的工具。这个角色通常由浏览器来扮演。
浏览器总是作为一个发起请求的实体。
浏览器获取和渲染网页也都是通过 HTTP
请求来实现
- 首先发送请求获取
HTML
文档(请求由服务端接收处理),再解析其中的资源和信息。 - 再发送其它请求,获取可执行脚本或
CSS
样式文件进行页面的渲染,以及其他的一些页面资源(图片视频)。 - 最后浏览器将整合资源,展现出完整的网页
- 浏览器执行的脚本(
JavaScript
)可以在之后的阶段获取更多资源,并相应地更新网页。
一个网页就是超文本文档。当用户操作客户端时,浏览器负责发送 HTTP
请求,并进一步解析HTTP
返回的消息,以向用户提供明确的响应。
3.2.Web服务端
通俗的说服务端就是为客户端而服务的(通信的一端)
Web服务器可以解析(handles)HTTP协议。处理客户端发送的请求
服务端虚拟意义上代表了一个机器:它可以是一种复杂的软件,它可也以是共享负载(负载均衡)的一组服务器组成的计算机集群,通过向其他计算机(如缓存,数据库服务器,电子商务服务器 …)发起请求来获取部分或全部资源。
3.3.代理(proxy)
他是网络信息的中转站,介于浏览器和Web服务器之间。
代理服务器是介于客户端和服务端之间的一台服务器。有了代理服务器之后,浏览器提出的请求不会直接由服务端来操作,请求信号会先发送至代理服务器,由代理服务器来判断是否需要向服务器端发送请求,如果代理服务器中有请求中所需的信息,那么会由代理服务器处理请求并向传递信息。
而且,大部分的代理服务器都具有缓冲的功能,它有很大的储存空间,它不断地将新取得的数据储存到它的本机储存器上,如果浏览器所请求的数据在它本机上存在并且是最新的情况下,那么他就可以直接将本机储存器中的数据传送给用户的浏览器,这样就可以显著的提高交互的效率
它还有很多的功能:
- 突破
IP
访问的限制(访问国外的网站等) - 访问单位以及团体的内部资源
- 提高访问的速度:通常代理服务器设置一个较大的硬盘缓冲区,当外界有信息通过时,同时也会将其保存至缓冲区中,当其他用户再次访问相同的信息时,则直接从缓冲区中取出信息,传给用户,可以提高效率
- 隐藏真实IP:上网者也可以通过这种方法隐藏自己的
IP
,免受攻击。
看到这里就可以很好的理解下面这张图了实际上,在一个浏览器和处理请求的服务器之间,还有路由器、调制解调器等许多计算机。由于
Web
的层次设计,那些在网络层和传输层的细节都被隐藏起来了。HTTP
位于最上层的应用层。虽然底层对于分析网络问题非常重要,但是大多都跟对HTTP
的描述不相干。
4.基本性质
HTTP 是简单的
-
HTTP
大体上还是被设计得简单易读。
HTTP 是可扩展的
- 在
HTTP/1.0
中出现的HTTP headers
让协议扩展变得非常容易。只要服务端和客户端就新headers
达成语义一致,新功能就可以被轻松加入进来。
HTTP 是无状态,有会话的
-
HTTP
是无状态的,这句话有点抽象,就是说在同一个连接中,两个执行成功的请求之间是没有关系的用户没有办法在同一个网站中进行连续的交互
比如在一个电商网站里,用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品。
而使用HTTP
的头部扩展,HTTP Cookies
可以解决此问题。把Cookies
添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。
HTTP 和连接
- 一个连接是由传输层来控制的,这从根本上不属于
HTTP
的范围。 -
HTTP
并不需要其底层的传输层协议是面向连接的,只需要它是可靠的,或不丢失消息的(至少返回错误)。 - 互联网中最常用且最可靠的是
TCP(传输控制协议)
,因此,HTTP
依赖于面向连接的TCP
进行消息传递,但连接并不是必须的。
5.cookies
Cookie 就是保存在本地的一小块数据:
HTTP Cookie
(也被称为Web Cookie
或浏览器Cookie
),是指服务器发送到客户端并被客户端保存到本地的一小块数据。
Cookie
会在浏览器下次向同一服务器再发起请求时,被携带并发送到服务器。
通常,它用于告知服务端两个请求是否来自同一浏览器,比如保持用户的登录状态。
所以说,Cookie
可以帮助 HTTP
记录稳定的状态信息。
主要作用:
- 会话状态的管理(登录状态、购物车、游戏分数等)
- 个性化设置(如自定义设置、主题等’
- 浏览器行为跟踪(如跟踪分析用户行为等)
现在随着现代浏览器开始支持各种各样的存储方式,Cookie
渐渐被淘汰。
由于服务器指定Cookie
后,浏览器的每次请求都会携带Cookie
数据,会带来额外的性能开销(尤其是在移动环境下)。
新的浏览器API
已经允许开发者直接将数据存储到本地( Web storage API
(本地存储和会话存储)或 IndexedDB
等)