当你在浏览器中输入 google.com 并按下回车键后发生了什么?
URL解析:
- 浏览器首先解析URL,确定协议(如HTTP或HTTPS)和主机名(即
google.com)。 - 如果URL中没有明确的协议,浏览器通常会默认使用
http://。 - 如果URL中包含了路径、查询字符串或片段标识符,它们也会被解析出来。
域名解析:
- 浏览器查找
google.com对应的IP地址。这通常通过DNS(域名系统)查询完成。 - DNS查询可能涉及递归或迭代查询,直到找到权威的DNS服务器来返回IP地址。
- 浏览器可能会缓存最近的DNS记录以加快未来请求的速度。
TLS/SSL握手(如果使用HTTPS):
-
如果协议是HTTPS,浏览器与服务器之间会进行TLS/SSL握手以建立安全连接。
-
这个过程包括验证服务器证书,选择加密算法,并交换密钥。
TLS(Transport Layer Security)是用于加密互联网通信的标准协议,它是在HTTP之上提供安全层的HTTPS的基础。TLS握手的主要目标是建立一个安全的、加密的连接。以下是TLS握手的大致流程:
- Client Hello:
- 客户端(通常是浏览器)向服务器发送一个
ClientHello消息,其中包含了客户端支持的TLS版本、加密套件列表、压缩方法、随机数(用于生成密钥)以及扩展选项(如Session ID复用、Server Name Indication等)。
- 客户端(通常是浏览器)向服务器发送一个
- Server Hello:
- 服务器回应一个
ServerHello消息,确认使用的TLS版本、加密套件、压缩方法,并发送自己的随机数。
- 服务器回应一个
- 证书交换:
- 服务器发送其数字证书,证书中包含了公钥,用于后续的密钥交换。
- 客户端验证证书的有效性,检查是否由信任的证书颁发机构(CA)签名,以及证书是否过期或被撤销。
- 密钥交换:
- 客户端生成一个随机的“pre-master secret”,并使用服务器证书中的公钥加密此秘密,然后发送给服务器。
- 服务器使用其私钥解密“pre-master secret”。
- 密钥生成和确认:
- 双方使用“pre-master secret”和之前交换的随机数,通过相同的算法独立计算出会话密钥。
- 客户端和服务器各自发送一个
ChangeCipherSpec消息,表示此后所有通信都将使用新协商的加密算法和密钥。 - 双方再发送
Finished消息,确认握手成功,其中包含了一个散列值,以验证双方都使用了相同的密钥。
- Client Hello:
建立TCP连接:
-
使用三次握手建立TCP连接,确保数据包可以可靠地发送和接收。
三次握手(Three-Way Handshake)是TCP/IP协议中用于建立连接的一种机制。TCP是一种面向连接的、可靠的、基于字节流的传输层协议。在TCP中,三次握手的目的是为了确保连接的双方都能正确地接收对方的发送能力,同时避免已过期的连接请求报文突然到达,造成错误的连接。
下面是三次握手的具体步骤:
- 第一次握手:发送连接请求
- 客户端(例如,一个Web浏览器)想要与服务器建立连接,它会发送一个SYN(Synchronize)数据包到服务器。这个数据包包含了客户端初始化序列号(ISN)。序列号用于确保数据包的顺序,防止乱序或重复的数据包。
- 第二次握手:应答并确认连接请求
- 服务器接收到客户端的SYN数据包后,会发送一个SYN-ACK(Synchronize-Acknowledge)数据包作为应答。这个数据包包含了服务器的初始化序列号(ISN)和对客户端序列号的确认(ACK)。确认号是客户端序列号+1,表明服务器收到了客户端的SYN数据包。
- 第三次握手:确认连接建立
- 客户端接收到服务器的SYN-ACK数据包后,会发送一个ACK数据包作为确认。这个数据包包含了对服务器序列号的确认,确认号是服务器序列号+1。这表明客户端收到了服务器的SYN-ACK数据包,连接现在可以认为是双向建立了。
一旦三次握手完成,客户端和服务器之间的TCP连接就被认为是建立好了,可以开始进行数据传输。三次握手确保了以下几点:
- 客户端能够发送数据给服务器。
- 服务器能够发送数据给客户端。
- 客户端和服务器都能够接收对方的数据。
三次握手的一个重要原因是防止过时的连接请求报文突然到达服务器,造成不必要的连接。如果没有第三次握手,服务器在收到一个过时的连接请求后会分配资源,等待客户端的后续数据,这将浪费资源。通过三次握手,只有当客户端真正准备好并且能够响应服务器的应答时,连接才会建立,从而避免了这种问题。
在三次握手之后,连接可以用于数据传输,直到任何一方决定关闭连接,这时就会发生四次挥手的过程来释放连接。
- 第一次握手:发送连接请求
发送HTTP请求:
- 浏览器向服务器发送HTTP请求,包括请求方法(通常是GET)、请求的资源路径、HTTP版本以及可能的头部信息(如User-Agent、Accept-Language等)。
服务器处理请求:
- 服务器接收到请求后,根据请求的资源路径和方法执行相应的操作,可能是从文件系统读取静态HTML文件,或是运行动态脚本生成响应。
服务器响应:
- 服务器生成响应,包括状态码、响应头部和响应体,然后将其发送回浏览器。
接收和解析响应:
- 浏览器接收服务器的响应,解析HTTP响应头部和状态码。
- 如果响应包含HTML,浏览器开始解析HTML文档,构建DOM树。
渲染页面:
- 浏览器根据DOM树和CSS样式表创建渲染树。
- 渲染引擎布局页面元素,并将其绘制到屏幕上。
加载额外资源:
- 如果HTML文档引用了其他资源(如CSS、JavaScript、图片等),浏览器会发起额外的请求来下载这些资源。
- 这些资源的加载和执行可能会触发DOM的更新,从而影响页面的渲染。
交互和事件处理:
- 页面完全加载后,用户可以与页面上的元素进行交互,触发JavaScript事件处理程序,导致页面动态更新。