引入
本篇是计网全家桶系列的开篇之作,本文只围绕一个问题来展开讨论。
浏览器中输入URL后到底发生了什么?
选取这个问题作为开篇之作是因为,这道高频的面试题将计算机网络中的HTTP/HTTPS协议
、TCP协议
、IP协议
、MAC地址
、APR地址解析协议
、DNS 域名解析
、 等重要组成部分很好的串联了起来,深入了解整个过程对计算机网络体系结构有会一个宏观、清晰的认识!
前置知识
URL
在此之前先来聊聊什么是URL。
URL(统一资源定位符)是Internet上资源的地址,可以定义为引用地址的字符串,用于指示资源的位置以及用于访问它的协议。
其实通俗一点讲 URL 就是我们熟知的网址,其作用就是用于检索资源和资源名称。
-
如果资源是Web类型资源,则URL在开头包含 http / https 。
-
如果资源是电子邮件地址,则以 mailto 开头。
-
如果资源是文件,则以 ftp 开头。
如图所示,URL 包含了以下信息:
- 用于访问资源的协议:如
http
、https
。 - 服务器的位置,即网址域名:如
www.csdn.com
。 - 服务器上的端口号: 这个是可以省略的。
- 资源在服务器目录结构中的位置。
说到这里,其实 URL
还有一个 父亲 URI
可以聊聊。
URI(统一资源标识符)是标识逻辑或物理资源的字符序列,与URL类似,也是一串字符。通过使用位置,名称或两者来标识Internet上的资源;它允许统一识别资源。
有两种类型的URI
,统一资源标识符(URL
)和统一资源名称(URN
)
所以URL
是 URI
的子集。
那URL和URI之间的主要区别是什么呢?
可以说URL是URI(URL是URI的子集),但URI永远不能是URL
- URL(统一资源定位符)主要用于链接网页,网页组件或网页上的程序,借助访问方法(http,ftp,mailto等协议)来检索位置资源。
- URI(统一资源标识符)用于定义项目的标识,此处单词标识符表示无论使用的方法 是什么(URL或URN),都要将一个资源与其他资源区分开来。
- URL 指定要使用的协议类型,而URI不涉及协议规范。
TCP/IP 网络模型
对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式。
而对于不同设备上的进程间通信,就需要网络通信,而设备是多样性的,所以要兼容多种多样的设备,就协商出了一套通用的网络协议。
而这个网络协议太过复杂,我们需要将它按照特定的功能进行分层。这样层与层之间相互独立,只需要完成自己本层的传输任务即可。
本来一个很复杂的网络间题会被每一层都分解为许多比较小的、界线清晰的简单问题来处理和解决。
这样使得复杂的计算机网络系统变得易于设计,实现和标准化。
而TCP/IP 网络模型 是目前被广泛采用的一种模型。
TCP/IP 网络模型主要有
这里的网络接口层由于功能的差异被分为了数据链路层和物理层。实际上的TCP/IP网络模型 只有四层。
网络协议
协议:协商是用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。
-
应用层协议定义了网络通信规则,对于不同的网络应用需要不同的应用层协议。
支持 Web 应用的
HTTP 协议
,支持电子邮件的SMTP 协议
-
运输层主要使用
传输控制协议 TCP
和用户数据协议 UDP
。TCP提供面向连接的,可靠的数据传输服务。
UDP提供无连接的,快速的数据传输服务,但不保证数据传输的可靠性。
-
网络层最常使用的是
IP 协议
。IP协议的作用主要是在相互连接的网络之间传递IP数据包
IP数据包会有显示源设备与目的设备的位置信息,即源IP地址和目的IP地址
正文部分
接下来就进入正文部分了
浏览器中输入URL后到底发生了什么?
应用层
- 浏览器解析URL, 生成HTTP请求信息
- 首先浏览器会在第一时间解析
URL
,浏览器通过URL
确定了web
服务器和文件名,将这些信息生成HTTP
请求消息,生成HTTP
也是通过解析URL
后才确定的。 - 生成的 HTTP 请求报文如下图
- 通过 DNS 查询服务器域名对应的 IP 地址。
- 在转发
HTTP
请求 信息之前,我们需要找到Web
服务器的IP地址。 - 毕竟对方地址都不知道,还谈什么转发。
- 前面有提到
URL
中存有服务器的位置,即网址域名。 - 但域名不可以直接作为地址使用。我们需要把网址域名发送给
DNS
服务器。 DNS
服务器中专门保存了Web
服务器域名与IP
的对应关系。- 本地
DNS
会将网址域名对应的IP
发送回给客户端。 - 收到IP地址后应用层就将
HTTP
请求报文交付给运输层处理
运输层
- 利用IP地址和服务器建立TCP连接,生成TCP报文
- 得到
IP
地址之后,首先需要TCP
建立连接,TCP
连接的建立,通常称为三次握手。 - 在双方建立了连接后,
TCP
报文中的数据部分就是存放HTTP
头部 + 数据,运输层组装好TCP
报文之后,就需交给下面的网络层处理。 - 生成的
TCP
报文如下图
网络层
- 在网络层通过IP协议将TCP报文中的数据封装成网络包发送给通信对象。
- 在 IP 协议里面需要有源地址 IP 和 目标地址 IP
- 源地址IP,即是客户端输出的 IP 地址;
- 目标地址,即通过 DNS 域名解析得到的 Web 服务器 IP。
- 生成的网络包如下图:
- 生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上MAC 头部。
- MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息。
- 一般在 TCP/IP 通信里,MAC 包头的协议类型只有两个:
IP 协议
ARP 协议
- 在 MAC 包头里需要发送方 MAC 地址和接收方目标 MAC 地址,用于两点之间的传输。
- 发送方的 MAC 地址是在网卡生产时写入到 ROM 里的,只要将这个值读取出来写入到 MAC 头部即可。
- 接收方的 MAC 地址则需要使用
ARP协议
通过广播目的IP地址的形式找到对应的MAC地址
- 操作系统会把每次查询结果放到 ARP 高速缓存表中留着以后用提高效率,不过缓存的时间就几分钟。
- 至此,网络包的报文如下图。
网络接口层
- 通过将网络包中的数字信息转换为电信号,实现数据在网线上的传输
- 网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。
- 因此,我们需要将数字信息转换为电信号,才实现在网线上传输,而这才是真正的数据发送过程。
- 负责执行这一操作的是网卡,要控制网卡还需要靠网卡驱动程序。
- 网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中。
- 接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
- 起始帧分界符是一个用来表示包起始位置的标记。
- 末尾的
FCS
就是帧校验序列,用来检查包传输过程是否有损坏。 - 如下图
- 最后数据包终于抵达服务器。
-
数据包抵达服务器后,服务器会先扒开数据包的 MAC 头部,查看是否和服务器自己的 MAC 地址符合,符合就将包收起来。
-
接着继续扒开数据包的 IP 头,发现 IP 地址符合,根据 IP 头中协议项,知道自己上层是 TCP 协议。
-
扒开 TCP 的头,TCP头部里面还有端口号, HTTP 的服务器正在监听这个端口号。
-
于是,服务器自然就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。
-
服务器的 HTTP 进程看到,原来这个请求是要访问一个页面,于是就把这个网页封装在 HTTP 响应报文里。
-
HTTP 响应报文也需要穿上 TCP、IP、MAC 头部,不过这次是源地址是服务器 IP 地址,目的地址是客户端 IP 地址。
- 客户端收到了服务器的响应数据包后,浏览器通过渲染得到页面。
- 客户端收到了服务器的响应数据包后,意味着数据传输结束,向服务器发起了 TCP 四次挥手,至此双方的连接就断开了。
完结散花
ok以上就是对 浏览器中输入URL后到底发生了什么? 的全部讲解啦,很感谢你能看到这儿。如果有遗漏、错误或者有更加通俗易懂的讲解,欢迎小伙伴私信我,我后期再补充完善。