在浏览器地址栏中输入一个URL或点击一个超链接后都发生了什么

本文详细解析了从用户在浏览器中输入URL到网页完全加载并呈现给用户的全过程,包括DNS域名解析、TCP三次握手、数据传输及四次挥手断开连接等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当用户在主机A的浏览器中地址栏输入一个URL或在网页中点击一个超链接后,会发生一系列我们看不到操作,然后把网页内容呈现给用户。过程图如下:

 

图片参考https://blog.youkuaiyun.com/qq_24028753/article/details/75100484

在这里,我把它分为如下四大步骤:

第一步:DNS服务器首先对该链接进行域名解析,将域名转换为IP地址。

域名解析过程用到的传输协议是UDP,查询方式分为递归查询和迭代查询。两种查询的访问顺序:本地域名服务器---根域名服务器---顶级域名服务器---权限域名服务器

主机A向本地DNS的查询一般都采用递归查询。递归查询过程:如果主机A在本地域名服务器中查询不到IP地址,那么本地DNS就以DNS客户的身份代替主机A在根域名服务器中查询IP(本质上是DNS客户向根域名服务器发送查询请求,根域名服务器提供查询服务,返回查询结果。其中的根域名服务器是最高层次的域名服务器,所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址),如果查不到,根域名服务器再在顶级域名服务器中查询,就这样一层一层的向下查询,直到查询到域名对应的IP地址,再原路返回结果,否则就报错。这种传递性查询就称为递归查询。

DNS服务器之间的交互查询一般都采用迭代查询。在迭代查询过程中,主机A向本地域名服务器进行递归查询,如果在本地域名服务器查询不到IP地址,本地域名采用迭代查询,再向根域名发送查询请求,根域名服务器不会替主机A去查询,而是告诉主机A的本地域名服务器顶级域名服务器的IP地址,然后主机A的本地域名服务器再访问顶级域名服务器,发送查询请求,反复查询,直到在某台服务器中查询对应的IP地址后,该服务器将结果返回给主机A的本地域名服务器,然后本地域名服务器再将结果返回给主机A。这种不断向主机A的本地域名服务器返回IP地址的查询称为迭代查询。

经过上述查询之后,主机A将查到的目的IP地址封装到报文首部,数据传输任务就交给传输层。

第二步:进行TCP三次握手,建立TCP连接。

主机A的浏览器有了要访问的服务器的IP地址后,接着通过IP地址+端口号和服务器B进行TCP的三次握手,建立连接。

首先A将TCP报文段首部的SYN置为1,选择一个初始序列号seq=x(TCP规定,SYN报文段不能携带数据,但要消耗掉一个序号),然后主机向服务器发出连接请求的报文段,进入SYN-SENT(同步已发送)状态。

然后B收到请求报文段后,做出响应,将ACK置为1,确认号ack=x+1(大写表示状态,小写表示数值),选择自己的一个初始序列号seq=y,然后将该报文段发送给主机(该报文段也不带数据)。

最后A收到B的确认后,需要向B也做出收到响应的确认,将ACK置为1,ack=y+1,seq=x+1。至此TCP连接已建立,A进入ESTABLISJED(已建立连接)状态,B收到确认后也进入ESTABLISJED状态,之后主机A和服务器B之间就可以进行数据传输了。

第三步:进行数据传输。

在传输过程中,主机A的浏览器首先将url地址通过http协议包装成请求报文发送给服务器B(http协议是面向事务的,本身是无连接的,虽然http使用了TCP连接,但通信双方在交换HTTP报文签不需要先建立HTTP连接),而此时,A只知道B的IP地址,可能还不知道B的mac地址,要想把数据传给B,就要用到地址解析协议(ARP,有些书将该协议划分到网络层,因为ARP要用到网络层的IP协议,有些书把它划分到数据链路层,因为它的用途是把IP地址解析成数据链路层的mac地址),ARP解析出mac地址的过程如下:

如果A和B是第一次通信且在同一局域网,那么A就会在本局域网中广播一个ARP包,在ARP包中写入自己的IP地址和mac地址,并告诉局域网中的所有主机我要找XXX(B的IP地址)的mac地址。

局域网中主机收到ARP包后,不是自己的IP地址则选择丢弃,B收到后,会将A的mac地址写入ARP高速缓存器中,并将自己的mac地址写入ARP包单播发送给A。

A收到B发送的ARP包后也将B的mac地址写入自己的ARP高速缓存器中,之后A和B的通信就可以直接在ARP高速缓存器中找对方的mac地址了。

如果A和B不在同一局域网,两个网络由R路由器相连,那么A在自己网络中广播ARP请求,会找到路由器R的mac地址,然后R在B所在的网络中广播ARP请求,找到B的mac地址,之后A和B就可以通过路由器R进行通信了。

通过上述的ARP解析过程得到mac地址后,主机A将mac地址封装在帧首部,发送给B。

服务器B将接收到请求报文通过http协议进行解析,然后将要发送的数据包装成响应报文发送给主机A,主机A收到数据后,浏览器继续进行HTML页面解析,遇到网页中的图片、cs、js、超链接等引用资源时,继续向服务器B发出请求,服务器B收到请求后做出响应(主要是找到链接中相应的资源)将数据分组打包返回给浏览器,如此反复进行,直至数据传输完成。

第四步:四次挥手,关闭数据连接,浏览器将网页进行渲染呈现给用户。

数据传输完成后需要进行四次挥手,断开连接,释放网络资源。

首先主机A将FIN置为1,seq=u(u等于前面传输数据时A传送的最后一个报文段序号+1),向服务器B发送释放连接的报文段,并停止发送数据,A进入FIN-WAIT-1(终止等待1)状态。

B收到释放连接的报文段后,将ACK置为1,ack=u+1,seq=v(v等于前面传输数据时B传送的最后一个报文段的序号+1),向A发送确认。这时B进入CLOSE-WAIT状态,TCP连接处于半关闭状态,也就是A已经没有数据要发给B了,但B还可以向A发送数据。A收到B的确认后进入FIN-WAIT-2状态,等待B发出释放连接的报文。

若B也没有数据要传输A了,就使FIN=1,seq=w(在半关闭状态可能又向A发送了一些数据),ACK=1,ack=u+1(必须重复上次已发送过的确认号),向A发送释放连接的报文段。这时B进入LAST-ACK(最后确认)状态,等待A的确认。

A收到B发送的释放连接报文段后,使ACK=1,ack=w+1,seq=u+1,向B发送确认,然后进入TIME-WAIT状态,此时TCP连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL(Maximum Segment Lifetime 最长报文段寿命)后,A才进入CLOSED状态。

注意:A进入TIME-WAIT状态后必须等待2MSL,是因为A向B发出确认后需要等待B接收,如果B在一个RTO(超时重传时间)内没收到A的确认,就会认为A没收到自己发送的释放连接的报文段,就会进行超时重传,A收到重传的报文段后就知道B没收到自己发送的确认,需要重新向B发送确认。

小结:整个过程中主要用到的协议有:http,DNS(域名解析),UDP(域名解析时会用到),TCP,ARP(将IP地址转换为mac地址),IP协议,NAT(网络地址转换协议,如果是内网访问外网的话会用到)等。

 

三次握手、四次挥手过程可参考https://blog.youkuaiyun.com/changyourmind/article/details/53127100

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值