假设最简单的可能HTTP请求,没有代理,IPv4和任何步骤中没有问题:
过程概述 1. 浏览器检查缓存;如果请求的对象在缓存中并且是新的,请跳到#9 2. 浏览器询问操作系统的服务器IP地址 3. 操作系统进行DNS查找并将IP地址回复到浏览器 4. 浏览器打开到服务器的TCP连接(此步骤比使用HTTPS要复杂得多) 5. 浏览器通过TCP连接发送HTTP请求 6. 浏览器接收HTTP响应并且可以关闭TCP连接,或者将其重用于另一个请求 7. 浏览器检查响应是重定向还是条件响应(3xx结果状态代码),授权请求(401),错误(4xx和5xx)等;这些处理与正常响应(2xx) 8. 如果可高速缓存,则将响应存储在高速缓存中 9. 浏览器解码响应(例如,如果是gzip压缩) 10. 浏览器确定如何处理响应(例如,它是一个HTML页面,它是一个图像,它是一个声音片段?) 11. 浏览器呈现响应,或为无法识别的类型提供下载对话框
建立连接–三次握手
知道了服务器的 IP 地址,下面便开始与服务器建立连接了。
通俗地讲,通信连接的建立需要经历以下三个过程:
主机向服务器发送一个建立连接的请求(您好,我想认识您);
服务器接到请求后发送同意连接的信号(好的,很高兴认识您);
主机接到同意连接的信号后,再次向服务器发送了确认信号(我也很高兴认识您),自此,主机与服务器两者建立了连接。
补充说明
TCP 协议:三次握手的过程采用 TCP 协议,其可以保证信息传输的可靠性,三次握手过程中,若一方收不到确认信号,协议会要求重新发送信号。
Heading断开连接–四次挥手
主机向服务器发送一个断开连接的请求(不早了,我该走了);
服务器接到请求后发送确认收到请求的信号(知道了);
服务器向主机发送断开通知(我也该走了);
主机接到断开通知后断开连接并反馈一个确认信号(嗯,好的),服务器收到确认信号后断开连接;
补充说明
为什么服务器在接到断开请求时不立即同意断开:当服务器收到断开连接的请求时,可能仍然有数据未发送完毕,所有服务器先发送确认信号,等所有数据发送完毕后再同意断开。
第四次握手后,主机发送确认信号后并没有立即断开连接,而是等待了 2 个报文传送周期,原因是:如果第四次握手的确认信息丢失,服务器将会重新发送第三次握手的断开连接的信号,而服务器发觉丢包与重新发送的断开连接到达主机的时间正好为 2 个报文传输周期。