当你要访问一个网址时,在网络中会经历一系列复杂而有序的过程。这些过程主要涉及DNS解析、TCP连接的建立、HTTP请求的发起与响应、浏览器渲染,以及TCP连接的关闭等。
一 DNS解析
DNS(Domain Name System)解析是访问网址的第一步。当用户在浏览器中输入一个网址(如www.baidu.com)时,计算机需要将这个域名转换为IP地址才能找到目标服务器。这个转换的过程就是DNS解析。
具体过程:
- 浏览器首先会检查本地缓存(如浏览器缓存、系统缓存)中是否有该域名的IP地址记录。
- 如果没有找到,浏览器会向本地DNS服务器发起查询请求。
- 本地DNS服务器会在其缓存中查找,如果仍未找到,则会向根域名服务器发起查询,逐级向下查找,直到找到目标域名对应的IP地址。
- 本地DNS服务器将查询到的IP地址返回给浏览器。
二 建立TCP连接
TCP(Transmission Control Protocol)是一种可靠的传输协议,通过三次握手建立连接,确保数据的可靠传输。
具体过程:
- 第一次握手:客户端(如浏览器)发送一个SYN(同步序列编号)包到服务器,并进入SYN_SENT状态,等待服务器确认。
- 第二次握手:服务器收到SYN包后,会发送一个SYN+ACK(同步序列编号+确认)包给客户端,同时自己也进入SYN_RCVD状态。
- 第三次握手:客户端收到服务器的SYN+ACK包后,会发送一个ACK(确认)包给服务器,此包发送完毕,客户端和服务器均进入ESTABLISHED(连接已建立)状态,完成三次握手。
三 发起HTTP请求
一旦TCP连接建立,浏览器就会通过HTTP(HyperText Transfer Protocol)协议向服务器发送请求。
请求内容:
- 请求行包含了请求方法(如GET、POST)、URL和HTTP协议版本;
- 请求头部由关键字/值对组成,通知服务器有关客户端请求的信息;
- 空行用于分隔请求头部和请求包体;
- 请求包体(对于GET请求通常为空)包含要提交的数据。
四 服务器处理请求
服务器接收到客户端的HTTP请求后,会根据请求的内容进行相应的处理。这可能包括查询数据库、执行服务器端代码、读取文件等。服务器的处理过程取决于请求的性质和服务器端的配置。
五 服务器响应
服务器处理完请求后,会将结果封装在HTTP响应报文中,并发送回浏览器。HTTP响应报文包含状态行、响应头部、空行和响应包体四个部分。状态行由协议版本、状态码及其描述组成;响应头部用于描述服务器的基本信息和数据的描述;响应包体包含实际的数据,如HTML内容、图片数据等。
六 浏览器渲染
浏览器接收到服务器的响应后,会开始解析HTML文档,并应用CSS样式、执行JavaScript代码等,最终将页面渲染出来呈现给用户。
七 关闭TCP连接
在数据传输完毕后,浏览器和服务器会进行TCP连接的关闭。这个过程通常涉及四次挥手,以确保双方都能正确地释放资源。
具体过程:
- 客户端发送一个FIN(结束)包给服务器,并进入FIN_WAIT_1状态。
- 服务器收到FIN包后,发送一个ACK包给客户端,并进入CLOSE_WAIT状态。
- 服务器也发送一个FIN包给客户端,并进入LAST_ACK状态。
- 客户端收到服务器的FIN包后,发送一个ACK包给服务器,并进入TIME_WAIT状态。等待一段时间后(通常是2MSL,即两倍的最大报文段寿命),客户端进入CLOSED状态,TCP连接关闭完成。