当在浏览器输入url,向服务器发送请求,浏览器都做了些什么?
http事务:从浏览器传给服务器,服务器反回内容给浏览器,这一个完整的过程就叫做http的一个事务。
1、http请求阶段:
1)浏览器把url发送给DNS服务器;
2)DNS服务器会根据IP找到对应的服务器;
3)服务器接收到请求,客户端和服务器已经产生了连接;
2、http响应阶段:
4)服务器接收到请求后,根据路径,找到相应的项目;
5)服务器找到之后,服务器立即把一些响应信息放在响应头中,通过http发送给客户端,同时进行数据整理;
6)把整理出来的数据,通过http发送给客户端,直到客户端接收完毕;
3、浏览器渲染阶段:
7)浏览器拿到从服务器传输过来的数据文件;
8)先遍历HTML,形成DOM树;
9)代码从上到下解析,形成CSS树;
10)DOM树和CSS树重新组成render树;
11)浏览器进行描绘和渲染;
四、TCP/IP答疑解惑
4.1 为什么在TCP协议里,建立连接是三次握手,而关闭连接却是四次握手呢?
因为当处于LISTEN 状态的服务器端SOCKET当收到SYN报文(客户端希望新建一个TCP连接)后,它可以把ACK(应答作用)和SYN(同步作用)放在同一个报文里来发 送给客户端。但在关闭TCP连接时,当收到对方的FIN报文时,对方仅仅表示对方没有数据发送给你了,但未必你的所有数据都已经全部发送给了对方,所以你 大可不必马上关闭SOCKET(发送一个FIN报文),等你发送完剩余的数据给对方之后,再发送FIN报文给对方来表示你同意现在关闭连接了,所以通常情 况下,这里的ACK报文和FIN报文都是分开发送的。
4.2 为什么TIME_WAIT 状态还需要等2*MSL秒之后才能返回到CLOSED 状态呢?
因为虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED 状态(就好比从SYN_SENT 状态到ESTABLISH 状态那样),但是我们必须假想网络是不可靠的,你无法保证你(客户端)最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK 状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。
4.3 关闭TCP连接一定需要4次挥手吗?
不一定,4次挥手关闭TCP连接是最安全的做法。但在有些时候,我们不喜欢TIME_WAIT 状态(如当MSL数值设置过大导致服务器端有太多TIME_WAIT状态的TCP连接,减少这些条目数可以更快地关闭连接,为新连接释放更多资源),这时 我们可以通过设置SOCKET变量的SO_LINGER标志来避免SOCKET在close()之后进入TIME_WAIT状态,这时将通过发送RST强 制终止TCP连接(取代正常的TCP四次握手的终止方式)。但这并不是一个很好的主意,TIME_WAIT 对于我们来说往往是有利的。