键入网址到网页显示,期间发生了什么?


首先是解析URL,生成发送给web服务器的请求信息,URL中包含了web服务器的名字和要请求的文件名,我们有了这些信息就可以生成HTTP请求信息了。

其实也就是我们平时见到的请求报文,包含行头体

不过生成了这个报文之后该怎么办呢,还有很多东西都没有,所以我们直接按照TCP/IP协议栈往下走就行了

不过在此之前,我们还需要做一些准备操作,我们需要查询服务器域名对应的IP地址,关于域名的层级,越往右的层级就越高

域名的层级类似于一个树形的结构,根节点是根DNS服务器(.),然后就是顶级域DNS服务器(比如 .com),然后再是权威DNS服务器(比如 server.com)。

根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了

因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器

image-20241028151536692

简单的说,就是先发给本地DNS服务器,如果可以在缓存中找到就返回,如果没有就会去问根域名服务器,然后依次往下问,直到找到了。

DNS解析很类似于问路,只问路不带路,只告诉你有没有,没有你可以找谁去问。当然,问完之后我们就会缓存这个域名对应的IP地址,避免每次解析域名的时候都要问来问去的

确定好了发送的内容之后,首先我们要考虑是通过什么样的方式传输,这里我们先介绍可靠传输TCP。

TCP报文格式:

  • 包含源端口号和目标端口号,让数据知道发给哪一个应用
  • 包含数据包的序号,解决数据包乱序问题
  • 包含确认号,解决数据包丢包重传的问题
  • 包含状态位,配合TCP的三次握手
  • 包含窗口大小,解决流量控制问题

TCP建立连接,称为三次握手

“SYN” 是 “synchronize” 的缩写,是计算机网络中用于 TCP(传输控制协议)连接建立的一个重要控制位。TCP 是一种面向连接的协议,确保数据在网络上的可靠传输。

image-20241028153211931

我们可以看到,三次握手,其实就是CS两端各发送一次SYN和ACK,这个其实是为了保证双方都有发送和接收的能力

确定我们采用什么样的传输方式之后,接下来我们需要考虑的问题就是要把这个数据包传到哪里,也就是通过IP来进行远程定位

IP报文的格式如下

  • 包含源地址IP和目标地址IP,主要是让这个报文可以传递过去,同时也可以让对方传递过来
  • 包含协议号,表示是TCP还是UDP协议

生成了IP头部之后,接下来我们还得在IP头部加上MAC头部

MAC包头包含的数据如下

  • 包含发送方的MAC地址,同时也包含接收方的MAC地址,主要是实现两点之间的传输
  • 包含协议类型,一般在TCP/IP通信中,MAC包头的协议类型只使用IP(Internet Protocol,互联网协议)协议和ARP(Address Resolution Protocol,地址解析协议)协议

发送方的MAC地址直接从ROM中读取出来写到MAC头部就行了,接收方的MAC地址一般是先查询ARP缓存中有没有对方的MAC地址,如果有就直接用,如果没有,就发送ARP在以太网中进行广播查询

我们可以使用 arp -a 命令来查看 ARP 缓存的内容。

image-20241028164542074

所以现在的报文变成了这样

img

好的,历经千辛万苦,我们经历了应用层,经历了传输层,经历了网络层,经历了链路层,最后终于到了物理层

网络包在内存中只是一串二进制数字信息,不能直接发送给对方,所以我们还需要把这些数字信息转换为电信号,才能在网上传输。

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

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

image-20241028170027447

其中包括了起始帧分界符,作用是表示包起始位置的标记,末尾还包括FCS帧校验序列用于检查包的传输过程是否有损坏

经过这最后一层包装之后,网卡会将数据包转换为电信号,通过网线发送出去

首先看看是如何通过交换机的,交换机工作在MAC层,也被称为二层网络设备,首先这个电信号到达网线接口之后,会将电信号转换为数字信号,然后通过刚才提到的FCS校验错误,如果没有问题就会放到缓冲区

注意一点,交换机的端口没有MAC地址,所以不会核对是不是发给自己的,数据包进入缓冲区之后,接下来来需要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了

交换机的MAC地址表主要包含了两个信息,分别是一个设备的MAC地址和该设备连接到交换机的哪一个端口上

交换机的 MAC 地址表

交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口交换机交换的是端口,这个交换是靠MAC地址实现的

不过,如果找不到指定的MAC地址呢?

地址表中找不到指定的 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 地址,则这个IP 地址就是我们要转发到的目标地址,还未抵达终点,还需继续需要路由器转发
  • 如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,也是就终于找到 IP 包头里的目标地址了,说明已抵达终点

知道了对方的IP地址之后,接下来会通过ARP协议根据IP地址查询MAC地址,并将查询的结果作为接收方MAC地址。当然,路由器也有ARP缓存,所以会在缓存中先查询,找不到才会发送ARP查询请求。现在有了接收方的MAC地址,我们还需要知道发送方的MAC地址,这里会填写输出端口的MAC的地址

网络包完成之后,会将其转换为电信号并通过端口发送出去,发送出去的网络包会通过交换机到达下一个路由器,由于接收方MAC地址就是下一个路由器的地址,所以交换机会将这一数据包传输到下一个路由器

如此反复,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地(也就是网关为空了,不过突然发现一个事情,网关只有路由器有,因为路由器才有IP地址和MAC地址一说)

还有就是,我们发现在以太网中,源IP和目标IP始终不变,也就是这个IP是用于路由的,一直变化的是MAC地址,因为MAC地址在以太网内进行两个设备之间的包传输。

所以说,MAC地址只要一找不到就泛洪,找到返回之后就缓存。(这就是通过IP找到对方的实质)

跨越不同子网的情况下,MAC地址获取过程依赖于路由器的转发,而不是直接的ARP广播。设备只需关心与其直接相连的设备(如默认网关)的MAC地址,路由器会处理后续的转发和地址解析

说实话很像是树上两个节点访问,至于为什么要出现MAC这个东西是因为IP在传输的时候不能改变,可以理解为IP就是我们跑步设立的起点和终点,但是路上我们要经历一步一步,这就是MAC地址,用于两个设备之间传递消息时使用。

然后就开始一层层解开数据,解包了。

image-20241028185449228

这个解开的时候和上树很类似,可以结合着联想一下。

参考文章:2.2 键入网址到网页显示,期间发生了什么? | 小林coding (xiaolincoding.com)


文章作者: zoloy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zoloy !
评论
  目录