一、网站架构总览
前端是静态页面,用 HTML/CSS/JS 写布局和设计;前端和后端代码都用 git 推送到 GitHub。(然后刚好趁实践梳理一下有关的知识点)
1. 前端
主要是 HTML、CSS、JavaScrip 代码利用 git 部署推送到 github 仓库,GitHub Pages 自动托管。
2. 后端
Node.js 部署在我的轻量云服务器上,接收前端发来的 /api/get 、 /api/set 请求,去另外一个 GitHub 仓库读写数据,返回 JSON 给前端。
为什么需要后端?因为浏览器不能直接读写 GitHub 仓库。
3. 数据存储(我的“数据库”)
把 GitHub 仓库 blog-data 当作数据库,仓库里有一个 data.json 文件,里面存两个表单的数据。
注意:这里的“数据库”其实是一个 JSON 文件,不是真正的数据库管理系统。(整这个感觉有点麻烦 MySQL 🤔)
4. 入口网关
整了个域名托管在 Cloudflare 上,主要原因是暂时不想备案。
请求流程:
用户请求 → Cloudflare(边缘节点)→ 轻量云服务器公网 IP(Nginx 监听 80 端口)→ 转发到本地 127.0.0.1:3000→ Node.js 处理并返回
(部署在 Vercel 上就不用这么繁琐了,但 Vercel 国内访问不稳定)
二、为什么需要“分层”?—— OSI 与 TCP/IP 模型
| OSI 七层 | TCP/IP 四层 | 搭站对应物 |
|---|---|---|
| 7. 应用层 | 应用层 | HTTP、DNS |
| 5-6. 表示/会话层 | 向上合并到应用层 | TLS 加密(HTTPS) |
| 4. 传输层 | 传输层 | TCP(各种端口 80、3000) |
| 3. 网络层 | 网际层 | IP、路由(Cloudflare 边缘节点) |
| 2. 数据链路层 | 网络接口层 | 网卡、交换机、以太网 |
| 1. 物理层 | 向上合并 | 光纤、网线 |
互联网大多用的是 TCP/IP 四层模型,OSI 是教学概念模型。
三、IP 地址与端口
IP 地址
标识网络中一台主机。
43.108.103.117是阿里云轻量服务器公网 IP- IPv4 是 32 位
- IPv6 是 128 位
端口
标识主机上的一个服务进程。
知名端口(0-1023):
:80→ HTTP:443→ HTTPS:53→ DNS
Socket 五元组
(源 IP, 源端口, 目的 IP, 目的端口, 协议) 唯一标识一条连接,这就像逆向里的“调用上下文”。
例如执行 curl http://127.0.0.1:3000/api/get 时,就是创建一个 socket:
- 源 IP:127.0.0.1
- 源端口:系统随机分配(比如 51234)
- 目的 IP:127.0.0.1
- 目的端口:3000
- 协议:TCP
四、传输层的 TCP 三次握手
TCP 是面向连接、可靠、全双工的协议。所谓“可靠”,就是接收方每收到一个包都要回 ACK,丢了就重传。
三次握手的过程:
- 第一次:客户端证明自己能发
- 第二次:服务器证明自己能收能发
- 第三次:客户端证明服务器能收
少了第三次的话,服务器不知道客户端是否真的收到了自己的 SYN+ACK,可能会为不存在的连接浪费资源。
浏览器访问后端 API 时,首先就是这套三次握手——只不过目的 IP 是 Cloudflare 的边缘节点,然后 Cloudflare 再用另一套 TCP 连接去连轻量云服务器的公网 IP。
UDP 对比
UDP 是无连接、不可靠、面向报文的协议。它在发送数据前不需要像 TCP 那样进行“三次握手”来建立连接,不保证数据一定到达,允许数据在传输过程中丢失、乱序或重复。视频通话、游戏也是用 UDP。
五、应用层的 HTTP 协议
HTTP 是无状态的请求-响应模型。
常见状态码
2xx 成功: 200 OK 、 201 Created
3xx 重定向: 301 永久 、 302 临时
4xx 客户端错误: 400 参数错 、 401 未授权 、 403 禁止 、 404 不存在 、 429 过多请求
5xx 服务器错误: 500 内部错误 、 502 网关错误 、 503 不可用 、 522 (Cloudflare 专属:连不到源站)
这两周遇到的 404、522、CORS 报错,都是属于 HTTP 层的不同失败模式。
六、HTTPS = HTTP + TLS
TLS 握手在 TCP 三次握手之后,再做一次“加密协商”:
- 客户端发
ClientHello(支持的加密套件) - 服务器回
ServerHello+ 证书 - 双方协商出对称密钥
这就是 https:// 比 http:// 多了的那一层——对应 OSI 的表示层。
七、DNS
在浏览器输入 api.xxxxxx.xx,机器只认 IP,所以要先做 DNS 解析:域名 → IP。