5

浏览器中输入URL后发生了什么?

 3 years ago
source link: https://blog.csdn.net/qq_45859087/article/details/119279376
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在浏览器中输入URL后,执行的全部过程、也就是一次http请求的过程

DNS域名解析

1.DNS域名解析协议
DNS协议的产生主要是IP地址不便记忆,在TCP/IP协议中、起初有一个叫做主机识别码的机制,这种的识别的方式指的是为每一台计算机都赋予唯一的主机名,再进行网络通信的时候可以直接使用主机名来代替IP地址,主机往往维护一个叫做hosts的数据库文件,这个数据库文件存放的就是主机名和IP地址的映射,也就是说,如果IP地址增加或者更新的话,中心的hosts数据库文件就得更新,也就是其它的计算机都要定期的更新这个hosts数据库文件、才能正确的使用网络.网络规模的扩大使这种方式的可行性降低.
所以就有了DNS系统、可以有效地管理主机名和IP之间的对应的关系,
因特网的域名系统被设计成一个联机分布式的数据库系统,并采用客户/服务器模式。域名到IP地址的解析是在域名服务器上进行的,一个服务器所负责(或者说是有权限的)的管辖范围称为区(不是以“域”为单位),各单位根据具体情况来划分自己管辖范围的区,但在一个区中的所有节点必须是能够连通的,每一个区设置相应的权限域名服务器,用来保护该区中的所有主机的域名IP地址的映射。每一个域名服务器不但能够进行一些域名到IP地址的解析,而且还必须具有连向其他域名服务器的信息,当自己不能进行域名到IP地址的转换时,能够知道什么地方去找别的域名服务器。
1、浏览器搜索自己的DNS缓存(维护一张域名与IP地址的对应表);
2、若没有,则搜索操作系统中的DNS缓存(维护一张域名与IP地址的对应表);
3、若没有,则搜索操作系统的hosts文件(Windows环境下,维护一张域名与IP地址的对应表);
4、若没有,则操作系统将域名发送至本地域名服务器—(递归查询方式),本地域名服务器查询自己的DNS缓存,查找成功则返回结果,否则,(以下是迭代查询方式)
4.1. 本地域名服务器向根域名服务器(其虽然没有每个域名的具体信息,但存储了负责每个域,如com、net、org等解析的顶级域名服务器的地址)发起请求,此处,根域名服务器返回com域的顶级域名服务器的地址;
4.2. 本地域名服务器向com域的顶级域名服务器发起请求,返回baidu.com权限域名服务器(权限域名服务器,用来保存该区中的所有主机域名到IP地址的映射)地址;
4.3. 本地域名服务器向baidu.com权限域名服务器发起请求,得到www.baidu.com的IP地址;
5、本地域名服务器将得到的IP地址返回给操作系统,同时自己也将IP地址缓存起来;
6、操作系统将IP地址返回给浏览器,同时自己也将IP地址缓存起来;
7、至此,浏览器已经得到了域名对应的IP地址;

使用IP协议、ARP协议、OSPF等协议将消息上传到服务器上

2.使用IP协议、ARP协议、OSPF等协议将消息上传到服务器上
在实际的通信中,如果只是使用IP协议肯定是不行的,比如在数据链路层的传输,在以太网的情况下使用的是MAC地址来传输数据包的,所以在传输数据的时候,需要其它的协议的辅助.比如ARP和OSPFX协议
ARP解决的是同一个局域网内,主机或路由器的IP地址和MAC地址的映射问题。如果源主机和目的主机在同一个局域网内(目标IP和本机IP分别与子网掩码相与的结果相同,那么它们在一个子网),就可以用ARP找到目的主机的MAC地址;如果不在一个局域网内,用ARP协议找到本网络内的一个路由器的MAC地址,剩下的工作由这个路由器来完成。
OSPF:Open Shortest Path First
它属于链路状态路由协议,具有路由变化收敛速度快、无路由环路、支持变长子网掩码(VLSM)和汇总、层次区域划分等优点。在网络中使用OSPF协议后,大部分路由将由OSPF协议自行计算和生成,无须网络管理员人工配置,当网络拓扑发生变化时,协议可以自动计算、更正路由,极大地方便了网络管理.

客户端和服务端建立连接

3.使用TCP建立连接
也常说的三次握手
在这里插入图片描述
TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,由Client发出请求连接即 SYN=1 ACK=0 ,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

客户端发送HTTP请求

4.建立TCP连接后发起HTTP请求
HTTP请求也就是以特定的格式发送的数据、格式参考👇我的这篇博客HTTP、HTTPS

服务端响应HTPP请求

5.服务器响应HTTP请求
HTTP响应也就是以特定的格式发送的数据、格式参考👇我的这篇博客HTTP、HTTPS
1.负载均衡
网站可能会有负载均衡设备来平均分配所有用户的请求。即对工作任务进行平衡,分摊到多个操作单元上执行,如图片服务器,应用服务器等。
2请求处理阅读请求及它的参数和 cookies

浏览器解析html代码,并请求HTML代码中的资源

6.浏览器解析html代码,并请求HTML代码中的资源(如js、css、图片等)具体的过程参考这篇博客点击查看

断开TCP连接

7.断开TCP连接
也就是常说的四次挥手
但要HTTP请求中是否是长连接。来决定是不是断开TCP连接
在这里插入图片描述
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户端适合使用长连接。在长连接的应用场景下,client端一般不会主动关闭连接,当client与server之间的连接一直不关闭,随着客户端连接越来越多,server会保持过多连接。这时候server端需要采取一些策略,如关闭一些长时间没有请求发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件允许则可以限制每个客户端的最大长连接数,这样可以完全避免恶意的客户端拖垮整体后端服务。
短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费较多时间和带宽。
在这里插入图片描述
客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

浏览器对页面进行渲染呈现给用户

8.浏览器对页面进行渲染呈现给用户
浏览器渲染引擎最重要的工作就是将HTML文档和CSS文档解析组合并绘制到浏览器窗口上。
具体的过程参考这篇博客点击查看


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK