一次完整的HTTP请求流程(当我们在浏览器输入一个URL后,发生了什么)
首先是域名解析
浏览器检查是否有缓存(游览器缓存-系统缓存-路由器缓存)。如果有,直接显示。如果没有,跳到第三步。
在发送http请求前,需要域名解析(DNS解析),解析获取对应过的ip地址,DNS查询步骤,其中一步成功则直接跳到建立连接部分:
- 浏览器搜索自身的DNS缓存
-
搜索操作系统自身的DNS缓存
-
读取本地的HOST文件
-
向域名服务器发送请求
建立TCP连接(TCP三次握手)
浏览器获得域名对应的IP地址后,建立TCP连接,TCP协议通过“三次握手”等方法保证传输的安全可靠:
-
发送方:SYN(synchronize),客户端发送SYN包(SYN=j)到服务器
-
接收方:SYN/ACK:在接收到客户端的syn包后,服务器也要发送一个SYN包给客户端,即SYN+ACK包,(确认信息传达)
-
发送方:ACK:客户端收到SYN+ACK包后,向服务器发送ACK包(确认接收方在线可收消息,握手结束)
-
Accept:完成三次握手,客户端与服务器开始传送数
发送HTTP请求
客户端向服务端发起HTTP请求(例如:POST/login.html http/1.1)。
客户端发送请求头信息,请求内容,最后会发送一空白行,标示客户端请求完毕。
服务器发送HTML响应
服务器做出应答,表示对于客户端请求的应答,例如:HTTP/1.1 200 OK。
服务器向客户端发送应答头信息。
服务器向客户端发送请求头信息后,也会发送一空白行,标示应答头信息发送完毕,接着就以Content-type要求的数据格式发送数据给客户端。
TCP连接的释放
数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
-
客户端:FIN:客户端进程发出连接释放报文,并且停止发送数据;
-
服务器:ACK:服务器收到连接释放报文,发出确认报文;
-
服务器:FIN+ACK:将最后的数据发送完毕后,就向客户端发送连接释放报文
-
客户端:ACK:收到服务器的连接释放报文后,发出确认报文(服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接)