一次HTTP请求的完整过程——协议篇(DNS、TCP、HTTP)
一次 HTTP 请求的完整过程——协议篇
一、大致流程
- 根据域名和 DNS 解析到服务器的IP地址 (DNS + CDN)
- 通过ARP协议获得IP地址对应的物理机器的MAC地址
- 浏览器对服务器发起 TCP 3 次握手
- 建立 TCP 连接后发起 HTTP 请求报文
- 服务器响应 HTTP 请求,将响应报文返回给浏览器
- 短连接情况下,请求结束则通过 TCP 四次挥手关闭连接,长连接在没有访问服务器的若干时间后,进行连接的关闭
- 浏览器得到响应信息中的 HTML 代码, 并请求 HTML 代码中的资源(如js、css、图片等)
- 浏览器对页面进行渲染并呈现给用户
二、深入分析
在网络协议方面,可以从三个方面深入分析
- DNS解析过程
- TCP连接过程(三次握手、四次挥手)
- HTTP请求响应过程
2.1 DNS解析过程(UDP通信)
三种类型的 DNS 服务器,根 DNS 服务器,顶级域 DNS 服务器和权威 DNS 服务器。
- 首先浏览器会检查浏览器自身的DNS缓存中,是否有域名对应的DNS缓存(chrome缓存1分钟,大概有1000条缓存),没有的话进入第二步,否则解析完成
- 接下来去查看系统的hosts文件(C:\Windows\System32\drivers\etc)是否有域名对应的IP地址,如果找到则停止解析,否则进入第三步
- 浏览器发起DNS系统调用,向本地配置的首选DNS服务器发起域名解析请求(通过UDP协议,向DNS的53端口发起请求)
- 首先请求会在运营商的**DNS服务器(本地服务器)**上进行请求,如果找到对应的条目,且没有过期,则解析成功,否则进入第五步
- 运营商的DNS服务器,根据解析请求,迭代查询,首先找到根域名服务器的IP地址(这个DNS服务器内置13台根域DNS的IP地址),然后找到根域的DNS地址,发送请求
- 根域服务器收到请求后,根据域名,返回对应的顶级域的服务器ip地址,并返回给运营商DNS服务器
- 运营商DNS服务器接收到根域名服务器传回来的顶级域名服务器IP地址后,向顶级域名服务器发送请求
- 顶级域名服务器接收到请求后,返回该域名对应的权威域名服务器的ip地址,并返回给运行商DNS服务器。
- 运营商DNS服务器获得权威域名服务器的响应信息后,返回给请求的主机,DNS解析完成。
DNS主要是通过UDP通信,报文结构主要分为头部Header、查询部分Question、应答部分Answer/Authority/Addition。
2.2 TCP 连接过程(3次握手 4次挥手)
- 三次握手
第一步:客户端向服务端发送一份特殊的 TCP 报文,该报文并不包含应用层的数据,是一份特殊的报文,它的 TCP 首部中 SYN 字段值为 1 。除此之外,客户端还会随机生成一个初始序号,填在报文的「序号」字段,代表当前报文的序号是这个,并且我后续的分组会基于这个序号递增。然后该报文将会经网络层、链路层、物理层发送到服务端。
第二步:如果分组丢失了,那么客户端会经过某个时间间隔再次尝试发送。而如果分组准确的到达服务端了,服务端拆开 TCP 首部会看到,这是一个特殊的 SYN 握手报文,于是为此次连接分配缓存等资源。
接着服务端开始构建响应报文,SYN 是一个用于同步需要的字段,响应报文中依然会被置为 1,并且服务端也将随机生成一个初始序号放置的响应报文的序号字段中。
最后,服务端还会为响应报文中的确认字段赋值,这个值就是客户端发过来的那个序号值加一。
整体上的意思就是说,「我同意你的连接请求,我的初始序号为 xxx,你的初始序号我收到了,我等着你的下一个分组到来」
第三步:客户端收到服务端的响应报文,于是分配客户端 TCP 连接所必须的缓存等资源,于是连接已经建立。 -
四次挥手
第一步:客户端构建一份特殊的 TCP 报文,该报文首部字段 FIN 被置为 1,然后发送该报文。
第二步:服务端收到该特殊的 FIN 报文,于是响应客户端一个 ACK 报文,告诉客户端,请求关闭的报文已经收到,我正在处理。
第三步:服务端发送一个 FIN 报文,告诉客户端,我将要关闭连接了。
第四步:客户端返回一个 ACK 响应报文,告诉服务端,我收到你刚才发的报文了,我已经确认,你可以关闭连接了。
当服务端收到客户端发送的 ACK 响应报文时,将释放服务端用于该 TCP 连接的所有资源,与此同时,客户端也会定时等待一定时间后完全释放自己用于该连接的相关资源。
点击查看更多有关TCP的介绍!!!
2.3 HTTP协议
点击查看更多有关HTTP的介绍!!!
三 总结
对于一次完整的HTTP请求过程,在协议的角度方面,可以从这三个方面进行深入分析和深入学习。