url输入到页面展示发生了什么
1:概述
- 浏览器地址栏输入 URL 并按下回车
- 浏览器查找当前 URL 是否存在浏览器缓存,并比较缓存是否过期
- 进行 DNS 域名解析(解析出 URL 对应的 IP)
- 根据 IP 建立 TCP 连接(三次握手)
- 发起 HTTP 请求
- 服务器处理请求,浏览器接受 HTTP 响应
- 渲染页面,构建 DOM 树
- 关闭TCP连接(四次挥手)
2:详细描述
1) DNS 域名解析:- 从域名到IP地址的转换;IP地址和域名是一对多的关系;IP地址是数字,不方便记忆,故有了域名,DNS这个进行域名解析的服务器就可以通过域名地址快熟找到对应IP
2)三次握手:
说在前面:
- ACK:TCP 规定,只有当 ACK = 1时有效,也规定建立连接后所有发送的报文的ACK必须为1
- SYN: 在建立时用来同步序号,当 SYN = 1 & ACK = 0 时,表明这是一个请求报文,若对方同意建立连接,则响应报文中 SYN = 1 & ACK = 1; 因此 SYN 置为 1 表示这是一个连接请求或接受连接请求的报文
- FIN:终结的意思,用来释放一个连接。当FIN = 1时,表明此报文段的发送方的数据已经发送完毕,并请求释放连接
详细说明:
- 第一次握手:建立连接;客户端发送连接请求报文段,将 SYN 请求置为 1,此时客户端进入 SYN_SEND 状态,等待服务器进行确认。
- 第二次握手:服务端收到客户端的 SYN 报文段,需要对这个 SYN 报文段进行确认,ACK置为1,同时自己还要发送 SYN 请求信息,将 SYN置为1,服务器将 SYN + ACK 报文段一并发送给客户端,此时服务端进入 SYN_RECV 状态
- 第三次握手:客户端收到服务器的 SYN_RECV 报文段,向服务器发送 ACK 报文段(告诉对方我收到了)。这个报文发送完毕之后,二者就进入 ESTABLISHED 状态,TCP 三次握手完成,可以进行数据传输了
当客户端和服务器通过三次握手建立了 TCP 连接之后,就开始数据传输,当数据传输完毕之后,就需要关闭TCP连接,即进行四次挥手
3:四次挥手
- 第一次挥手:客户端发向服务端发送 FIN 报文段(参照上面对FIN报文的解释),此时客户端进入 FIN_WAIT 状态,表示客户端没有数据要发送给客户端了
- 第二次挥手:服务端收到客户端的 FIN 报文段,向客户端回复一个 ACK 报文段,服务端进入 CLOSE_WAIT 状态,客户端收到服务端的 ACK 报文段后,进入FIN_WAIT_2 状态
- 第三次挥手:服务器向客户端发送 FIN 报文段(服务端没有数据要发送了),请求关闭连接,同时服务端进LAST_ACK 状态
- 第四次挥手:客户端收到服务器的 FIN 报文段,向服务器发送 ACK 报文段(告诉对方我收到了)。然后客户端进入TIME_WAIT【等待足够的时间以确保远程TCP接收到连接中断请求的确认】状态,需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED【没有任何连接状态】 状态;服务端收到客户端的 ACK 报文段以后,就关闭连接;此时,客户端等待2MSL(MSL,最长报文段寿命)后依然没有收到回复,则证明服务端已经正常关闭,那么客户端也可以关闭连接了。
三次握手的必要性 / 为什么是握手必须是三次
- 为了保证服务器能接收到客户端的信息并做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手
- 故三次握手是可以确定双方都可以正常接收信息及发送信息的最少的安全握手次数
三次握手的作用
三次握手的作用也是有好多的,例如:
1、确认双方的接受能力、发送能力是否正常。
2、指定自己的初始化序列号,为后面的可靠传送做准备。
3、如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成到。
常见问题:
1:为什么客户端发送 ACK 之后不直接关闭,而是要等一阵子才关闭。
答:要确保服务器是否已经收到了我们的 ACK 报文,如果没有收到的话,服务器会重新发 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文。(至于 TIME_WAIT 持续的时间至少是一个报文的来回时间(2 * 1MSL)。一般会设置一个计时,如果过了这个计时没有再次收到 FIN 报文,则代表对方成功就是 ACK 报文(因为等了2MSL,就算服务器没有收到ACK报文段再次发送了FIN报文段, 2MSL也是需要进行此过程的最长事件了),此时处于 CLOSED 状态;
总结:四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开(由于TCP连接时全双工的,因此(需要四次)每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,