输入 URL 到页面渲染
当你在浏览器地址栏输入一个网址并按下回车键时,你可能并没有意识到这背后发生了多么复杂的一系列操作。从输入 URL 到最终呈现页面,涉及到网络层、传输层、应用层等多个层面的技术细节。本文将带你一步步了解这个过程。
一、输入 URL
一切从输入 URL 开始。URL 是用于标识互联网上的资源位置的。例如,https://www.baidu.com 是百度网站的 URL。
二、DNS 解析
1. DNS 解析
当浏览器获取到 URL 后,首先需要解析 URL 中的域名,以找到对应的 IP 地址。这是因为互联网通信的基础是 IP 地址,而不是我们习惯使用的域名。
DNS 解析流程
- 本地缓存查找:浏览器首先会在本地缓存中查找该域名对应的 IP 地址。
- 操作系统缓存查找:如果没有找到,浏览器会向操作系统请求查找系统缓存。
- ISP 缓存查找:如果前两步没有找到,浏览器会询问 Internet 服务提供商(ISP)的缓存服务器。
- 根域名服务器查找:如果仍未找到,查询将被转发给根域名服务器。
- 顶级域名服务器查找:根域名服务器会将请求转发给对应的顶级域名服务器(如
.com服务器)。 - 权威域名服务器查找:顶级域名服务器再将请求转发给具体的权威域名服务器(如
baidu.com的服务器)。 - 返回 IP 地址:最后,权威域名服务器将域名解析成 IP 地址,并将其返回给浏览器。
当然可以!为了展示 DNS 解析和 TCP 连接的过程,我们可以使用 Python 编写一些简单的代码。Python 提供了 socket 模块,可以方便地进行网络编程。
1. DNS 解析
我们可以使用 socket 模块中的 gethostbyname 方法来实现 DNS 解析。
import socket
def dns_resolution(domain):
try:
ip_address = socket.gethostbyname(domain)
print(f"Domain: {domain} -> IP Address: {ip_address}")
except socket.gaierror as e:
print(f"DNS resolution failed: {e}")
# 示例:解析 www.example.com 的 IP 地址
dns_resolution("www.example.com")
这段代码不用过于理解,只是举个例子展示一下(我也是找来的例子)
2. DNS 缓存
为了提高效率,DNS 解析的结果会被缓存在多个级别上,这样对于后续的请求,就可以直接使用缓存的结果而无需重复解析。
三、TCP 连接
1. TCP 连接
一旦获得了目标服务器的 IP 地址,浏览器就需要与服务器建立 TCP 连接。TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP 连接建立
TCP 使用三次握手来建立连接:
- 客户端发送 SYN 包:客户端发送一个 SYN 包(同步包)到服务器,客户端进入
SYN_SENT状态。 - 服务器应答 SYN 包:服务器收到 SYN 包后发送一个 ACK/SYN 包(确认包+同步包)作为应答,服务器进入
SYN_RCVD状态。 - 客户端发送 ACK 包:客户端收到 ACK/SYN 包后向服务端发送一个 ACK 包作为确认,客户端和服务器都进入
ESTABLISHED状态,连接建立完成。
为何需要三次握手?两次不行吗?
如果是两次握手就可能会导致服务器资源浪费,当客户端向服务端发送建立连接 -- 请求A时,但如果因为 网络问题导致请求A超时,TCP 的超时重传机制会重新发送一个新的连接 -- 请求B,当请求B被应答后, 数据通讯也完成了,就会释放连接,双方会进入 close 状态。此时,一旦请求A又再次出现, 那么服务端会认为又有客户端要和它建立连接,从而应答并进入 SYN_RECEIVED 状态,等待 客户端的数据传输,从而造成服务端资源浪费。
2. TCP 断开连接
当数据传输完成后,客户端和服务端需要断开 TCP 连接。
TCP 断开连接通常使用四次挥手来实现:
- 客户端发送 FIN 包:客户端发送一个 FIN 包(终止包)到服务器,请求释放连接,客户端进入
FIN_WAIT_1状态。 - 服务器应答 FIN 包:服务器收到 FIN 包(释放连接请求)后发送一个 ACK 包(同意释放连接的应答)作为应答,服务器进入
CLOSE_WAIT状态。 - 服务器发送 FIN 包:服务器发送一个 FIN 包(未发送完的数据)到客户端,服务器进入
LAST_ACK状态。 - 客户端应答 FIN 包:客户端收到 FIN 包(接收到同意的应答)后发送一个 ACK 包(确认接受应答)作为应答,客户端和服务器都进入
CLOSED状态。
TCP 和 UDP 的区别
TCP (传输控制协议)
- 面向连接:在数据传输前需建立连接。
- 可靠性:通过流量控制和拥塞控制机制保证数据的可靠传输。
- 有序性:保证数据按发送顺序到达。
UDP (用户数据报协议)
- 无连接:发送数据前无需建立连接。
- 不可靠:不提供流量控制和拥塞控制机制。
- 高效性:适用于实时性要求高的场景,如直播和视频通话。
上篇文章补充内容
HTTPS
HTTPS 是 HTTP 协议的安全版本,它通过使用 SSL/TLS 协议来加密 HTTP 通信内容,以保护数据的安全性和完整性。HTTPS 的主要目的是确保客户端与服务器之间的数据传输安全,防止数据被窃听、篡改或伪造。
HTTPS 工作原理
HTTPS 的工作原理主要包括以下几个步骤:
-
握手阶段:
- 客户端发起 HTTPS 请求到服务器。
- 服务器将公钥发送给客户端。
- 客户端验证公钥的真实性。
- 客户端生成一个随机的会话密钥,并使用服务器的公钥对其进行加密后发送给服务器。
-
加密通信:
- 服务器解密并得到会话密钥。
- 所有的后续通信都使用这个会话密钥进行加密和解密。
-
数据交换:
- 加密后的数据通过网络传输。
- 接收方使用相同的会话密钥解密数据。
HTTPS 组成部分
HTTPS 包括以下几个关键组件:
- SSL/TLS:SSL 是早期的加密协议,现在已经被 TLS 所取代。TLS 是一种更安全、更现代的协议。
- 证书:用于验证服务器的身份,通常由可信的第三方证书颁发机构(CA)签发。
- 公钥/私钥对:服务器有一对公钥和私钥。公钥用于加密数据,私钥用于解密数据。
HTTPS 的优点
- 安全性:数据传输过程中会被加密,防止被窃听。
- 认证:确保客户端连接的是正确的服务器,防止中间人攻击。
- 完整性:确保数据在传输过程中没有被篡改。
HTTPS 的发展趋势
随着互联网安全意识的增强,越来越多的网站转向 HTTPS。许多浏览器和服务提供商也鼓励或强制要求使用 HTTPS,比如 Google 在其搜索引擎排名算法中给予 HTTPS 网站更高的优先级。