搞定 HTTP 协议(二):HTTP 协议总览
从今天的文章开始,我们将正式开始介绍 HTTP 协议。文本主要介绍 HTTP 协议的总体结构以及相关概念,让大家对 HTTP 协议有一个整体的了解。
客户端与服务器之间的通信
HTTP 协议是一个无状态的请求/响应协议,通过建立一个可靠的会话层或者传输层连接来交换消息。HTTP 客户端是一个为了发送一个或多个 HTTP 请求而和服务器建立连接的程序。而一个 HTTP 服务器是为了发送 HTTP 响应而接收连接的程序。
有时,我们会把客户端理解为浏览器,但这是片面的。一般而言,我们使用用户代理(user agent)表示任何发起请求的客户端程序。这里的用户代理包括但不限于:浏览器、网络爬虫、命令行工具、定制应用、移动应用等。
所以,在通常情况下,我们将请求访问文本或图像等资源的一端称为客户端,而提供资源的一端称为服务器。
进行 HTTP 通信时,在一条通信线路上必定有一端是客户端,而另一端是服务器。但需要注意的是,客户端和服务器的角色有可能会相互交换。在一次连接中,某个程序可能扮演客户端的角色;而在另一次连接中,这个程序又可能会扮演服务器的角色。
下面我们来看一个应用了 GET 请求的 HTTP 协议, 其中请求报文与响应报文的内容如下:
请求报文
响应报文
关于请求报文与响应报文的具体细节,我会在下一篇文章中具体介绍。
中间人
HTTP(HyperText Transfer Protocol) 协议翻译成中文就是超文本传输协议。传输意味着数据要在客户端和服务器之间进行传递,但是 HTTP 协议并没有规定数据只能从客户端直接传递给服务器,或者只能从服务器直接传递给客户端。相反,在传递的过程中可以有很多“中间人”。
例如我们常见的 CDN 就可以充当“中间人”的角色,它存在于客户端与服务器之间,提供网络加速、负载均衡、安全防护等一系列能力,可以有效的提高整个传输服务。
在 HTTP 协议中,常见的“中间人”形式有三种:代理、网关(反向代理)和隧道。在某些情况下,一个独立的“中间人”可能根据每次请求的性质分别扮演一个源服务器、代理、网关和隧道。
而关于源服务器、代理、网关和隧道的知识,我也会在后面的文章中详细介绍。
HTTP 协议的无状态与持久连接
上一篇文章中已经介绍过 HTTP 协议无状态的特点,这里再简单回顾一下。HTTP 协议无状态的特点是指它不会对发生过的请求和响应的状态做持久化存储。也就是说,HTTP 协议无法根据上一次请求的状态来处理本次请求。
在早期,无状态的特点是 HTTP 协议的一大优势,由于不用存储状态,可以极大地提高服务器的运行效率。但是随着时代的发展,在越来越多的场景下,我们需要进行状态的保存以方便处理相应的业务,于是引入了 Cookie 技术。
通常,为了保存状态,服务器发送的响应报文中会有一个叫做 Set-Cookie 的首部字段,客户端获取到该报文后,就可以保存 Cookie。下一次请求时,客户端会将保存的 Cookie 携带在请求报文中发送给服务器,服务器拿到 Cookie 后进行比对,就可以知道是从哪个客户端发来的请求了。
小结
本文介绍了 HTTP 协议的基本结构:
1.HTTP 协议是一个传输协议,所以它必须至少有两方参与,分别是客户端和服务器。
2.HTTP 协议的核心是它传输的报文。客户端发送请求报文,服务器发送响应报文。
3.HTTP 协议由客户端发起请求开始,服务端发送响应结束。但 HTTP 协议没有规定中间不允许有其它的参与者。事实上,在传输过程中,有非常多的“中间人”参与传输过程。
4.HTTP 协议具有无状态的特点,为了满足现代业务的需要,出现了 Cookie 技术,可以在客户端保存状态。
在后面的文章中,我会基本围绕今天的这些要点依次展开。下一篇文章将介绍 HTTP 协议中的报文,敬请期待。
最后的话
你的点赞会给我一天好心情,如果能顺手 来个 star,再顺便关注下公众号(零幺小馆)就更完美了。
参考资料
1.RFC 7230 文档
2.《图解 HTTP》
3.极客时间 《透视 HTTP 协议》
版权声明: 本文为 InfoQ 作者【零和幺】的原创文章。
原文链接:【http://xie.infoq.cn/article/2b105ba274fe96b201191e385】。文章转载请联系作者。
评论 (2 条评论)