网页请求流程
从浏览器输入网址、回车后,到用户看到网页内容,经过的步骤如下:
(1)dns解析,获取ip地址;
(2)建立TCP连接,3次握手;
(3)发送HTTP请求报文;
(4)服务器接收请求并作处理;
(5)服务器发送HTTP响应报文;
(6)断开TCP连接,4次握手。
--------------------------------------------------------------------------------
(1)DNS解析阶段
http://www.cnblogs.com/yuan2016/p/DNS.html
本机系统先访问本机的hosts文件和缓存,再去找dns(叫做local dns)询问,一般在运营商那里。
(2)建立TCP连接,3次握手
客户端首先与服务器建立连接,发送SYN请求;服务器收到请求后,发送SYN/ACK确认连接请求;客户端收到后再发送ACK进行确认。
(3)HTTP请求报文
分为4部分:
① 请求行(3部分信息):请求方法、请求url、http协议版本。
请求方法:GET、POST、HEAD、PUT等;
HTTP协议版本:一般为两种:http1.0、http1.1。其中,http1.0在每次请求之后,都释放连接,针对网页中的不同元素,如视频、图片,要分别进行tcp连接,需请求多次;而http1.1可进行持久连接,例如,网页中的元素可一次性请求完,而只需进行一次tcp连接。
② 请求头部。客户端的信息、字符集等。
③ 空白行。
④ 请求主体。
(5)服务器的HTTP响应报文
也分为4部分:
① 起始行:http协议版本、状态码、响应头部信息。
状态码:
(1)100~199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程 。
(2)200~299 表示成功接收请求并已完成整个处理过程 。
(3)300~399 为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址。
(4)400~499 客户端的请求有错误。
(5)500~599 服务器端出现错误。
常见的几种如下:
正确:200;
网站被重定向,永久跳转:301;
资源存在但没有权限,服务器设置了访问权限(Forbidden):403;
资源不存在:404;
服务器内部错误,无法完成用户请求:500;
连接不上后台服务器(Bad Gateway):502;
回复超时(Gateway Timeout):504。
② 响应头部。
③ 空行。
④ 响应主体。静态网页一般就是html,无法和用户进行交互;动态网页,如:jsp、php、asp等,可交互以及显示特效;伪静态,就是动态网页利用rewrite重写技术变成静态网页,目的是方便搜索引擎收录,搜索引擎对url的问号等识别不好,提高网站被搜索到的几率。
(6)断开TCP连接,4次握手
① 客户端发送FIN=1的数据包到服务端,并进入wait 1状态;
② 服务端接收到之后,发送ACK进行确认,表示前面的数据全都收到了,并释放客户端到服务端的连接,进入close wait状态,此时服务端仍可向客户端发送数据;
③ 客户端收到服务器的ACK之后,进入WAIT 2状态,进一步等待服务器发出连接释放的数据段;
④ 当服务器发送完全部的数据后,释放服务器向客户端的TCP传输连接,向客户机发送FIN=1,ACK=1的数据包,并进入LAST ACK(最后确认)状态,等待客户端的确认;
⑤ 客户端收到服务器的FIN+ACK数据包后,向服务器发送一个ACK=1的数据包,进入到TIME WAIT状态,需等待2MSL时间(以防最后一个ACK数据包丢失),然后,客户端才进入closed状态,释放tcp连接。
⑥ 服务器收到客户端的ACK数据包后,进入CLOSED状态,释放TCP连接。完成整个TCP传输连接释放过程。
整个TCP建立、释放过程如下图所示: