跳转至

计算机网络与前后端通信

核心主线:

应用层协议规定“怎么说话” → 传输层负责“怎么传” → 网络层负责“送到哪里” → 数据链路层负责“这一跳怎么送” → 物理层负责“真正变成信号传出去”。


1. 协议

协议(Protocol)可以理解为通信双方共同遵守的一套规则。

它规定:

  • 消息的组织方式
  • 消息内容的含义
  • 发送方是谁、接收方是谁
  • 定义通信的成功和失败,以及失败后的处理方式

例如:

  • HTTP:规定发送方(Web 客户端)和接收方(服务器)怎么交流
  • TCP/UDP:规定数据传输是否可靠(建立连接丢包重传保证顺序/不建立连接直接发)
  • IP:规定如何寻址和进行网络间转发
  • ARP:帮助在局域网中根据 IP 找到对应的 MAC 地址

所以:

协议 ≈ 通信双方共同遵守的“语言规则”。


2. OSI 七层模型

OSI 模型把网络通信抽象成七层:

名称 主要解决什么
7 应用层 应用程序之间怎么交流
6 表示层 数据如何表示、编码、加密、压缩
5 会话层 管理通信会话
4 传输层 端到端的数据传输
3 网络层 寻址、路由
2 数据链路层 相邻设备之间如何传输
1 物理层 真正传输比特的物理信号

重点记三个:

HTTP    → 应用层
TCP/UDP → 传输层
IP      → 网络层

3. 实际网络模型

实际互联网开发中,经常使用 TCP/IP 模型,而不是严格使用 OSI 七层模型。

可以简单理解成:

HTTP(应用层)
 ↓
TCP / UDP(传输层)
 ↓
IP(网络层)
 ↓
Wi-Fi / Ethernet(网络接口层)
 ↓
电信号 / 无线信号(物理介质)

OSI 七层更多是一种理解网络的理论模型,现实协议并不会严格一层对应一个协议。


4. 数据的传输封装

封装(Encapsulation)

发送数据的时候:

应用层:(HTTP 数据)
            ↓ 加 TCP 头
传输层:(TCP 头 + HTTP 数据)
            ↓ 加 IP 头
网络层:(IP 头 + TCP 头 + HTTP 数据)
            ↓ 加链路层头部
数据链路层:帧头 + IP 包 + 帧尾
            ↓ 二进制数据
物理层:电信号 / 光信号 / 无线信号

接收端则反过来(解封装):

物理信号
 ↓
数据链路层拆帧
 ↓
网络层处理 IP
 ↓
传输层处理 TCP/UDP
 ↓
应用层解析 HTTP
 ↓
应用程序得到真正的数据

6. HTTP介绍

HTTP:HyperText Transfer Protocol,超文本传输协议

应用层协议:规定客户端和服务器之间如何交流,是一套公开的通信规则。

例如,客户端发送:

GET /api/user/123 HTTP/1.1
Host: example.com

服务器返回:

HTTP/1.1 200 OK
{
    "name": "Tom"
}

HTTP 标准

请求方法

GET
POST
PUT
DELETE
HEAD
OPTIONS
...

状态码

200 → 成功
301/302 → 重定向
400 → 请求错误
401 → 未认证
403 → 禁止访问
404 → 找不到资源
500 → 服务器错误

请求头

例如:

Host
Content-Type
Authorization
Cookie
User-Agent
...

响应头

例如:

Content-Type
Content-Length
Set-Cookie
Cache-Control
...

基本任何编程语言都可以实现 HTTP

HTTP 标准
   ↓
各个程序员/公司按照标准实现
   ↓
Java HTTP 库
Python HTTP 库
Android HTTP 库
浏览器
Spring
Nginx
...

8. GET 和 Controller 是什么关系?

这是前后端开发里非常重要的一点。

假设前端发送:

GET /api/user/123

这里:

GET

是 HTTP 标准规定的请求方法。

而:

/api/user/123

是这个 Web API 的路径。

后端 Spring Boot 可以写:

@GetMapping("/api/user/{id}")
public User getUser(...) {
    ...
}

于是:

前端
 ↓
发送 HTTP GET 请求
 ↓
GET /api/user/123
 ↓
服务器
 ↓
Spring MVC
 ↓
匹配 @GetMapping
 ↓
Controller 方法执行
 ↓
返回数据
 ↓
HTTP Response
 ↓
前端

因此:

HTTP 是通信规则,GET 是 HTTP 定义的一种请求方法,API 是后端提供的接口,Controller 是服务器中负责处理这个请求的代码。


9. 前后端通信本质是什么?

例如一个前端页面请求用户信息:

前端
  ↓
HTTP GET
  ↓
/api/user/123
  ↓
后端 Controller
  ↓
业务逻辑
  ↓
数据库
  ↓
生成 JSON
  ↓
HTTP Response
  ↓
前端

底层又可以继续往下展开:

HTTP
 ↓
TCP
 ↓
IP
 ↓
链路层
 ↓
物理层

所以:

前后端通信最常见的应用层协议就是 HTTP/HTTPS。


10. 本地前后端也可以使用 HTTP

例如:

前端:
localhost:3000

后端:
localhost:8080

前端请求:

http://localhost:8080/api/user

依然可以使用 HTTP。

如果 HTTP 使用 TCP,那么大致可以理解成:

HTTP
 ↓
TCP
 ↓
IP(127.0.0.1)
 ↓
本机回环网络
 ↓
后端程序

数据实际上没有离开电脑。


11. HTTP 和 HTTPS

HTTP

HTTP
 ↓
TCP
 ↓
IP

数据通常是明文传输。


HTTPS

可以简单理解成:

HTTP
 ↓
TLS
 ↓
TCP
 ↓
IP

TLS 提供:

  • 加密
  • 防止数据被篡改
  • 服务器身份验证

所以:

HTTPS ≈ HTTP + TLS


12. TLS 是什么?

TLS:

Transport Layer Security

它负责保护网络通信。

主要解决三个问题:

① 保密

别人截获数据,也不能直接看懂。

② 防篡改

防止数据在传输过程中被偷偷修改。

③ 身份验证

帮助确认:

“我连接的服务器确实是我要访问的服务器。”


13. TCP 和 UDP

TCP 和 UDP 都属于:

传输层协议

它们主要解决:

数据怎么从一个程序传到另一个程序。


TCP

TCP 强调可靠性。

具有:

  • 建立连接
  • 数据确认
  • 重传
  • 顺序控制
  • 流量控制等

可以粗略想成:

“先建立可靠的通信关系,再传数据。”


UDP

UDP 更简单。

它不会像 TCP 那样提供完整的可靠传输机制。

特点:

  • 无连接
  • 开销小
  • 延迟低
  • 不保证一定到达
  • 不保证顺序

所以:

TCP → 更强调可靠
UDP → 更强调低延迟、简单

14. TCP/UDP 和 HTTP 的关系

这里非常容易混淆。

TCP/UDP 和 HTTP 不是同一个层次的东西

应用层:
HTTP
WebSocket
DNS
自定义游戏协议
...

传输层:
TCP
UDP

所以:

TCP/UDP 负责“怎么传”,应用层协议负责“数据是什么意思、怎么组织”。

例如:

HTTP:
GET /user/123

HTTP 决定这句话的格式和含义。

TCP 负责把这些数据可靠地传过去。


15. WebSocket 和 HTTP

WebSocket 是一种应用层通信协议。

它和普通 HTTP 最大的区别之一,是通信模式不同。

HTTP

典型模式:

客户端 → 请求
服务器 → 响应

例如:

客户端:我要用户信息
服务器:给你 JSON

WebSocket

建立连接后,可以进行持续的双向通信:

客户端 ←→ 服务器
       ←→
       ←→
       ←→

服务器可以主动给客户端发送消息。

因此适合:

  • 实时聊天
  • 实时通知
  • 实时状态更新
  • 某些实时应用

16. 不使用 HTTP 的场景怎么办?

HTTP 只是应用层协议之一。

其他场景可以使用:

HTTP
WebSocket
TCP 自定义协议
UDP 自定义协议
gRPC
RTP
WebRTC
Unix Socket
...

例如:

场景 常见技术
普通网页 HTTP/HTTPS
前后端 API HTTP/HTTPS
实时聊天 WebSocket 等
游戏 TCP/UDP + 自定义协议等
音视频实时通信 RTP/WebRTC 等
本机进程通信 Unix Socket 等
服务间通信 HTTP、gRPC 等

17. 游戏是怎么通信的?

例如多人游戏:

玩家 A
 ↓
游戏服务器
 ↓
玩家 B

客户端可能发送:

玩家位置
玩家方向
操作状态
...

服务器再进行:

接收
 ↓
判断
 ↓
更新游戏状态
 ↓
广播给其他玩家

游戏可以使用:

UDP
+
自定义游戏协议

也可能使用 TCP 或其他方案。

关键是:

UDP/TCP 负责传输,游戏自己定义的数据格式负责表达“玩家移动了”“开火了”等含义。


18. 微信聊天的基本原理

聊天软件的核心并不是简单的:

手机 A ←→ 手机 B

而更常见的是:

手机 A
   ↓
微信服务器
   ↓
手机 B

例如 A 发:

“你好”

大致过程:

A 手机
 ↓
聊天客户端
 ↓
微信服务器
 ↓
服务器判断 B 是谁
 ↓
找到 B 的连接/消息投递路径
 ↓
B 手机
 ↓
聊天客户端
 ↓
显示“你好”

大型聊天系统背后会使用大量服务器组成分布式集群。

所以不是:

“一台服务器连接十几亿人。”

而是:

大量服务器共同承担连接、消息路由、存储、推送等工作。

具体使用哪些内部协议和架构属于大型系统的实现细节,不需要把它简单等同于某一个 HTTP 或 WebSocket。


19. 音视频通信

音视频又是一个很好的例子,因为:

数据的“内容编码”和“网络通信协议”是两回事。

例如视频:

摄像头
 ↓
视频编码
 ↓
H.264 / H.265 / AV1 等
 ↓
通过通信协议传输
 ↓
网络
 ↓
接收端
 ↓
解码
 ↓
屏幕

这里:

H.264

主要解决:

视频数据怎么编码。

而:

RTP / WebRTC 等

解决的是:

实时音视频如何进行网络通信。


20. 数据链路层是什么?

数据链路层主要解决:

相邻设备之间,这一跳怎么传数据。

例如:

电脑
 ↓
Wi-Fi
 ↓
路由器

这就是一条链路。

数据链路层常见概念:

  • MAC 地址
  • Frame(帧)
  • Ethernet(以太网)
  • Wi-Fi
  • ARP 等相关机制

21. 为什么已经有 IP,还需要链路层?

因为:

IP 解决的是“网络层面的目的地和路由”,而链路层解决的是“当前这一跳怎么把数据交给相邻设备”。

例如:

电脑
 ↓
路由器 A
 ↓
路由器 B
 ↓
路由器 C
 ↓
服务器

IP 负责:

最终要去服务器

而链路层负责:

这一跳到底怎么交给旁边这个设备?

22. 帧为什么是一跳一变?

这是理解链路层的关键。

假设:

电脑 A
 ↓
路由器
 ↓
服务器

A → 路由器:

帧
MAC A → MAC 路由器
IP A  → IP 服务器

路由器收到以后,会重新封装下一跳的链路层帧:

帧
MAC 路由器 → MAC 下一跳
IP A       → IP 服务器

所以:

IP 包可以一路向最终目的地传递,而链路层的帧通常是“一跳一换”。


23. ARP 是什么?

ARP:

Address Resolution Protocol

它解决一个很实际的问题:

已经知道目标的 IP 地址,但是我怎么知道它对应的 MAC 地址?

例如:

我知道:
192.168.1.20

但我要在局域网里发帧,
还需要知道:

对应的 MAC 地址是多少?

ARP 就可以帮助完成这个映射。

可以粗略理解:

IP 地址
 ↓ ARP
MAC 地址

因此 ARP 和数据链路层密切相关,但严格划分时,它并不完全等同于传统 OSI 二层协议。


24. MAC 地址是什么?

MAC 地址可以简单理解成:

网络接口在局域网通信中的链路层地址。

例如:

电脑网卡
 ↓
MAC 地址

而 IP 是:

网络层地址

所以:

MAC → 主要用于一跳通信
IP  → 用于网络间寻址和路由

25. 交换机是什么?

交换机主要工作在数据链路层。

它主要处理:

MAC 地址
Frame(帧)

例如:

电脑 A ─┐
电脑 B ─┼─ 交换机
电脑 C ─┘

交换机会学习:

MAC A → 端口 1
MAC B → 端口 2
MAC C → 端口 3

收到一个帧以后,根据目标 MAC 地址决定:

应该从哪个端口发出去。


26. 路由器是什么?

路由器主要关注:

IP 地址

它负责不同网络之间的数据转发。

例如:

局域网
   ↓
路由器
   ↓
互联网
   ↓
服务器所在网络

路由器根据 IP 和路由表决定:

下一步往哪里走。


27. 交换机 vs 路由器

最简单的记忆方式:

交换机 路由器
主要关注 MAC IP
主要处理 IP 包
主要作用 局域网内部转发 不同网络之间转发
典型层次 数据链路层 网络层

可以记成:

交换机 → MAC → 局域网内怎么走

路由器 → IP → 不同网络之间怎么走

28. 交换机是不是必须的?

不一定。

例如家里的设备:

手机
  ↓ Wi-Fi
路由器

不需要额外买一个交换机。

或者:

电脑
  ↓ 网线
路由器

也可以直接通信。

交换机主要是在:

需要连接很多有线设备时扩展网络。

而且现实中的家用路由器往往已经把:

路由器
+ 交换机
+ Wi-Fi AP

等功能集成在一个设备里。


29. 最后把整个知识体系串起来

假设:

你在浏览器输入一个网站,然后请求服务器。

整个过程可以粗略画成:

                 应用层
┌─────────────────────────────┐
│ HTTP / HTTPS                │
│ “我要 /api/user/123”        │
└──────────────┬──────────────┘
               ↓
                 传输层
┌─────────────────────────────┐
│ TCP / UDP                   │
│ “我负责把数据传过去”         │
└──────────────┬──────────────┘
               ↓
                 网络层
┌─────────────────────────────┐
│ IP                          │
│ “我要去哪个 IP”              │
└──────────────┬──────────────┘
               ↓
               数据链路层
┌─────────────────────────────┐
│ Ethernet / Wi-Fi / MAC      │
│ “这一跳交给哪个设备”         │
└──────────────┬──────────────┘
               ↓
                 物理层
┌─────────────────────────────┐
│ 电信号 / 光 / 无线信号       │
│ “真正把比特传出去”           │
└─────────────────────────────┘

而中间如果经过多个路由器:

电脑
 ↓
交换机 / Wi-Fi
 ↓
路由器
 ↓
互联网
 ↓
路由器
 ↓
服务器

IP 负责整个旅程的寻址和路由;链路层负责每一跳;TCP负责端到端传输;HTTP负责应用之间怎么交流。


30. 最值得记住的一张图

             “说什么?”
                  ↓
        ┌─────────────────┐
        │ HTTP / WebSocket │
        │    应用层        │
        └────────┬────────┘
                 ↓
             “怎么传?”
                 ↓
        ┌─────────────────┐
        │   TCP / UDP     │
        │    传输层       │
        └────────┬────────┘
                 ↓
             “去哪儿?”
                 ↓
        ┌─────────────────┐
        │       IP        │
        │     网络层      │
        └────────┬────────┘
                 ↓
           “这一跳怎么走?”
                 ↓
        ┌─────────────────┐
        │ Ethernet / Wi-Fi│
        │    链路层       │
        └────────┬────────┘
                 ↓
             “怎么变成信号?”
                 ↓
        ┌─────────────────┐
        │    物理层       │
        │ 电/光/无线信号   │
        └─────────────────┘

一句话总结:

应用层决定“数据说什么、长什么样”;传输层决定“端到端怎么传”;网络层决定“往哪台机器/哪个网络走”;链路层决定“这一跳交给谁”;物理层负责“真的把 0 和 1 变成信号传出去”。

这套框架一旦理解了,你后面再学 DNS、HTTP、HTTPS、WebSocket、RPC、游戏协议、音视频协议、Nginx、前后端部署,基本都可以把它们放到这张图里的相应位置。

31. HTTP、TCP、UDP 的连接与握手流程

31.1 HTTP 本身有没有“握手”?

要先区分:

HTTP 是应用层协议,TCP 是传输层协议。

传统 HTTP/1.1 通常运行在 TCP 上,所以你访问一个 HTTP 网站时,通常是:

HTTP
 ↓
TCP
 ↓
IP

因此我们经常看到“HTTP 请求之前先 TCP 三次握手”。

但严格来说:

三次握手是 TCP 的,不是 HTTP 的。

HTTP 自己主要负责的是:

请求 → 响应

例如:

客户端                    服务器
  │                         │
  │──── HTTP GET ──────────>│
  │                         │
  │<─── HTTP 200 + 数据 ────│

32. TCP 三次握手

TCP 是面向连接的协议。

在真正传输数据之前,客户端和服务器需要先建立 TCP 连接。

经典的三次握手:

客户端                              服务器
  │                                  │
  │──── SYN ────────────────────────>│
  │                                  │
  │<─── SYN + ACK ──────────────────│
  │                                  │
  │──── ACK ────────────────────────>│
  │                                  │
  │        TCP连接建立                │

TCP 建立连接之后,双方就可以传数据:

客户端                         服务器
  │                              │
  │──── 数据 ──────────────────>│
  │<─── ACK ───────────────────│
  │                              │
  │──── 数据 ──────────────────>│
  │<─── ACK ───────────────────│

TCP 提供:

  • 可靠传输
  • 按序交付
  • 重传
  • 流量控制
  • 拥塞控制

33. 为什么需要三次?

核心是:

让双方都确认彼此的发送和接收能力正常,同时同步连接状态。

简化过程可以理解成:

① DNS
   ↓
找到服务器 IP

② TCP 三次握手
   ↓
建立 TCP 连接

③ TLS 握手
   ↓
建立安全加密通信

④ HTTP 请求
   ↓
GET /index.html

⑤ HTTP 响应
   ↓
200 OK + 网页数据

36. TCP 四次挥手

TCP 连接不是永远存在的。

通信结束时,需要关闭连接。

经典过程叫:

四次挥手

简化:

客户端                              服务器
  │                                  │
  │──── FIN ────────────────────────>│
  │                                  │
  │<─── ACK ────────────────────────│
  │                                  │
  │<─── FIN ────────────────────────│
  │                                  │
  │──── ACK ────────────────────────>│
  │                                  │
  │          连接关闭                 │

37. UDP 有没有握手?

UDP 没有 TCP 那样的三次握手。

UDP 是:

无连接的传输协议。

例如:

客户端                         服务器
  │                              │
  │──── UDP 数据 ──────────────>│
  │──── UDP 数据 ──────────────>│
  │──── UDP 数据 ──────────────>│

不需要:

SYN
SYN + ACK
ACK

因此 UDP 开销更小,发送数据更加直接。