当我们在访问 Deepseek 时,网络底层到底发生了什么?
写在前面
最近一段时间各种AI大模型层出不穷,其中以Deepseek 最为引人注目。但作为工程师的我们,当你在各个大模型之间来回测试到手软的同时,有没有想过当我们在浏览器中输入https://chat.deepseek.com/并按下回车之后,网络底层到底发生了什么?数据包到底经历了什么样的旅程?客户端和服务器之间到底做了哪些交互?今天这篇文章我就通过Wireshark进行抓包逐一为你讲解。
TCP/IP 模型
在正式介绍开始介绍之前,我们必须要先了解一下 TCP/IP 协议模型,它是网络通信的核心架构,采用分层设计理念,将复杂的网络通信过程划分为四个逻辑层次,各层协同工作以实现高效的数据传输。

TCP/IP模型的四层结构(图片来自Wikipedia)
1. 链路层(Link Layer)
链路层(有时也称为数据链路层或网络接口层),通常包括操作系统中的设备驱动程序和计算机中相应的网络接口卡,负责物理介质上的数据传输,包括数据帧的封装、错误检测(CRC校验)和硬件寻址;
典型技术:
- 以太网(Ethernet):通过MAC地址标识设备,定义数据帧结构(如IEEE 802.3标准)
- PPP/SLIP:用于串行线路(如拨号上网)的数据封装
2.网络层(Network Layer)
网络层(有时称为互联网层),处理数据包的路由选择和逻辑寻址,实现不同网络间的互联。
核心协议:
- IP:定义IP地址格式(如IPv4的32位地址),负责数据包的分组与转发
- ICMP/IGMP:用于网络状态诊断(如ping命令)和组播管理。
3.传输层(Transport Layer)
传输层提供端到端的数据传输服务,确保数据可靠性和流量控制。在 TCP/IP 协议模型中,有两种截然不同的传输协议:TCP(传输控制协议)和 UDP(用户数据报协议)。
核心协议:
- TCP:面向连接,通过“三次握手”建立可靠通信,支持数据校验、重传和顺序控制,适用于网页访问(HTTP)、文件传输(FTP)等场景
- UDP:无连接,传输效率高但不可靠,常用于实时视频流(如NFS)或DNS查询
4.应用层(Application Layer)
应用层处理特定应用程序的细节,直接面向用户和应用程序,提供多样化的网络服务,如文件传输、邮件通信。
主要协议:
- HTTP:用于网页传输(如浏览器访问网站)
- FTP/SMTP:分别处理文件传输和邮件发送
- DHCP/SNMP:动态分配IP地址和网络设备管理
进入正题
打开浏览器,在地址栏输入:https://chat.deepseek.com/,按下回车后稍等几秒我们就可以看到浏览器显示如下界面,但在这背后的网络底层到底发生了什么呢?接下来就逐步来揭晓。

0、通过ARP查询网关的MAC地址
这一步通常在抓包不会体现,因为客户端在此之前已经有联网行为,所以已经知道了网关的MAC地址。但如果是一台刚配置好IP地址等信息然后接入网络的客户端,它实际上是有这一步的。具体流程是如下:
1)客户端将自己的IP地设置为发送方IP地址,将自己的MAC地址设置为发送方MAC地址;将网关IP地设置为目标IP地址,将目标MAC地址设置为:00:00:00:00:00:00(注意:这里不是设置为路由器的MAC地址);
2)客户端将这个ARP数据包封装进链路层,加上以太网的头部信息。这里的源地址是客户自己的MAC地址,目标地址是二层的广播地址(FF:FF:FF:FF:FF:FF),因此此时它还不知道网关的MAC地址,所以就相当于它向整个网络里大喊:“谁有网关的MAC地址,快告诉我”;——见数据包No.6
3)这时在同一网络中的网关(在家庭网络中通常是路由器,在企业网络中通常是核心交换机)就会收到这个广播包,然后回复自己的MAC地址给客户端,这里与客户端的操作方式差不多,只是源地址和目的地址会不同。——见数据包No.7
4)至此,客户也就知道了网关地址,后面的通信过程中它有不知道的事都会向网关请教。

Tips:如果是一台通过DHCP自动获取IP地址的客户端,在此之前还会先发送DHCP请求以获取自身的IP地址、网关等信息,但在这里就不赘述了,有兴趣的朋友可以自行模拟环境抓包测试一下。看看在自身没有IP地址、更没有网关的IP和MAC地址的情况下,封装数据包的时候源和目的地址又是怎么设置的?
1、通过DNS查询网址的IP地址
1)在上一步客户端已经通过DHCP获取到了DNS服务器地址(也有可能是通过手动配置的方式),所以当我们输入https://chat.deepseek.com/这个网址并确认之后,它首先要向DNS查询这个网址对应的IP地址。在我的电脑中获取的DNS服务器地址也是网关地址(即 192.168.31.1), 所以客户端就向这个地址发送了DNS查询数据包。——见数据包No.13

2)DNS服务器在收到请求后,通过递归查询知道了chat.deepseek.com对应的IP地址,于是向客户端进行了回复。(在这里有两条请求和两条回复,是因为 Deepseek 采用了 cdn 技术)——见数据包No.15

2、通过TCP 三次握手与网站建立数据传输连接
我们知道TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,那它怎样确保自己与对方的发送与接收是正常的呢?首先就是通过三次握手这个机制建立可靠连接。在客户端知道了网站服务器的地址之后,接下来客户端就会通过TCP三次握手与服务器建立正式连接。建立一个 TCP 连接需要“三次握手”,这个过程缺一不可,具体流程如下:

TCP三次握手图解(图片来源Medium)
第一次握手:[SYN] Seq=0 ,客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认;——见数据包 17
第二次握手:[SYN,ACK] Seq=0 Ack=1,服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态;——见数据包 24
第三次握手:[ACK] Seq=1 Ack=1 ,客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务端都进入ESTABLISHED 状态,完成 TCP 三次握手。——见数据包 29

当建立了 3 次握手之后,客户端和服务端就可以传输数据。这就和我们我们平时和别人打电话一样:
张三:喂,你好。你是李四吗?
李四:你好,我是李四。
张三:好的。我有件事要需要麻烦你。
你知道在 TCP 三次握手这个过程中可以携带数据吗?根据RFC793 文档中的描述(“Data or controls which were queued for transmission may be included”),答案是肯定的。因为在第三次握手时,客户端已进入ESTABLISHED 状态,所以可以将应用层数据附加到 ACK 报文中一并发送,但大多数 TCP 实现(如 Linux 内核)默认在三次握手完成后再立即发送数据。
3、通过TLS/SSL握手建立HTTPS安全通道
因为我们访问的是https类型的网站,所以在完成了TCP三次握手之后还需要通过TLS/SSL握手建立客户端与服务端的加密通信。具体流程如下:
1)Client Hello: 客户端向服务器发送一个 "Client Hello" 消息(见数据包 32)。该消息包含:
- 客户端支持的 TLS 协议版本。
- 客户端支持的密码套件列表,按偏好顺序排列。密码套件定义了会话中将使用的加密算法(例如,加密、密钥交换、身份验证)。
- 客户端的随机字节串(client random)。
2)Server Hello: 服务器回复一个 "Server Hello" 消息(见数据包 42)。该消息包含:
- 服务器选择的 TLS 协议版本。
- 服务器从客户端提供的列表中选择的密码套件。
- 服务端的随机字节串(server random)。
3)Server Certificate: 服务器将自己的数字证书发送给客户端。该证书包含服务器的公钥,并由证书颁发机构(CA)签名,用于验证服务器的身份。
4)Server Key Exchange(如果需要): 根据所选的密码套件,服务器可能会向客户端发送额外的密钥交换参数。
5)Server Hello Done: 服务器发送一个 "Server Hello Done" 消息,表明其初始消息发送完毕。
6)Client Key Exchange: 客户端生成一个 "pre-master secret"(一个随机字节串),并使用从服务器证书中获取的服务器公钥对其进行加密。然后,客户端将这个加密后的 pre-master secret 发送给服务器。
7)Session Key Generation: 客户端和服务器都使用 client random、server random 和 pre-master secret 独立地生成 "会话密钥"。这些是对称密钥,将用于加密 HTTPS 会话期间实际交换的数据。
8)Change Cipher Spec: 客户端向服务器发送一个 "Change Cipher Spec" 消息,表明客户端后续发送的所有消息都将使用新生成的会话密钥进行加密。
9)Finished (Client): 客户端向服务器发送一个加密的 "Finished" 消息。该消息包含到目前为止所有握手消息的哈希值,允许服务器验证握手的完整性以及客户端是否已成功生成会话密钥。
10)Change Cipher Spec: 服务器向客户端发送一个 "Change Cipher Spec" 消息,表明服务器后续发送的所有消息也将使用会话密钥进行加密。
11)Finished (Server): 服务器向客户端发送一个加密的 "Finished" 消息,与客户端的 "Finished" 消息类似,允许客户端验证握手的完整性以及服务器是否已成功生成会话密钥。

备注:上面很多步骤在抓包中并未体现是因为这些数据包是加密连接中传输,无法看到具体内容。
4、加密数据传输
一旦 HTTPS 握手完成,就会建立一个安全且加密的连接。客户端可以向服务器发送其 HTTP 请求(例如获取网页的 GET 请求),然后就会看到本文第一图所显示的界面。从此刻开始客户端和服务器之间交换的所有数据都将使用在 TLS/SSL 握手期间协商的对称会话密钥进行加密,从而确保数据的机密性和完整性。
总结
综上所述,通过Wireshark我们得以窥探当我们访问https://chat.deepseek.com/这个网站(当然也可以延伸到其它类似的所有网站)时,网络底层经历流程是:ARP 查询 → DNS 解析 → TCP 三次握手 → TLS 握手 → 加密数据传输,这个过程中每个协议都扮演着至关重要的角色,共同确保了我们能够顺利并安全地访问互联网上的资源,而理解这些底层机制对于我们深入学习网络技术和网络安全至关重要。
搜索“wired_shark”
关注WX,不仅可以第一时间收到更新,还可以提供免费疑问解答!
更多推荐

所有评论(0)