从输入URL到网页显示,期间发生了什么(详解)

Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL(Uniform Resource Locator, 统一资源定位器)。它是www的统一资源定位标志,简单地说URL就是web地址,俗称“网址”。

解析URL

URL格式

在这里插入图片描述

首先浏览器的第一步是对URL进行解析,从而 发送给Web服务器的请求信息。

假如说没有访问路径的话,就会访问根目录下的默认文件,即 /index.html或者 /defalut.html

解析URL:实际就是查询服务器域名对应的IP地址

首先浏览器会先看自身缓存中有没有这个域名,如果有,就直接返回,如果没有就去问操作系统,操作系统先查看自己的缓存,如果有就直接返回,如果没有,再去host文件看,再没有的话,就会去访问本地DNS服务器。

域名的级别

www.baidu.com

域名都是用" . "来分隔的,在域名中,越靠右的位置表示其层级越高

实际上域名最后还有一个点,比如
" www.baidu.com." ,这个最后的一个点表示根域名。

所以该域名的层级是.根域是最顶层,它的下一层是.com,再下面是server.com。

所以说,域名的层级关系类似一个树状结构。

在这里插入图片描述

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

而具体的查询过程我在这篇 博文里面有写。

对URL解析完之后,浏览器确定了Web服务器和文件名之后,接下来就是根据这些信息生成HTTP请求消息了。

当生成消息后接下来的传输过程就由操作系统来完成了。

操作系统协议栈

在这里插入图片描述

浏览器通过调用Socket库来委托协议栈工作,协议栈的上半部分有两块协议,分别是收发数据的TCPUDP,这两个协议会接受应用层的委托执行收发数据的操作。

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

另外IP中还包括 ICMP协议ARP协议

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

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

TCP封装

HTTP是基于TCP协议传输的,我们先来介绍一下TCP协议。

TCP包头格式

在这里插入图片描述

  • TCP源端口:源计算机上的应用程序的端口号。
  • TCP目的端口:目标计算机的应用程序端口号。
  • 序号:它表示本报文段所发送数据的第一个字节的编号。这个是为了解决乱序的问题。
  • 确认号:确认序列号是接收确认端所期望收到的下一序列号。确认序号应当是上次已成功收到数据字节序号加 1。
  • 首部头长度:指明了数据部分在段内的起始位置。

接下来的是一些状态位

  1. CER和ECE是拥塞控制的信号。当TCP接收端收到了网络拥塞的指示后,就设置ECE以便给发送端发ECN-Echo型号,告诉发送端放慢发送速率,TCP发送端设置CWR,给TCP接收端发CWR信号,只要接收端就知道发送端已经收到信号了,不会再给发送端发ECN-Echo信号了。
  2. URG为紧急信号,如果使用了紧急指针,则将URG设置为1,紧急指针指向从当前序号开始找到紧急数据的字节偏移量。
  3. ACK设置为1则表示确认有效。
  4. PSH指出中国是被推送的数据,特此请求接收端一旦收到数据后就直接较给应用程序,而不是将它缓存在缓冲区。
  5. RST是重新连接信号。
  6. SYN是建立连接信号.
  7. FIN是断开信号。

TCP是面向连接的,所以需要这些带状态的包来改变双方状态。

而它还有流量控制机制,就是通信双方各声名一个窗口(缓存大小),用来表示自己的处理能力
除了这个,它还会做拥塞控制,来控制自己发送的速度。

而在HTTP传输消息前,首先得建立TCP连接。

下面是TCP连接建立过程
在这里插入图片描述
TCP分割数据

如果HTTP的请求消息比较长,超过了MSS,这时TCP就需要把HTTP的数据拆解成一块块的数据发送。

在这里插入图片描述

数据会被以MSS的长度为单位进行拆分,拆分出来的数据又放到一个单独的数据包中,就是在每个被拆分的数据加上TCP头信息,然后交给IP模块来发送数据。

TCP报文生成

TCP协议有两个端口
一个是浏览器监听的端口(随机生成)
一个是Web服务器监听的端口(HTTP的默认端口是80,HTTPS的默认端口是443)。

在双方建立连接后,TCP的报文就是TCP头部+ HTTP头部+数据。
即如下图
在这里插入图片描述

IP封装

TCP模块在执行连接,收发,断开等各阶段操作时,都需要委托IP模块将数据封装成数据包发送给通信对象。

IP包头格式

在这里插入图片描述
在IP协议里面有源地址IP目标地址IP

源地址IP :即是客户端输出的IP地址。
目标地址IP:即通过DNS域名解析得到的Web服务器IP

因为HPPT是经过TCP传输的,所以在IP包头的协议号,要填写为06(十六进制), 表示协议为TCP。

另外在生成IP数据包时,还有一个问题,假如说客户端存在多个网卡时,在填写源IP地址时,该填写那个IP呐?=

这个时候就需要使用路由表规则,来判断哪一个网卡做为源地址IP。

在Linux操作系统中,我们可以使用 route -n ,命令查看当前系统的路由表。
在这里插入图片描述

我们假设Web服务器的目标地址是 192.168.10.200

1.首先和第一条目的子网掩码进行与运算,
192.168.10.200 & 255.255.255.0 得到的结果为192.168.10.0
192.168.10.0 与 192.168.3.0结果不一致,所以匹配失败。

2.再与第二条的子网掩码进行与运算,
19.168.10.200 & 255.255.255.0 得到的结果是192.168.10.0,所以将eth1网卡的IP地址作为IP包头的源地址。

假如Web服务器的目标地址是10.100.20.100,最后匹配的结果是第三条。

第三条的目标地址和子网掩码都是0.0.0.0,这表示默认网关,如果其他所有条目都无法匹配,就会自动匹配这一行,并且后续就把包发给路由器,192.168.3.1即是路由器的IP地址。

IP报文生成

在这里插入图片描述

在生成了IP头部后,接下来网络包还需要在IP头部的前面加上MAC头部

MAC封装

MAC包头格式
在这里插入图片描述
MAC头部是以太网使用的头部,它包含了接收方和发送方的MAC地址等信息。(用于两点之间的传输)

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

  • 0808 :IP协议
  • 0806: ARP协议

MAC发送方和接收方如何确认?

发送方的MAC地址:它在发送方的网卡中存着,只要将这个值读取出来写入到MAC头部就可以了。

接收方的MAC地址:
首先先查询ARP缓存,如果里面保存着对方的MAC地址,就直接使用。
如果缓存中没有的话,则发送ARP广播。这样就可以得到对方的MAC地址,接着操作系统会把本次查询结果放到ARP缓存中,不过只会缓存几分钟。

在Linux中,我们可以使用arp -a 来查询ARP缓存的内容。
在这里插入图片描述

MAC报文生成。

在这里插入图片描述

至此,MAC报文就生成好了。

网卡

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

负责这一过程的是网卡,要控制网卡还需要靠网卡驱动程序

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

在这里插入图片描述

  • 起始帧分解符是用来标记包起始位置的标记
  • 末尾的FCS标记(帧校验序列)是用来检验包传输过程中是否有损害

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

交换机

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

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

计算机的网卡本身具有MAC地址,并通过核对收到的包的接收方MAC地址判断是不是发给自己的,如果不是发给自己的则丢弃

相反,交换机的端口不核对接收方MAC地址,而是直接接收所有的包并存放到缓存区中,因此,和网卡不同,交换机的端口不具有MAC地址。

查询MAC地址表

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

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

  • 一个是设备的MAC地址。
  • 一个是该设备连接在交换机的哪个端口上。
MAC地址表端口控制信息
00-60-97-A5-43-3C1
00-00-C0-16-AE-Fb2
00-02-B3-1C-9C-F93

交换机根据数据包的MAC地址,与MAC地址表进行匹配,从而判断应该把数据包发送到哪个端口。

假如说MAC地址表中没有指定的MAC地址。

这样的话,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上。

同时,如果接受方MAC地址是一个广播地址,那么交换机将把包发送到除源端口以外的所有端口。

广播地址

  1. MAC地址中的广播地址 :FF:FF:FF:FF:FF:FF

  2. IP地址中的广播地址:255.255.2555.255

路由器

网络包经过交换机之后,到达了路由器,并会被转发到下一个路由器或目标设备。(交换机是用来组成局域网的,路由器则是用来连接外网的。)

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

不过它俩是有区别的

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

路由器基本原理

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

当转发包时

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

路由器包接收操作

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

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

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

查询路由表确定输出端口

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

交换机是二层设备,路由器是三层设备,MAC头部的作用就是将包送达路由器,其中的接收方MAC地址就是路由器的MAC地址,因此当到达录取之后,MAC头部就会被丢弃。

在这之后,路由器就会根据包的IP地址来对包进行转发。

首先是查询路由表判断转发目标。

目标地址子网掩码网关接口越点数
10.10.1.0255.255.255.0——eth21
192.168.1.0255.255.255.0——eth31
0.0.0.00.0.0.0——eth11

假设目标地址为192.168.1.100。
匹配的时候,就是根据包的接收方IP地址查询路由表中的目标地址,以找到相匹配的记录。

它与第二条的子网掩码 做与运算。

192.168.1.100 & 255.255.255.0 得到 192.168.1.0
与目标地址中的192.168.1.0一样。

因此,第二条记录就会做为转发目标。

实在找不到匹配路由时,就会选择默认路由,路由表中子网掩码为0.0.0.0的表示默认路由。

路由器的发送操作

首先,根据路由表的网关列判断对方的地址。

  • 如果网关是一个IP地址,则这个IP地址就是我们要转发到的目标地址,还未抵达终点,还需要路由器转发。
  • 如果网关为空,则IP头部中的接收方IP地址就是要转发的目标地址,也就是终于找到IP包头里的目的地址了,说明已抵达终点。

知道对方IP地址之后,接下来需要通过ARP协议根据IP查询MAC地址,并将查询的结果作为接收方MAC地址。

首先先查询ARP缓存,找不到的话则会发送ARP请求。

接下来是发送方MAC地址字段写为路由器输出端口的MAC地址,还有一个以太类型字段,填写0800(十六进制)表示IP协议。
网络包完成后,接下来会将其转换成电信号并通过端口发送出去,这一步的工作过程和计算机也是相同的。

在这里插入图片描述

而最终数据经过层层转发,到达路由器,再到达交换机,最终到达目的地。

在网络包传输过程中,源IP和目标IP始终是不会改变的一直变化的是MAC地址,因为需要MAC地址在以太网中进行两个设备之间的包传输。

到达服务器

数据包到达了服务器之后。

  1. 服务器首先拆开数据包的MAC头部,查看是否和服务器自己的MAC地址符合,符合就将包收起来。

  2. 接着拆开数据包的IP头,发现IP地址符合,根据IP头中协议项,知道上层是TCP协议。

  3. 接着拆开TCP的头,里面有序列号,看一看序列号是否符合,如果是就放入缓存,返回一个ACK,如果不是则就丢弃,TCP头部里面还有端口号,HTTP服务正在监听这个端口号。

  4. 于是,服务器就把这个包发送给HTTP进程。

  5. HTTP服务根据HTTP包中的请求,找到对方想要的资源,接着就把这个资源封装在HTTP响应报文中,再经过TCP,IP,MAC封装,从网卡发送出去。由交换机发送到出城的路由器,接着一次次转发,到达客户端。

  6. 最后客户端也执行拆包动作,把HTTP响应报文交给浏览器,让它去渲染页面。

参考文章: 小林coding

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值