客户端与服务器:你点下发送,数据到底经历了什么
从客户端-服务器模型讲起,把 IP、端口、协议分层、一次 HTTPS 请求的完整旅程一次打通,并用朋友好学的真实架构做样本,建立后面所有部署操作的地基
- 理解客户端-服务器模型,分清客户端、前端、后端、Web 服务器各自的角色
- 搞懂 IP 地址(公网/内网/回环)与端口(定位进程)到底是什么
- 理解协议为什么要分层、OSI 七层与 TCP/IP 四层如何对应、数据如何被逐层封装
- 能完整复述一次 HTTPS 请求从手机到服务器再返回的每一跳,并据此定位部署问题
部署的本质,是让两台机器隔着网络可靠对话
很多人能写出一个能跑的接口,却讲不清这个接口是怎么被用户手机访问到的。一旦进入部署阶段,你每天面对的都是:域名解析对了吗、端口通不通、证书有没有生效、请求到底卡在客户端、Nginx 还是后端。要解决这些问题,必须先在脑子里建立一张清晰的网络地图——这正是本模块要做的事,它是后面 DNS、Nginx、HTTPS、CI/CD 全部内容的地基。
客户端与服务器:所有互联网应用的基本关系
互联网应用几乎都是「客户端-服务器」模型(Client-Server,简称 C/S):客户端主动发起请求(Request),服务器被动监听、处理并返回响应(Response)。浏览器、手机 App、小程序、桌面软件都是客户端;服务器则是一台 7×24 小时开机、运行着服务程序、持续等待别人来连的电脑。浏览器访问网站的 B/S(Browser-Server)模式,本质上只是 C/S 的一种特例。
以朋友好学为例:装在用户手机上的 App(Capacitor 打包,界面是本地的网页)是客户端;腾讯云那台 Ubuntu 服务器上跑着的 Nginx 和 Node 程序是服务器。用户点「提问」,App 组装一个 HTTP 请求发往服务器,服务器的 Node 程序再去调用火山方舟大模型,拿到答案后原路返回,App 把文字渲染到屏幕上。理解这条链路,就理解了部署在部署什么。
「前端」指跑在用户设备上、负责界面与交互的那部分代码(朋友好学里是 Next.js 页面);「后端」指跑在服务器上、负责业务逻辑、密钥、数据库的那部分(朋友好学里是 Node 的 server.js);「Web 服务器」是专门负责接收网络连接、分发请求的软件(Nginx),它通常挡在后端前面,负责 HTTPS、静态文件和反向代理。一个请求往往是:客户端 → Web 服务器(Nginx)→ 后端程序(Node)→(可能再调第三方),响应再反方向回来。
IP 地址:互联网上的门牌号
要在亿万台设备中找到对方,每台联网设备都需要地址,这就是 IP。IPv4 是 32 位、写成四段 0~255 的数字(如 134.175.44.210),因为总量只有约 43 亿个、早已不够用,又有了 128 位、近乎无限的 IPv6(写成八组十六进制、冒号分隔)。你需要分清三类特殊地址:
三类必须分清的 IP公网 IP :全球唯一、可被互联网直接访问,如云服务器的 134.175.44.210内网 IP :只在局域网内有效,如 192.168.x.x / 10.x.x.x / 172.16~31.x.x回环地址:127.0.0.1(localhost),永远指「这台机器自己」
家里的手机、电脑只有内网 IP,它们通过路由器的 NAT(网络地址转换)共用一个公网 IP 上网,所以外网无法主动连进你的手机。而云服务器有独立公网 IP,才能被全世界访问。一个关键部署细节:朋友好学的 Node 后端监听的是 127.0.0.1:5180,意思是「只接受本机发起的连接」——外网无法直接打到 Node,必须先经过本机的 Nginx,再由 Nginx 转发。这样即使后端有漏洞,也少了一个直接暴露面,是很常见的安全做法。与之相对,监听 0.0.0.0 表示「在本机所有网卡上接受连接」,才允许外部直连。
把 Node 绑在 127.0.0.1、让 Nginx 独占对外的 80/443,等于让 Nginx 当唯一门卫:TLS 解密、限流、日志、分流都在门卫这一层统一做,后端躲在内网只管业务。朋友好学正是用这套方式,让同一台服务器上的两个产品(朋友好学走 5180、另一个产品走 8799)共用 80/443 而互不干扰。
端口:一台服务器为什么能同时跑很多服务
IP 解决了「找到哪台主机」,但一台主机上同时跑着 Nginx、Node、数据库、SSH,数据包该交给谁?这靠端口(Port)区分。端口是一个 0~65535 的数字,和 IP 合起来叫「套接字(Socket)」,精确定位到某台主机上的某个进程。0~1023 是知名端口,需要管理员权限才能占用,常见约定:HTTP 是 80、HTTPS 是 443、SSH 远程登录是 22、DNS 是 53、MySQL 是 3306。
# 一台云服务器内部,可以有多个服务各占一个端口,井水不犯河水
:443 -> Nginx(对外,HTTPS) 所有人都能访问
:80 -> Nginx(对外,HTTP 跳 HTTPS)
:5180 -> 朋友好学 Node 后端(绑 127.0.0.1,仅本机)
:5002 -> TTS 语音服务(绑 127.0.0.1,仅本机)
:8799 -> 另一个并行产品(绑 127.0.0.1,仅本机)
:22 -> SSH 远程登录(对外,靠密钥保护)同一台主机上,同一个端口同一时刻只能被一个进程监听,第二个程序再绑会报 EADDRINUSE(地址已被占用),部署时「服务起不来」先查端口是否被占;云服务器除了系统防火墙,还有一层「安全组」在云控制台里,端口即使在机器内部放开了,安全组没放行,外网照样连不上——这是新手最容易漏掉的一层。
协议分层:复杂网络是怎么被拆简单的
网络要做的事极多:怎么找到对方、怎么保证不丢、怎么加密、怎么区分是网页还是视频。工程师用「分层」把它拆开,每层只干一件事、只和相邻层打交道,下层为上层提供服务。最经典的两种分层模型是教学用的 OSI 七层模型,和互联网实际使用的 TCP/IP 四层模型,它们的对应关系如下:
TCP/IP 应用层 ← OSI 应用层 + 表示层 / 会话层· 典型协议:HTTP、HTTPS、DNS、SSH(你的代码在这层) TCP/IP 传输层 ← OSI 传输层· 典型协议:TCP、UDP(端口、可靠传输在这层) TCP/IP 网际层 ← OSI 网络层· 典型协议:IP(选址与路由,决定往哪跳) TCP/IP 网络接口层 ← OSI 数据链路层 / 物理层· 典型载体:网卡、Wi-Fi、光纤、以太网(把比特发出去)
数据从上往下发送时,每经过一层就被加上一个该层的「首部」,像套娃一样,这叫封装(Encapsulation);接收方再从下往上逐层拆掉首部。你不必背出七层,但要建立「问题属于哪一层」的直觉:域名打不开多半是应用层的 DNS,连不上主机是网络层/传输层(IP、端口、安全组),页面乱码是表示层(编码),接口 500 是应用层(你的后端代码)。分层能让你不被表象带偏。
一次完整请求的旅程:以朋友好学 App 提问为例
把上面的概念串起来,跟踪用户在 App 里点「发送」后,一个请求经历的完整旅程:
① App 把问题组装成 HTTP 请求,目标是 https://pygood.com/...
② 若用域名:先向 DNS 查到 pygood.com 对应的公网 IP(下一个模块细讲)
③ 与服务器 443 端口进行 TCP 三次握手,建立连接(本模块第 2 课细讲)
④ 进行 TLS 握手,协商出一把只有双方知道的会话密钥(Stage15-m6 细讲)
⑤ 用这把密钥加密 HTTP 请求并发出,沿途经多个路由器一跳跳到腾讯云
⑥ 服务器 Nginx 在 443 接收、解密,按 URL 路径反向代理到 127.0.0.1:5180
⑦ Node 后端处理:校验、读写数据,必要时再向火山方舟发起一次「服务器到服务器」请求
⑧ 大模型结果逐层原路返回:Node -> Nginx 加密 -> 互联网 -> App 解密 -> 渲染上屏老手和新手排障最大的区别,是新手从「是不是代码写错了」开始瞎猜,老手沿链路自底向上逐段排除:先 ping 确认主机在不在(网络层)→ 再确认端口通不通(telnet/nc 试 443,传输层)→ 再看证书和 HTTPS 是否正常(TLS)→ 再看 Nginx 访问日志/错误日志(Web 服务器层)→ 最后才看 Node 应用日志(应用层)。每一层都能独立验证,问题在哪一段会非常清楚。记住:不要在没定位到层之前就改代码,那通常是南辕北辙。
朋友好学把 Node 后端绑定在 127.0.0.1:5180、只让 Nginx 对外暴露 443,这样做的主要好处是?
本节小结
互联网应用是客户端发请求、服务器回响应的 C/S 模型;IP 定位主机(公网全球唯一、内网靠 NAT、127.0.0.1 指本机、0.0.0.0 是所有网卡),端口定位进程(0~65535,80/443/22/53 是知名端口,同端口同时只能一个进程占用,云主机还要过安全组)。网络靠分层降低复杂度,OSI 七层对应 TCP/IP 四层,数据发送时逐层封装。一次 HTTPS 请求要经过 DNS、TCP 握手、TLS 握手、加密传输、Nginx 反代、后端处理、原路返回;排障要沿这条链路分层定位,而不是上来就猜代码。
资深工程师加餐
底层原理 · 大厂视角 · 工程经验,点卡片展开
从浏览器到你的应用,一次请求依次经过 DNS 解析、TCP 三次握手、TLS 握手、反向代理、上游应用,再到数据库或缓存,沿原路返回。每一跳都可能是延迟或故障点,所以排错要分层推进:先确认域名解析和端口连通,再看证书是否有效,最后看应用日志与依赖,而不是出问题就先重启。能把链路一层层说清,定位线上故障会快一个数量级。