首先,我们从网络协议的最顶层开始讲解,即应用层。在网络通信中,应用层是最接近用户的一层,它负责为特定的网络应用提供服务和功能。应用层协议定义了数据交换的规则和格式,以便不同的应用程序能够相互通信和交换信息。
我们可以通过在浏览器地址栏中输入网站的域名来访问该网站的内容,这就是万维网(WWW)应用。该应用使用超文本传输协议(HTTP)作为相关的应用层协议。此外,在开发过程中,我们经常使用RESTful风格的接口,同样也是使用HTTP进行远程调用。还有一些专门用于远程调用的中间框架,如Rabbin,也是基于HTTP进行调用。
HTTP基本概念
HTTP 是指超文本传输协议,全称为HyperText Transfer Protocol。它的名称可以分为三个部分:
超文本:指的是不仅仅限于文本的多样性,例如包括图片、视频等。
传输:表示数据的传输。
协议:规定了通信双方的规范。
超文本
HTTP 传输的内容是「超文本」。
在互联网的早期阶段,文本仅指简单的字符文字。然而,如今,文本的定义已经扩展到包括图片、视频、压缩包等内容。在HTTP中,这些内容都被归类为超文本。
超文本是指超越普通文本的文本形式。它是文字、图片、视频等的混合体,最关键的是它包含超链接,可以从一个超文本跳转到另一个超文本。
HTML是最常见的一种超文本格式。它本身是纯文本文件,但通过使用各种标签来定义图片、视频等内容的链接,经过浏览器解析后,呈现给我们的是一个拥有文字和图像的网页。
传输
所谓的「传输」,非常容易理解,就是将数据从 A 点传到 B 点,或者从 B 点移动到 A 点。
HTTP 协议是一种单向无状态协议,这意味着只有客户端向服务器端发送请求时,服务器才会响应并返回数据给客户端。然而,服务器并不会主动发送HTTP请求返回给客户端。因此,单向通信有对应的双向通信方式,通过某些技术和扩展,HTTP协议也可以实现类似于双向通信的效果。
例如,通过长轮询(Long Polling),客户端可以发送一个请求并保持连接打开,直到服务器有新的数据可用时才返回响应。这种方式使得服务器能够向客户端推送数据,从而实现了类似于双向通信的效果。
WebSockets是一种全双工通信协议,它允许客户端和服务器之间进行双向通信。通过建立持久的连接,WebSockets实现了更实时的双向通信。
另外,事件监听(Event Listening)也是一种常见的方法。如果你曾经实现过类似于gpt那样的聊天打字机效果,你应该对这种方式非常熟悉。在事件监听中,服务器会监听特定的事件,并在事件发生时向客户端发送数据。这种方式也能实现类似于双向通信的效果。
当我们使用互联网进行浏览网页的时候,浏览器扮演着请求方 A 的角色,而百度网站则是应答方 B。双方之间通过约定使用 HTTP 协议进行通信,因此浏览器将请求的数据发送给网站,而网站则会返回一些数据给浏览器。最终,浏览器会将这些数据渲染在屏幕上,使我们能够看到图片和视频等内容。
数据的传输不仅仅是在A和B之间进行,还可以经过其他中间节点进行中转或接力。就好像第一排的同学想要传递纸条给最后一排的同学,这个过程中需要经过许多中间人(同学),所以数据的传输方式从"A <--- > B"变成了"A <-> L <-> K <-> B"。
在HTTP中,中间人需要遵守HTTP协议,并且只要不干扰基本的数据传输,就可以添加任意的额外内容。通过这种传输方式,我们可以进一步理解HTTP。HTTP是一个在计算机世界中用于在两点之间传输数据的约定和规范。
协议
协议在生活中非常常见,我最早接触的是三方协议,之后在工作中又接触到了租房协议。
生活中的协议与计算机中的协议本质上是相同的。协议的特点是需要有多个人来遵守,如果只有自己一个人,就不需要协议了。同时,协议中还会规定一系列的行为约定和规范。比如在三方协议中,规定了试用期的期限和毁约金的金额等;在租房协议中,规定了租期的期限、每月租金的金额以及违约的处理方式等。
HTTP是计算机世界中的一种协议。它使用计算机可理解的语言,确立了计算机之间进行交流和通信的规范,同时也规定了各种控制和错误处理方式。
OK,通过对HTTP这三个名词的详细解释,可以给出更准确、更具技术含量的答案:HTTP是一种在计算机世界中约定和规范了在两个点之间传输超文本数据(如文字、图片、音频、视频等)的协议。
HTTP 请求响应过程
让我们通过一个具体的例子来深入探讨一下HTTP的请求响应过程。假设我们要访问的URL地址是:
http://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUyNTE4MTY2Mw==&action=getalbum&album_id=3104224530761236485#wechat_redirect
当我们在浏览器地址栏输入完网址后,点击回车,浏览器内部会进行以下操作:
- 首先,DNS域名解析器会解析你输入的域名(mp.weixin.qq.com),将其对应的IP地址确定下来。可以通过在线工具或者使用cmd命令窗口ping域名获取IP。
- 浏览器会使用默认的80端口与服务器建立HTTP连接。同时,浏览器客户端会随机选择一个可用的端口作为客户端端口。在客户端和服务器进程之间,会建立一个套接字用于通信。
- HTTP客户端通过套接字向服务器发送一个HTTP请求报文。这个请求报文中包含了请求的资源路径(mp/appmsgalbum),而问号后面则是我们需要的参数。关于HTTP请求报文的详细内容,我们稍后会进行详细讨论。
- HTTP服务器通过套接字接收到这个请求报文后,会对请求进行解析,并从存储器(RAM或磁盘)中检索出请求的对象(mp.weixin.qq.com/mp/appmsgalbum)。然后,服务器会将检索到的对象封装到HTTP响应报文中,并通过套接字发送给客户端。
- HTTP服务器会通知TCP断开连接。实际上,TCP连接的断开需要等到客户端完全接收完响应报文后才会断开连接。
- 当HTTP客户端接收完响应报文后,TCP连接会关闭。客户端会从响应报文中提取出响应的文件,并对HTML文件进行检查。然后,客户端会循环检查报文中的其他内部对象。
- 在检查完成后,HTTP客户端会将相应的资源通过显示器呈现给用户。
至此,通过在浏览器地址栏输入网址并按下回车的全过程就结束了。上述过程描述的是一种简单的请求-响应的完整过程,实际的请求-响应情况可能比上述过程更加复杂。
总结
本文介绍了HTTP协议的基本概念和请求响应过程。HTTP是一种用于在计算机之间传输超文本数据的协议,它包括超文本、传输和协议三个要素。超文本指的是除了文本外还包括图片、视频等内容,而传输是指数据从一个点传输到另一个点的过程。协议是指通信双方遵守的规范和约定。在请求响应过程中,浏览器首先通过DNS解析确定要访问的服务器的IP地址,然后与服务器建立HTTP连接。浏览器发送HTTP请求报文给服务器,服务器解析请求报文并返回包含请求的资源的HTTP响应报文。最后,浏览器接收响应报文并将资源呈现给用户。整个过程中涉及到的细节和步骤还有很多,但基本流程就是这样。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!