输入URL会发生什么

一、DNS解析
浏览器能访问的资源都是通过IP访问的,但是为了方便我们记忆和使用网站都是使用的域名,所以当我们输入一个域名的时候就需要浏览器进行域名解析。浏览器解析域名的流程是
a、先从浏览器缓存中查找是否有该域名(浏览器缓存),
b、浏览器缓存中没有则从系统缓存中查找(系统缓存),
c、系统缓存中没有则从路由缓存中查找,(路由器缓存)
d、路由缓存没有则从本地DNS服务器中查找,(ISP DNS缓存)
e、本地DNS服务器中没有则从其他DNS服务器中查找,其他服务器中查找的规则是递归查找,查找的顺序是(根域名服务器,一级域名服务器,二级域名服务器,三级域名服务器,是递归查询)

二、TCP三次握手建立连接
输入URL会发生什么

①、Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候Client进入syn_sent状态,表示客户端等待服务器的回复

②、Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server 自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认。

⑤、Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。
为什么不是两次握手?防止了服务器的一直等待而浪费资源

三、发送HTTP请求并响应
连接成功之后就可以开始传输数据了,传输数据需要将用户输入的URL封装成HTTP Request请求报文,发送到服务器,服务器收到请求后会发出应答,即响应数据。
HTTP请求报文格式:请求报头和请求主体。请求报头包括请求方式(GET/POST/DELETE/PUT)、请求资源路径、HTTP版本号,返回的信息是否需要缓存,以及客户端是否发送cookie等

四、断开连接,TCP四次挥手
第一次挥手
因此当主动方发送断开连接的请求(即FIN报文)给被动方时,仅仅代表主动方不会再发送数据报文了,但主动方仍可以接收数据报文。
第二次挥手
被动方此时有可能还有相应的数据报文需要发送,因此需要先发送ACK报文,告知主动方“我知道你想断开连接的请求了”。这样主动方就不会因为没有收到应答而重复发送断开连接的请求。
第三次挥手
被动方在处理完数据报文后,便发送给主动方FIN报文;这样可以保证数据通信正常可靠地完成。发送完FIN报文后,被动方进入LAST_ACK阶段(超时等待)。
第四挥手
主动方发送ACK报文进行连接中断的确认,被动方接收后,连接就正式中断了。

五、浏览器解析渲染页面**