« 回到主页

一次HTTP页面访问过程

1 域名解析

以在浏览器输入www.baidu.com为例:
1)搜索浏览器自身的DNS缓存
2)搜索操作系统自身的DNS缓存
3)读取hosts文件
4)发起一个DNS的系统调用,根据本地配置网络时填写的DNS地址向首选DNS服务器发起域名解析请求,这个请求是递归的请求
4-1)搜索首选DNS服务器自身的DNS缓存
4-2)首选DNS服务器向根域的DNS服务器发起DNS解析请求
4-3)首选DNS服务器向com域的DNS服务器发起DNS解析请求
4-4)首选DNS服务器向baidu.com域的DNS服务器发起DNS解析请求

2 客户端发起TCP的3次握手,通过socket与服务器建立一个TCP连接

1)Client首先发送一个连接请求报文,ACK = 0,SYN = 1,seq = x,表示客户端等待服务器的回复
2)Server监听到连接请求报文后,如同意建立连接,则向Client发送确认,SYN 和ACK都置1,ack = x + 1,seq = y,表示Server已经收到Client的连接请求,等待Client的确认
3)Client收到确认后还需再次发送确认,同时携带要发送给Server的数据,ACK =1,ack = y + 1,seq= x + 1,一旦收到Client的确认后,TCP连接就建立完毕,可以发起HTTP请求了

3 客户端向服务器发送HTTP请求

TCP连接成功建立后,客户端开始向Web服务器发送请求,这个请求一般是GET或POST命令。
1次完整的HTTP请求消息包括:一个请求行、若干消息头以及实体内容,而消息头和实体内容可以没有,消息头和实体内容间有一个空行。

4 服务器向客户端发送HTTP响应

服务器收到HTTP请求,进行处理,从它的文档空间中搜索子目录的相应文件,如果找到该文件,服务器把该文件内容传送给相应的浏览器。
1次完整的HTTP响应消息包括:一个请求行、若干消息头以及实体内容,而消息头和实体内容可以没有,消息头和实体内容间有一个空行。

5 服务器发起TCP的4次挥手,关闭与客户端的TCP连接

1)Server向Client发送一个FIN报文,序列号为i,FIN和ACK都置1 ,用来关闭Server到Client的数据传送,也就是告诉Client,Server已经不会再发数据了
2)Client接到FIN(i)报文后,如果还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据,Client发送ACK,序列号为i + 1,ACK置1,告诉Server请求已经收到,但Client还没准备好,Server继续等待Client的FIN报文
3)当Client确定数据已发送完成,则向Server发送FIN报文,序列号为j,FIN和ACK都置1,告诉Server,Client数据发完了,准备好关闭连接了
4)Server收到FIN(j)报文后,就知道可以关闭连接了,Server发送ACK,序列号为j + 1,ACK置1, Client收到ACK后,就知道可以断开连接了,至此TCP连接完全关闭

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

浏览器拿到文件后,就开始解析其中的HTML代码,遇到.js、.css及图片等静态资源时,就向服务器端发起一个HTTP请求,询问从上一次修改到现在有没有对资源进行修改,如果服务器端返回304状态码(告诉浏览器没有对资源进行修改),那么浏览器会直接读取本地的该资源的缓存文件。

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

浏览器把请求到的静态资源和HTML代码进行渲染,渲染之后呈现给用户。

« 回到主页