目录
以从浏览器请求服务器再到返回响应,一个HTTP请求这短暂的一生都都经历了什么呢?
HTTP简介
HTTP协议是一种在两点之间的一种超文本(视频、音频、图片文字)传输的约定和规范。HTTP协议是基于TCP/IP协议来传输数据的,IP协议实现寻址和路由,TCP协议实现可靠数据传输,DNS协议实现域名查找,SSL/TLS协议实现安全通信从浏览器请求开始,到服务器响应返回数据。
HTTP遵循请求(Request)/应答(Response)模型,客户端向服务器发送请求,服务器处理请求并返回应答。
HTTP传输流程
一、地址解析
浏览器根据URL中进行解析,解析出协议名、主机名、端口、对象路径。
域名解析:
通过DNS解析域名查询IP地址。DNS协议从操作系统、本地DNS、根DNS、顶级DNS、权威DNS逐步往上解析域名,解析的流程中一般都有缓存,不用每次都从最顶端查找。
二、封装HTTP数据包
客户端将解析协议名、主机名、端口、对象路径并结合本机自身的信息封装成一个HTTP包。
三、封装TCP包
客户端将HTTP请求数据包进一步封装成TCP数据包。
四、浏览器与服务建立连接
TCP/IP的三次握手
整个流程总第概括为:请求->应答->应答之应答
一开始,客户端和服务端都处于CLOSED状态。先是服务端主动监听某个端口,处于LISTEN状态。
第一次握手:客户端主动发起连接SYN,进入SYN_SENT状态。并给服务器发送SYN报文,请求与服务器建立连接。客户端发送网络包,服务端收到了,服务端就知道客户端的发送能力、服务端的接受能力正常。
第二次握手:服务端收到SYN报文后,返回SYN并ACK客户端的SYN,进入SYN_RCVD状态。用来通知客户端服务器已经收到SYN消息并通过确认。服务端发送网络包,客户端收到了,客户端就知道服务端的接受、发送能力,客户端的接收发送能力正常,但是,服务器还不能确认客户端的接受能力是否正常。
第三次握手:客户端给服务端发送的SYN和ACK后,发送ACK的ACK,之后处于ESTABLISHED状态。服务端收到ACK的ACK后,之后也处于ESTABLISHED状态。客户端发送网络包,服务器端到了,服务端得出结论,客户端的接收、发送能力正常,服务端自己的发送、接收能力也正常。
五、发起HTTP请求
客户端向服务器发送报文。
HTTP请求报文结构:
一个请求行(request line)、请求头部(header)、空行、请求数据
六、服务器响应
实际上,在浏览器和处理请求的服务器之间有更多的计算器:路由器、调制解调器等。由于Web的分层设计,这些都隐藏在网络和传输层。HTTP位于应用层之上,底层大多与HTTP描述无关。
服务器反向代理
在实际的应用中,一般都会请求到代理服务器上,再将请求转发给内部服务器,再将从内部服务器得到的结果返回到浏览器。
代理的功能:缓存、过滤、负载均衡、身份验证、日志记录。
内部服务器
服务器上运行着多个进程,请求是如何到达Web服务器的呢?
Web服务器会占用网络端口并监听这些端口,有个进程能监听多个端口,但一个端口不能被多个进程使用。
Web服务器一直监听传入的请求并响应,根据对应的端口找到到正确的进程的。
HTTP默认的端口是80,HTTPS是443。
HTTP响应报文结构:
状态行、响应头部、响应正文
七、服务器关闭TCP连接
TCP四次挥手
TCP断开连接既可以是由客户端发起的,又可以是服务端发起的。
第一次挥手、客户端应用进程调用断开连接的请求,向服务器端发送FIN,进入FIN-WAIT-1的状态。表示在客户端关闭链路前要发送的数据已经发送完毕,可以开始关闭链路操作,并请求服务器端确认关闭客户端到服务器的链路操作。
第二次挥手、服务器收到这个FIN消息后,返回ACK的消息给客户端,表示收到客户端断开链路的请求了。这是,TCP服务端进程通知高层应用进程释放客户端到服务器的链路,服务器处于CLOSED-WAIT状态,即半关闭状态。客户端在收到消息后处于FIN-WAIT-2状态。
第三次挥手、服务器在关闭链路前将需要发送给客户端的消息发送给客户端,等数据发送完后,发送FIN给客户端,表示关闭链路前服务器要发给客户端的消息已经发送完了,请求客户端确认关闭从服务器到客户端的链路操作。此时服务器处于LAST-ACK状态,等待客户端最终断开链路。
第四次挥手、客户端收到服务器发的FIN后,发回ACK确认,表示收到了服务器发送的断开链接请求,并准备断开服务器端到客户端的链接。此时,客户端处于TIM-WAIT状态,TCP连接还没释放,经过等待计时器(2MSL)设置的超时时间后,客户端进入CLOSE。
八、浏览器解析报文,渲染页面
参考文章:
An overview of HTTP - HTTP | MDN
https://betterprogramming.pub/understand-the-flow-of-a-http-request-1a268ec193f0