前言
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。你了解
HTTP
吗?你可能会说 “不就是超文本传输协议嘛,规定了Web
服务器与浏览器之间信息传递的规范。” 但一个前端请求从发出到服务器端返回响应结果这之间到底发生了什么,你是不是想说却不知从和说起或者说不清楚呢? 本文通过两个角度进行剖析,干货满满,今天把这个小知识分享给大家,鄙人拙见,还望各位不吝赐教!
正文
基于浏览器和服务器分析
发送请求
当我们在浏览器中输入一个合法网址,准确的说,网址应该叫 URL
(Uniform Resource Locator)统一资源定位符,有各种各样的 URL
让我们不仅能够访问 Web
服务器上的资源,还能用浏览器在 FTP
服务器上下载和上传文件,同时也具备电子邮件客户端的功能,可以说,浏览器是一个具备多种客户端功能的综合性客户端软件,因此它需要特定的标识来判断应该使用哪种功能来访问相应的数据,而各种不同的 URL
就是用来干这个的。
例如:
-
使用
HTTP
协议访问Web
服务器- https://[Web服务器域名]:[端口号]/[文件路径名]
-
使用
FTP
协议下载和上传文件- ftp://[FTP服务器域名]:[端口号]/[文件路径名]
-
发送电子邮件
- mailto:[邮箱地址]
-
读取客户端计算机本地文件
- file://[本地计算机名(可省略)]/[本地文件的绝对路径]
解析 URL
发送一个 HTTP
请求,首先浏览器要做的第一步工作就是对 URL
进行解析,从而生成发送给 Web
服务器的请求消息,刚才我们已经讲过了 URL
会随着协议的不同而改变,接下来让我们来康康这一串网址在浏览器眼中是怎么样的
由上图可知,通过浏览器对 URL
的解析,明确了访问 www.xxx.com
这个服务器上路径名为 /../xx.html
的文件
对于资源文件路径可以省略的问题,可能有人会产生疑问,没有表名文件路径服务器该访问哪一个文件呢?其实,我们会在服务器上事先设置好文件名省略时要访问的默认文件名,这个设置根据服务器不同而不同,大多数情况下是 index.html
或者 default.html
之类的文件名
生成 HTTP 请求消息
对 URL
进行解析之后,浏览器确定了 Web
服务器和文件名,接下来就是根据这些消息生成 HTTP
请求消息了,实际上,HTTP
消息在格式上是有严格规定的,因此浏览器会按照规定的格式来生成请求消息,请求消息包括 HTTP 的版本号、消息头、消息体。
返回响应消息
发送请求后,Web
服务器会返回响应消息,响应消息包括 状态码、响应短语、响应标头 和 响应体,状态码和响应短语用来表示请求的执行结果是否成功,它们之间相互对应。
HTTP 状态码概要
状态码的第一位数字表示状态类型,第二、三位表示具体的状况
状态码 | 含义 |
---|---|
1xx |
告知请求的处理进度和状况 |
2xx |
成功 |
3xx |
表示需要进一步操作 |
4xx |
客户端错误 |
5xx |
服务器错误 |
返回响应消息后,浏览器会将数据提取出来并显示在屏幕上,这是我们就能看到网页的样子了,如果返回的是文字那可能就结束,但是如果网页中包含图片等资源,则需要向服务器请求若干次,直到全部资源加载完成,服务器并不关心请求是来自一个网页的还是几个网页的,它的任务就是对每一条单独的请求返回 1 条响应罢了。
到此,我们通过从发送请求,到浏览器解析以及最后的接收到返回响应消息了解了浏览器与 Web
服务器进行交互的大致过程,但文章到此就结束了吗?不不不,那就显得略拉了  ̄□ ̄||
基于网络通信进行分析
想必各位都有了解过 计算机网络层次结构模型,它是计算机网络中实现通信必须要依靠的网络通信协议,通常被称为 ISO/OSI参考模型
现在,让我们站在这个角度对标题再次进行一次审视,你发送的一个请求经过协议分层传输比特流,通过路由转发到目标 IP
地址的 Web
服务器,再经过服务器的解析返回响应消息,寥寥数句仿佛并不复杂的样子,但是你可能远远不知道从一台电脑上发送请求到目标 Web
服务器这中间发生了多少事情!
为了让大家更清楚且直观地了解这个通信过程,我爆肝了一幅流程图,供大家参考学习:
结尾
撰文不易,欢迎大家点赞、评论,你的关注、点赞是我坚持的不懈动力,感谢大家能够看到这里!Peace & Love。