步骤(总体来看)
- 浏览器根据输入网页的URL进行解析,解析出对应的请求方式、URL、端口等,生成HTTP请求报文。
- 浏览器查询缓存,检查缓存是否已经存在该URL的资源,如果缓存命中中直接读取并显示,比如相同的GET请求就会进行缓存。
- 缓存未命中,浏览器通过DNS协议获取域名对应的IP地址。
- 浏览器根据IP地址和端口号,向目标服务器发起一个TCP连接请求(TCP三次握手)。如果是HTTPS请求,则会在TCP三次握手后加一个SSL四次握手,发布SSL证书,确保连接的安全性。
- 若连接成功,则浏览器向服务器发送一个HTTP请求报文,请求获取网页的内容。
- 浏览器发送的HTTP请求报文经传输层被封装进TCP数据包,添加TCP头部信息,包括源端口、目标端口、序号等信息。
- 每个TCP数据包会经过网络层被封装成IP数据包,添加IP头部,包括源IP地址和目标IP地址,再进行路由的分组和转发。
- 网络接口层将IP数据包封装成数据帧,在数据链路层添加头部和尾部,包括源MAC地址和目标MAC地址(MAC地址是网络层的ARP协议根据IP地址查询出来的),数据帧在物理层通过物理介质(光纤、网线等)以比特流的形式进行传输。
- 服务器接收到比特流后,根据物理层、数据链路层、网络层、传输层和应用层的顺序将数据进行反向解析,得到最终只含有应用数据的信息,根据端口信息交由具体的程序进行处理。
- 服务器将请求处理结果,构建成一个HTTP响应报文,包含状态码(例如200,OK)、响应头和响应体(网页的HTML内容等),返回给浏览器。
- 浏览器接收服务器返回结果的流程同服务器接收结果的流程。
- 浏览器解析HTTP响应报文并进行渲染和解析,得到用户可以看到的页面。
步骤(从涉及到的协议来看)
HTTP(或HTTPS)-> DNS -> TCP -> IP -> ARP
HTTP用于发送含有请求内容和服务器信息的请求报文,DNS用于将域名解析成IP地址,TCP用于建立连接,IP用于路由的分组和转发,ARP用于查询MAC地址,为物理层的比特流的传输找到物理地址。
每一层的封装格式:
细节部分
1. 浏览器根据输入的网址解析请求
- 用户在浏览器中输入一个网址(例如:
https://www.example.com/index.html
)。 - 浏览器将 URL 分解为几个部分:协议(
https
)、域名(www.example.com
)、路径(/index.html
)、端口(默认HTTP为80,HTTPS为443)等。 - 生成对应的 HTTP 请求报文,准备向目标服务器发起请求。
2. 浏览器查询缓存
- 浏览器首先会检查本地缓存(如浏览器缓存、CDN缓存等)是否已存有该资源。
- 如果缓存命中,浏览器直接使用缓存的数据,避免重复请求,提高页面加载速度。缓存的条件通常基于 HTTP 头部中的 Cache-Control 或 ETag 等字段。
3. 缓存未命中,DNS 查询域名
- 如果缓存中没有需要的资源,浏览器会进行 DNS 查询。
- 浏览器使用 DNS 协议 查询
www.example.com
域名对应的 IP 地址。 - DNS 查询可以是本地缓存查询、操作系统缓存查询,若本地没有结果,则会通过配置的 DNS 服务器发送查询请求。
4. 浏览器与服务器建立 TCP 连接
- 获取到 IP 地址后,浏览器通过该地址和目标服务器建立 TCP 连接。
- TCP三次握手:浏览器和服务器之间通过 三次握手 过程建立连接:
-
- 客户端 发送 SYN(同步)报文。
- 服务器 收到 SYN 报文后,返回 SYN-ACK(同步-确认)报文。
- 客户端 再次发送 ACK(确认)报文,连接建立成功。
- 如果是 HTTPS 请求,在TCP连接建立之后,浏览器会通过 SSL/TLS 握手 来确保数据传输的安全性。这个过程涉及证书交换、加密算法协商和生成共享密钥等步骤。
5. 浏览器发送 HTTP 请求报文
- TCP连接建立成功后,浏览器发送 HTTP 请求报文,请求目标网页的内容。
- 这个报文通常包含请求方法(GET、POST等)、请求头(如 User-Agent、Accept、Host 等)和请求体(如果是POST请求的话)等。
6. HTTP 请求通过传输层封装为 TCP 数据包
- HTTP请求会被传输层(TCP协议)封装成一个 TCP 数据包。
- 传输层会添加头部信息,包括源端口、目标端口、序列号、确认号等,用于保证数据的可靠传输。
7. TCP 数据包通过网络层封装为 IP 数据包
- 接下来,TCP 数据包会被 网络层 封装成 IP 数据包。
- 网络层会在数据包中添加 IP 头部,其中包含源 IP 地址和目标 IP 地址。IP 数据包将根据目标 IP 地址进行 路由,通过多个路由器转发,直到到达目标服务器。
8. 数据包通过数据链路层发送到物理层
- 在网络接口层(数据链路层),IP 数据包被进一步封装为 数据帧,添加源和目标 MAC 地址(通过 ARP 协议 获取)。
- 数据帧最终在物理层通过
物理介质
(例如光纤、网线等)以比特流
形式进行传输。
9. 服务器接收到数据后进行反向解析
- 目标服务器接收到来自客户端的比特流后,从物理层、数据链路层、网络层、传输层、应用层逐层解析。
- 最终,服务器提取出 HTTP 请求报文,并将请求中的 目标端口 信息交给对应的 Web 服务程序(如 Apache、Nginx、Tomcat 等)进行处理。
10. 服务器构建 HTTP 响应报文
- 服务器根据请求处理结果(如读取网页内容、执行数据库查询等),构建一个 HTTP 响应报文。
- 响应报文通常包含 响应状态码(如 200 OK、404 Not Found 等)、响应头(如 Content-Type、Content-Length 等)以及响应体(网页内容、图片等)。
11. 服务器将 HTTP 响应发送回客户端
- 构建好的 HTTP 响应报文 被服务器通过传输层封装为 TCP 数据包,并通过网络层、数据链路层、物理层逐步传输回客户端。
12. 浏览器接收响应并显示页面
- 客户端浏览器接收到 HTTP 响应报文后,开始解析并呈现网页内容。
- 如果响应中包含 HTML、CSS、JavaScript 文件,浏览器会继续发送请求来获取这些资源。
- 最终,浏览器会将所有资源渲染为用户可以看到的。