在浏览器输入一个url到返回数据的过程中发生了什么?

2,332 阅读4分钟

1、应用层

  • 向DNS服务器发起域名转换IP地址的请求

首先会从本地缓存查询,如果本地没有结果,才向DNS服务器发起请求。DNS用的是udp传输协议。

以查询www.baidu.com的ip地址为例,会从根权威服务器(.)、com权威服务器、baidu.com权威服务器依次查询

  • 构造请求行请求头请求参数等数据,这些数据被称为报文

此时将报文向下传递到传输层

2、传输层

传输层的协议包括tcp和udp,对于http协议来说,传输层的协议默认为tcp,传输之前需要先进行三次握手、四次挥手的操作,即客户端先向服务器发送一个SYN,服务器收到以后回复一个ACK,客户端收到后再回复一个ACK,三次握手的目的是为了建立可靠的连接,让收发两端都知道对方的接收和发送功能都正常。

image-20211202193400610.png

应用层的报文到达之后,传输层会对报文进行分割,分割成适合传输的大小,并加上目标端口号和源端口号等tcp专有头部数据;封装好的数据被称为tcp报文段,此时将tcp报文段向下传递到网络层

3、网络层

网络层即我们平时说的IP层,网络层起到转发、路由的作用,即帮数据包找到下一跳的位置

如何找到下一跳?

一个数据包从一端到另一端的发送并不是直达的,而是通过互联网中的多个路由器进行路由转发,才最终到达目标主机,那么它是如何确定下一跳的?这就不得不提到路由表

路由表:每个路由器都会有一个路由表,路由表中记录该路由器(网关)和网络中其他路由器(网关)的连接信息

 #linux系统中执行route -n命令,会打印出路由表的信息
 [root@QZ ~]# route -n
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 0.0.0.0         172.21.95.253   0.0.0.0         UG    0      0        0 eth0  #默认网关
 169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
 172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
 172.21.80.0     0.0.0.0         255.255.240.0   U     0      0        0 eth0
 172.38.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-a1eafe015e3f

目标ip和路由表中的子网掩码进行按位与运算得出的结果和Destination列进行比较,如果相同,就把数据包发送到该ip地址,否则最终会找到默认网关。

tcp报文段到达之后,网络层会加上目标ip和源ip等网络层专有头部数据封装成ip数据报,此时将ip数据报向下传递给数据链路层

4、数据链路层

ip数据报达到之后,数据链路层会加上目标MAC地址和源MAC地址等头部数据,封装成数据帧,将帧向下传递给物理层

  • 如何确定目标MAC地址?

这里的目标MAC地址并不是指目标ip地址对应的MAC地址,而是下一跳的MAC地址

这里的目标MAC地址是通过路由表来查询的,通过目标ip和子网掩码(Genmask)做与运算(&)即可得出下一跳的ip地址,然后通过arp广播查询ip地址对应的MAC地址

image-20211202172218930.png 这里找到了子网中的路由器,就会把目标MAC写为路由器的MAC地址,把帧传给路由器,路由器收到以后通过目标ip地址和它路由表中的子网掩码做与运算,找到下一跳的地址,就这样一直下去找到真正的目标服务器。

5、物理层

物理层的传输介质包括同轴电缆、双绞线、光纤等。

物理层不会对上层的数据进行处理,它只负责传输信号。

服务器收到后会对数据依次往上传递,并对数据头部进行处理,最终到达应用层,应用层收到后对请求进行处理,返回响应数据,然后将数据依次传递给传输层、网络层...

最后附一张自己总结的网络专用名词白话解释及数据在网络中传输的简易流程图

计算机网络.png