网络协议 —— 互联网世界的"交通规则"

网络协议 —— 互联网世界的"交通规则"
网络协议 —— 互联网世界的"交通规则",没有它们谁也连不上谁

一、先说两句

你在浏览器里输入 `baidu.com`,回车——几秒钟后,百度的首页出现在你面前。

这个"理所当然"的过程背后,**有成百上千条规则在同时运转。** 这些规则就叫"协议"(Protocol)。

```bash
协议就是"约定"——大家都遵守同一套规则,才能互相通信:

人类通信的"协议":
  中国人见面说"你好"
  日本人见面鞠躬
  英国人见面聊天气
  → 不遵守协议的人:别人听不懂、看不懂

计算机网络通信也一样:
  你的电脑和百度服务器通信:
    → 先通过 TCP 协议建立连接(三次握手)
    → 通过 DNS 协议查到百度的 IP 地址
    → 通过 HTTP/HTTPS 协议请求网页
    → 通过 IP 协议把数据包路由到正确的服务器
    → 通过 ARP 协议找到邻居路由器
    → 通过 DHCP 协议拿到你的 IP 地址
    → ……
    
任何一个环节出问题 → 网页打不开
```

很多人觉得网络协议是"理论课上学了考试就忘的东西"。但理解几个核心协议的工作原理,能帮你**真正理解网络问题出在哪**,以及为什么有时候"重启路由器"就解决了。

这篇文章不讲七层模型(OSI),也不让你背各种协议的标准编号。只讲你**最常遇到、最该知道的几个协议。**


二、IP 协议 —— 数据包的"地址和路线"

IP 协议(Internet Protocol)是整个互联网的基石。它的工作很简单:

**把数据包从源地址送到目标地址。**

```bash
数据包在网络上传输的过程:

你发一条消息给朋友
→ 消息被切成一个个"数据包"(通常 1500 字节一个)
→ 每个数据包写上:从哪里来(源 IP)→ 到哪里去(目标 IP)
→ 丢到网络里
→ 经过 N 个路由器,每个路由器看目标 IP 决定往哪个方向转发
→ 最终到达目标设备
→ 目标设备把数据包按顺序拼回完整的消息
```

IP 协议只负责"送",不负责"到了没有":

```bash
IP 协议的核心理念:"尽力而为(Best Effort)"
  → 它尽力把你的数据包送到目的地
  → 但如果中途丢了——它不管
  → 如果顺序乱了——它不管
  → 如果重复了——它也不管

那谁管?TCP 协议管(后面会说)
IP 负责"送",TCP 负责"送好"
```

**IPv4 和 IPv6 的区别:**

```bash
IPv4(32位)→ 约 42 亿个地址
  - 长得像:192.168.1.1
  - 早就用完了
  - 但通过 NAT 技术(一个公网 IP 分给多台设备),还能撑

IPv6(128位)→ 多到数不清
  - 长得像:2001:0db8:85a3:0000:0000:8a2e:0370:7334
  - 每个设备都可以有全球唯一的公网 IP
  - 不需要 NAT——设备之间可以直接通信
  - 国内运营商正在推进,但还没完全普及
```


三、TCP 和 UDP —— 送的"两种姿势"

**TCP(传输控制协议)—— 可靠但慢**

TCP 是为 IP 协议打补丁的——IP 只管送不管好,TCP 来保证送好:

```bash
TCP 保证的三件事:
  1. 不丢包 → 如果没收到确认,自动重发
  2. 按顺序 → 即使后发的包先到了,也按原顺序排好再交给应用
  3. 不重复 → 同一个包收到了两次,只保留一个

TCP 连接建立(三次握手):
  A → B: 嘿,能听到吗?(SYN)
  B → A: 能听到,你呢?(SYN + ACK)
  A → B: 我也能听到,开始传吧(ACK)
  
这个过程增加了延迟——每次建立连接都要"寒暄"一下。
所以 TCP 比 UDP 慢。

TCP 连接的"优雅分手"(四次挥手):
  A → B: 我说完了(FIN)
  B → A: 收到,但我还有话要说(ACK)
  B → A: 我也说完了(FIN)
  A → B: 收到,再见(ACK)
```

**UDP(用户数据报协议)—— 快但不可靠**

```bash
UDP 做的事情:
  不管对方在不在
  不管对方收没收到
  不管顺序对不对
  把数据扔出去就完了

UDP 没有"三次握手"、没有"重发"、没有"顺序保证"
→ 它就是一个"扔纸飞机"的协议
→ 轻量、快速、低延迟

什么时候用 UDP?
  视频直播 → 丢几帧没关系,但卡了就很明显
  语音通话 → 断一句话还能猜,延迟高了就没法聊
  在线游戏 → 你按了键就要立刻送出去,不等确认
  DNS 查询 → 一个请求一个响应,丢了重发就是
```

**区分 TCP 和 UDP 最直观的方式:**

```bash
TCP = 挂号信
  有回执、有编号、丢了重寄
  慢,但可靠

UDP = 明信片
  写了地址就丢邮筒
  丢了就丢了
  快,但可能到不了

用 TCP 的:网页(HTTP)、邮件(SMTP)、文件传输(FTP)
用 UDP 的:视频直播、语音通话、在线游戏、DNS
```


四、DNS 协议 —— 互联网的"电话本"

这是人们"天天用但对它最不了解"的协议。

```bash
你记不住 IP 地址:
  你要访问百度——记不住 39.156.66.10
  你要访问谷歌——记不住 142.250.80.46

所以 DNS(域名系统)出现了:
  你把 baidu.com 给 DNS 服务器
  DNS 服务器返回 39.156.66.10
  你的浏览器再用这个 IP 去访问百度

DNS 查询的完整路径:
  你在浏览器输入 www.baidu.com
  
  1. 先查本地缓存(之前查过没?)
  2. 没有 → 问路由器(路由器可能也有缓存)
  3. 没有 → 问运营商 DNS 服务器
  4. 运营商 DNS 不知道 → 问根域名服务器
     根服务器告诉你:.com 的服务器在哪
  5. 问 .com 服务器:baidu.com 的服务器在哪
  6. 问 baidu.com 的权威 DNS:www 的 IP 是多少
  7. IP 返回给你→ 浏览器拿着 IP 去请求百度

整个过程:几十到几百毫秒
```

**为什么有时候网页打不开但微信能用?**

```bash
大概率是 DNS 被污染或劫持:
  - 运营商 DNS 返回了错误的 IP
  - 或者 DNS 查询被干扰了

症状:微信/QQ 能用(它们不用域名,用 IP)
  但浏览器打不开网页(要用域名,依赖 DNS)

解决:
  手动把电脑/路由器的 DNS 改成 223.5.5.5(阿里)或 1.1.1.1
  这应该解决 80% 的"网页打不开但微信能用"问题
```

常见的公共 DNS 地址,各家有各家的优势——阿里和腾讯的在国内速度快,Cloudflare 的隐私保护好,Google 的全球覆盖好。


五、DHCP 协议 —— 你的设备怎么"自动上网"

你有没有想过一个问题:**为什么你的手机连上 Wi-Fi 就能上网,不需要手动配置 IP 地址?**

答案是 DHCP(动态主机配置协议)。

```bash
你的手机连接 Wi-Fi 时:
  1. 手机广播:有人能给我一个 IP 地址吗?
  2. 路由器里的 DHCP 服务器回应:给你!你的 IP 是 192.168.1.101
  3. 通知你:网关(路由器)是 192.168.1.1
  4. 告诉你:DNS 服务器是 8.8.8.8
  5. 设置一个租期(比如 24 小时)
  → 你的手机就"自动"连上网了
  
整个过程:不到 1 秒
```

**DHCP 租期:**

```bash
IP 地址不是永久分配的,是"租"给你的:
  - 租期到了:设备如果还在线,自动续租
  - 设备离线:租期到了就回收 IP,给其他设备用

租期长短的影响:
  短租期(30 分钟)→ 适合咖啡馆、机场(人员流动性大)
  长租期(24 小时+)→ 适合家庭(设备固定)

问题场景:
  路由器的 DHCP 池里有 254 个地址
  但你有 30 台设备,每台都永久占着
  → 新的设备来了分配不到 IP → "无法加入网络"
  → 重启路由器 → 所有 IP 释放 → 问题暂时解决
```

**DHCP 也解释了为什么"重启路由器"能解决很多网络问题:**
路由器重启 → DHCP 服务重启 → 所有设备重新获取 IP → 原来的一些冲突和缓存问题自动消失。


六、HTTP/HTTPS —— 你每天打开网页都在用

HTTP(超文本传输协议)是**浏览器和服务器之间对话的语言。**

```bash
你打开一个网页时真正发生的事:

你的浏览器说(HTTP 请求):
  GET /index.html HTTP/1.1
  Host: www.example.com
  User-Agent: Chrome/120.0
  Accept: text/html
  →

服务器回应(HTTP 响应):
  ←
  HTTP/1.1 200 OK
  Content-Type: text/html
  Content-Length: 12345
  
  <html>
    <body>
      <h1>Hello World!</h1>
    </body>
  </html>
👤
hermes
AiTech 技术博客,专注于计算机技术、云计算、编程开发和 AI 前沿领域的深度报道与技术分析。
文章评论 0 条
U
👍 👎 @
K
Kevin
2 小时前
Rust 的 async 生态终于要完善了!Async Iterator 和 async closure 这两块一直是我觉得最欠缺的。期待今年的进展!
👀 12 💬 回复
S
Sarah
5 小时前
编译速度优化这块太重要了,我们项目从 5 分钟降到 2 分钟就是巨大的效率提升。期待并行前端解析的上线。
👀 8 💬 回复

🎨 配色自定义设置