一、网站架构总览

前端是静态页面,用 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 专属:连不到源站)

这两周遇到的 404522CORS 报错,都是属于 HTTP 层的不同失败模式。


六、HTTPS = HTTP + TLS

TLS 握手在 TCP 三次握手之后,再做一次“加密协商”:

  1. 客户端发 ClientHello(支持的加密套件)
  2. 服务器回 ServerHello + 证书
  3. 双方协商出对称密钥

这就是 https://http:// 多了的那一层——对应 OSI 的表示层。


七、DNS

在浏览器输入 api.xxxxxx.xx,机器只认 IP,所以要先做 DNS 解析:域名 → IP。