HTTP协议请求流程分析
一、当用户输入一个域名地址(URL),首先判断它的协议名称,根据该协议名称寻找对应的协议解析方式。
二、首先要进行DNS域名解析:
1.查找浏览器中的缓存
2.查找系统中的hosts文件
3.访问本地的DNS服务器
4.通过浏览器访问,找到根域(.)
5.通过已知的根域访问,找到根域下的顶级域(.com)
6.通过该顶级域进行访问,接下来找到需要的二级域(.joes-hardware.com)
7.通过已知的二级域找对应的主机名(www.joes-hardware.com)
其中会获取到端口号 (:80),通过该端口进行通信连接
接下来会建立TCP的三次握手:
1.客户端的一方会发送一个SYN(seq=x)的请求报文,此时SYN的值为1,并进入SYN_SENT状态,等待服务器确认。
2.服务器接收到该请求报文后,如果同意进行连接的话会返回一个值为1的ACK(seq=x+1)的确认报文;同时也会发送一个值为1的SYN (seq=y) 请求报文,因为数据的建立是双向的,此时服务器进入SYN_RECV状态。
3.客户端接收到后会返回一个ACK (ack=y+1) 确认报文,返回值也为1。
此时客户端和服务器双方进入ESTABLISHED(TCP连接成功)状态,完成三次握手,通过该端口建立了通信连接。
1.当客户端发送一条HTTP GET 请求后
2.服务器会读取该请求并进行相应的HTTP响应
该过程结束过后会实现TCP的四次断开:
1.客户端发送一个FIN=1(seq=u)的释放连接报文信息,此时,客户端进入FIN-WAIT-1(终止等待1)状态
2.服务器接收到后会返回一个值为1的ACK(ack=u+1)确认报文,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。
3.客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4.服务器将最后的数据发送完毕后,就向客户端发送连接释放报文FIN=1(ack=u+1),并附带一个自己的序列号(seq=w),此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5.客户端收到连接释放报文后,发出确认报文ACK=1(ack=w+1),而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。但是TCP连接还没有完全释放,客户端必须经过2∗MSL(最长报文段寿命)的等待时间后,才能进入CLOSED状态。
6.服务器收到客户端的确认后会立即进入CLOSED关闭状态,结束TCP的连接。
此时客户端已经获得了该IP地址的内容,如果想要进行更多内容的获取,则会再次进行三次握手和四次断开的过程,从而获得相应的内容。