【计算机网络面试】键入网址到网页显示期间,发生了什么?

发布于:2025-08-18 ⋅ 阅读:(15) ⋅ 点赞:(0)

参考:2.2 键入网址到网页显示,期间发生了什么? | 小林coding | Java面试学习

以下为自己做的笔记

HTTP

浏览器做的第一件事情是解析URL

没有路径名时,访问默认文件。

生成HTTP请求信息

确定了web服务器和文件名,根据这些信息生成HTTP请求消息。

DNS

现在需要将生成的HTTP文件发送给web服务器。

我们现在只知道主机名,但没有IP地址,怎么在网络世界中知道去哪呢?现在就需要DNS服务器查询域名对应的IP地址。

域名的层级关系   www.server.com.  最后这个点代表根域名

根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。

所有的DNS服务器找到根域服务器,向下顺层摸瓜就找到了需要解析的域名的DNS服务器。得到返回的IP地址。

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

协议栈

知道IP后,就可以把传输工作交给协议栈了。

如上图协议栈中,上层是TCP、UDP,下层是IP

IP 中还包括 ICMP 协议和 ARP 协议:

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

可靠传输--TCP

TCP报文头部:

首先,源端口号目标端口号是不可少的,如果没有这两个端口号,数据就不知道应该发给哪个应用。

接下来有包的号,这个是为了解决包乱序的问题。

还有应该有的是确认号,目的是确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达,这个为了解决丢包的问题。

接下来还有一些状态位。例如 SYN是发起一个连接,ACK是回复,RST是重新连接,FIN是结束连接等。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。

有一个重要的就是窗口大小。TCP 要做流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够的处理能力,别发送的太快,撑死我,也别发的太慢,饿死我。

除了做流量控制以外,TCP还会做拥塞控制,对于真正的通路堵车不堵车,它无能为力,唯-能做的就是控制自己,也即控制发送的速度。不能改变世界,就改变自己嘛。

TCP传输前进行三次握手

在 Linux 可以通过 netstat -napt 命令查看TCP 的连接状态。

TCP报文生成,接下来,交给网络层。

远程定位--IP

IP报文头部:

两点传输--MAC

以太网中传输是两点匹配的方式

MAC头部格式:

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

查路由表(知道该发给谁)>有了IP,ARP协议帮我们找MAC地址

接收方的MAC地址就有了

不用每次都广播,先查ARP缓存,没有再广播。

MAC报文生成

出口--网卡

FCS(帧校验序列)用来检查包传输过程是否有损坏

转换为电信号,通过网线发送出去

交换机

交换机的端口不具有 MAC 地址

包到达交换机后查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了。地址表中有两个信息:

设备的MAC地址

设备连接在交换机的哪个端口

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

找不到MAC地址时,发送到所有端口。

通过交换机到达路由器,离开子网了。从路由器出境。

路由器

路由器的端口具有 MAC 地址,因此它就能够成为以太网的发送方和接收方。

MAC 头部的作用就是将包送达路由器。路由器接收包,路由表查询转发目标,(根据路由表的网关列判断到没到达终点),确定下一个IP地址后,ARP协议查询MAC地址,将其作为目标MAC,传输到下个节点。

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

扒皮

到达服务器后,开始对数据包进行扒皮

数据包抵达服务器后,服务器会先扒开数据包的 MAC 头部,查看是否和服务器自己的 MAC 地址符合,符合就将包收起来。

扒开IP头,发现IP符合,根据协议项,知道是TCP协议。

扒TCP的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。TCP头部里面还有端口号, HTTP 的服务器正在监听这个端口号。

知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。

HTTP 进程看到,原来这个请求是要访问一个页面,于是就把这个网页封装在 HTTP 响应报文里。

这时收发方转换,但原理相同。


网站公告

今日签到

点亮在社区的每一天
去签到