输入一条URL后的那些事

本文简单介绍一下:浏览器中输入URL地址,到显示网页期间发生了什么。

上图总结了 输入URL到显示网页的5个过程,主要包括:域名解析、建立TCP连接、发送http请求、服务器处理请求并返回报文、浏览器收到后解析渲染。下面介绍下这几个过程的详细信息。

文章基本搬运自:小林coding

解析

URL解析

浏览器要做的第一件事情就是解析URL。下图展示了一条URL中包括的可能信息:

通过解析URL,浏览器可以知道要用什么协议发送请求、服务器的域名、服务器上文件名,然后可以根据这些信息生成HTTP请求消息。

域名解析

我们通常都是通过域名来访问网页,比如“baidu.com”,但是客户机与服务器之间的通信依赖于IP地址,因此需要先将域名解析成IP地址才能进行接下来的操作。

所谓“域名解析”,也叫DNS解析,通过向DNS服务器发送请求,获取域名对应的IP地址。在介绍这个之前,我们需要先了解一下DNS服务器。

DNS服务器是用来存储域名和IP地址之间映射关系的服务器,当你想查询某个域名对应的服务器IP地址时,只需要向DNS服务器发送请求即可。DNS服务器的分布是一个树状结构:

如上图所示,DNS服务器分为根服务器、顶级域名服务器和权威域名服务器。所有的域名服务器中都保存了根域名服务器,因此只需要和任意一台DNS服务器通信就能获取到根域名服务器的地址。域名解析的过程大致如下图所示:

当然,这里还涉及到另外一个知识点:DNS负载均衡。对于每个域名,如果每次DNS返回的IP地址都一样,那么说明所有请求的资源都位于同一台机器上面,显然对于一个大型网站是不可能的。某些网站,同一个域名可能对应着成千上万的服务器,也就对应着成千上万的IP地址。 DNS可以返回一个合适的机器的IP给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是DNS负载均衡,又叫做DNS重定向。

协议栈

拿到服务器IP地址后,接下来就可以把HTTP的传输工作交给操作系统的协议栈了。

协议栈的内部分为几个部分,分别承担不同的工作。上下关系是有一定的规则的,上面的部分会向下面的部分委托工作,下面的部分收到委托的工作并执行。

应用程序(浏览器)通过调用 Socket 库,来委托协议栈工作。协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,它们两会接受应用层的委托执行收发数据的操作。

协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由 IP 负责的。

此外 IP 中还包括 ICMP 协议和 ARP 协议。

  • ICMP 用于告知网络包传送过程中产生的错误以及各种控制信息。
  • ARP 用于根据 IP 地址查询相应的以太网 MAC 地址。

IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作。

数据传输

传输层——TCP

HTTP使用TCP作为其传输层协议,因此拿到IP后先要和服务器三次握手建立TCP连接。成功建立连接后,就可以把HTTP报文封装到TCP报文中,发给服务器。

当然,如果HTTP请求消息过长(超过MSS),需要将HTTP拆解一个个小块,分别发送。

注:MSS指 除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度。 而MTU指 一个网络包的最大长度,以太网中一般为 1500 字节。

网络层——IP

TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通信对象。 IP报文头部如下图所示:

当存在多个网卡时,需要判断使用的是那块网卡,才能填写源IP地址。那么如何判断呢?需要根据路由表规则来判断哪一个网卡作为源地址IP。具体来说,将目标IP地址和子网掩码进行&操作后,和路由表每一行进行匹配。

链路层——MAC

生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上 MAC 头部。 MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息。

在 MAC 包头里需要发送方 MAC 地址接收方目标 MAC 地址,用于两点之间的传输

一般在 TCP/IP 通信里,MAC 包头的协议类型只使用:

  • 0800 : IP 协议
  • 0806 : ARP 协议

发送方的 MAC 地址获取就比较简单了,MAC 地址是在网卡生产时写入到 ROM 里的,只要将这个值读取出来写入到 MAC 头部就可以了。

接收方的 MAC 地址就有点复杂了,只要告诉以太网对方的 MAC 的地址,以太网就会帮我们把包发送过去,那么很显然这里应该填写对方的 MAC 地址。

所以先得搞清楚应该把包发给谁,这个只要查一下路由表就知道了。在路由表中找到相匹配的条目,然后把包发给 Gateway 列中的 IP 地址就可以了。

不知道对方 MAC 地址?不知道就喊呗。

此时就需要 ARP 协议帮我们找到路由器的 MAC 地址。

ARP 协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个 IP 地址是谁的?请把你的 MAC 地址告诉我”。

然后就会有人回答:“这个 IP 地址是我的,我的 MAC 地址是 XXXX”。

如果对方和自己处于同一个子网中,那么通过上面的操作就可以得到对方的 MAC 地址。然后,我们将这个 MAC 地址写入 MAC 头部,MAC 头部就完成了。

不过每次都要广播获取MAC地址的话会很麻烦,操作系统会有一个叫ARP缓存的东西,它把每次广播到的结果存一份到这里。每次广播前,先查一下ARP缓存中有没有,有的话直接返回,无需广播。

网卡

网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。

负责执行这一操作的是网卡,要控制网卡还需要靠网卡驱动程序

网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列

  • 起始帧分界符是一个用来表示包起始位置的标记
  • 末尾的 FCS(帧校验序列)用来检查包传输过程是否有损坏

最后网卡会将包转为电信号,通过网线发送出去。

交换机

下面来看一下包是如何通过交换机的。交换机的设计是将网络包原样转发到目的地。交换机工作在 MAC 层,也称为二层网络设备

首先,电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。

然后通过包末尾的 FCS 校验错误,如果没问题则放到缓冲区。这部分操作基本和计算机的网卡相同,但交换机的工作方式和网卡不同。

计算机的网卡本身具有 MAC 地址,并通过核对收到的包的接收方 MAC 地址判断是不是发给自己的,如果不是发给自己的则丢弃;相对地,交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,交换机的端口不具有 MAC 地址

将包存入缓冲区后,接下来需要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了。

交换机的 MAC 地址表主要包含两个信息:

  • 一个是设备的 MAC 地址,
  • 另一个是该设备连接在交换机的哪个端口上。

举个例子,如果收到的包的接收方 MAC 地址为 00-02-B3-1C-9C-F9,则与图中表中的第 3 行匹配,根据端口列的信息,可知这个地址位于 3 号端口上,然后就可以通过交换电路将包发送到相应的端口了。

所以,交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口。如果地址表中找不到这个包,就向除了源端口外的所有端口转发该包。

此外,如果接收方 MAC 地址是一个广播地址,那么交换机会将包发送到除源端口之外的所有端口。

以下两个属于广播地址:

  • MAC 地址中的 FF:FF:FF:FF:FF:FF
  • IP 地址中的 255.255.255.255

路由器

网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备。

这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。

不过在具体的操作过程上,路由器和交换机是有区别的。

  • 因为路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;
  • 交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具有 MAC 地址。

路由器的端口具有 MAC 地址,因此它就能够成为以太网的发送方和接收方;同时还具有 IP 地址,从这个意义上来说,它和计算机的网卡是一样的。

当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发送出去。

路由器接收包

首先,电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS 进行错误校验。

如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。

总的来说,路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃。

查询输出端口

完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。

MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃

接下来,路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。

转发操作分为几个阶段,首先是查询路由表判断转发目标。这里和交换机做的工作类似。

发送包

这里和交换机也是类似的,先查路由表,确定对方IP地址,然后通过ARP协议获取对方Mac地址,重新封装好数据包,发送给对方。

接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。

至此,可以稍微总结下整个HTTP的数据交互流程,如下图所示:

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Yin Peng
  • 引擎: Hexo   |  主题:修改自 Ayer
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信