1.完整的流程
输入URL(Uniform Resource Locator): 用户在浏览器地址栏中输入要访问的网址或点击链接。
DNS解析: 浏览器通过域名系统(DNS)将输入的域名解析为相应的IP地址,以便与服务器建立连接。
建立TCP连接: 使用HTTP协议,浏览器通过TCP(Transmission Control Protocol)与目标服务器建立连接。这是一个三次握手的过程,确保数据可靠地传输。
发起HTTP请求: 浏览器向服务器发送HTTP请求,请求特定的资源,如网页、图像、样式表等。
服务器处理请求: 服务器接收到请求后,根据请求的内容进行相应的处理,可能涉及数据库查询、业务逻辑处理等。
服务器发送HTTP响应: 服务器将处理结果封装在HTTP响应中,并发送回浏览器。
浏览器接收响应: 浏览器接收到服务器的响应后,根据响应头中的信息判断响应类型(HTML、CSS、JavaScript等),并开始处理。
解析HTML: 如果响应内容是HTML,浏览器开始解析HTML文档,构建DOM(Document Object Model)树。
加载外部资源: 浏览器在解析HTML过程中遇到外部资源链接(如CSS、JavaScript、图片等),会发起新的请求去获取这些资源。
执行JavaScript: 如果页面包含JavaScript代码,浏览器会执行这些脚本,可能会修改DOM结构、发送Ajax请求等。
渲染页面: 浏览器根据DOM树和CSS样式表进行页面布局和渲染,最终呈现给用户。
建立持久连接: 浏览器和服务器之间可能会保持持久连接,以便在后续的请求中更快地传输数据。
页面加载完成: 所有资源都被加载和渲染完毕后,页面加载完成,用户可以与页面进行交互。
2.具体分析
2.1 DNS解析
DNS(Domain Name System)解析是将人类可读的域名转换为计算机可理解的IP地址的过程。以下是DNS解析的主要步骤:
本地缓存查找: 浏览器首先会检查本地的DNS缓存,看是否已经解析过这个域名。如果在缓存中找到了对应的IP地址,并且缓存尚未过期,就可以跳过后续的步骤直接使用这个IP地址。
操作系统缓存查找: 如果本地缓存中未找到对应的IP地址,浏览器会检查操作系统的DNS缓存。类似于本地缓存,如果在操作系统缓存中找到了对应的IP地址,就会直接使用。
递归查询: 如果在本地和操作系统缓存中都没有找到对应的IP地址,浏览器将发起一个递归查询。它会向本地配置的DNS服务器发送一个DNS请求,并等待该服务器的响应。
根域查询: 如果本地DNS服务器无法直接提供域名解析,它将向根域名服务器发出请求。根域名服务器负责存储整个DNS层次结构的顶层信息,它返回一个指向顶级域(如.com、.net)的权威域名服务器的IP地址。
顶级域查询: 本地DNS服务器获得顶级域名服务器的IP地址后,将向该服务器发送请求,获取下一级域的权威域名服务器的IP地址。例如,如果域名是example.com,那么顶级域名服务器将返回.com域的权威域名服务器的IP地址。
权限域查询: 本地DNS服务器继续向下查询,直到找到负责目标域的权威域名服务器。每一步都会获取下一级域的权威域名服务器的IP地址。
目标域查询: 本地DNS服务器最终向目标域的权威域名服务器发送请求,获取该域名对应的IP地址。
结果返回: 目标域名服务器将域名对应的IP地址返回给本地DNS服务器,本地DNS服务器再将这个结果返回给浏览器。
本地缓存更新: 本地DNS服务器将刚刚解析的域名和对应的IP地址存储到本地缓存中,以便在下一次相同的解析请求中加速解析过程。
2.2 建立tcp请求,说明一下三次握手和四次挥手
一些字段的含义
SYN:简写为S,同步标志位,用于建立会话连接,同步序列号;
ACK: 简写为.,确认标志位,对已接收的数据包进行确认;
FIN: 简写为F,完成标志位,表示我已经没有数据要发送了,即将关闭连接;
PSH:简写为P,推送标志位,表示该数据包被对方接收后应立即交给上层应用,而不在缓冲区排队;
RST:简写为R,重置标志位,用于连接复位、拒绝错误和非法的数据包;
URG:简写为U,紧急标志位,表示数据包的紧急指针域有效,用来保证连接不被阻断,并督促中间设备尽快处理;
三次握手
1.客户端发送建立请求 SYN=K
2.服务端接受到请求之后返回 SYN=J ACK = K+1
3.客户端接受到请求后 发送 ACK=J+1
为什么要三次握手
因为防止服务端接受到过去的链接,实际客户端已经断开了
四次挥手
1.客户端发送断开请求 FIN = K
2.服务端接受请求后发送 ack = K+1
3.服务端发送请求 FIN = J
4.客户端接受请求之后发送 ack = J+1 ACK = 1
为什么要四次挥手
因为tcp是双全工的,前两次挥手是客户端表示我已经发送完成,后两次是服务端发送完成。
为什么要等待2MSL?
1.保证tcp链接可以准确关闭
2.保证信息不会给传递给下次链接,消息存活时间是MSL
tcp是什么时候断开链接的
1.如果只是简单的一次 就会立刻断开
2.如果是多次复用要看设置 但也不会一直链接
3.http keep_live 可以设置链接时间