📚 第一章 网络基础知识
📄 一句话概括

TCP/IP 赢在「层数少、开销小、谁都能实现」。 同样一份数据,四层一共加 42 字节头,占比多少要看数据本身有多大。

📝 本节和前面几节的关系

1.2.7 讲的是「怎么保证安全」,这一节给整个 1.2 节做总结: 七个阶段走下来,为什么落在 TCP/IP 上。 1.3 会从「历史」转到「原理」,讲协议到底是什么、为什么要分层。

一、同期还有哪些对手

1980 年代不是只有 TCP/IP 一家,OSI 那套七层协议是「官方标准」,声势更大。

协议栈 层数 谁在推 结局
OSI 7 国际标准化组织 标准地位保留,实现极少
TCP/IP 4 民间 + 军方项目 事实标准
NetBEUI 少 IBM 局域网内用过,已淘汰
IPX/SPX 少 Novell 游戏局域网时代的回忆

第一行那个「实现极少」是这段历史最值得琢磨的地方: OSI 标准做得非常完整,完整到实现起来太重。 而 TCP/IP 的规范是「够用就行」—— 它先有实现、后有文档(RFC 是边做边写的),所以每一层都贴着真实需求。 这条经验后来反复被验证:先跑起来再定标准的,往往赢过先定标准再实现的。

二、四层是怎么分的

TCP/IP 把 OSI 的七层压成四层,压掉的不是功能,是「抽象层次的数量」。

TCP/IP 四层 对应 OSI 这一层管什么
应用层 应用 + 表示 + 会话 业务语义
传输层 传输 端到端、端口
网络层 网络 寻址与路由
网络接口层 数据链路 + 物理 同一段链路上怎么传

第一行那个「三层并一层」是有代价的: OSI 里「表示层」专门管编码转换、「会话层」专门管对话,TCP/IP 把这两件事都推给了应用自己。 所以 TCP/IP 的应用协议五花八门: 编码各写各的(UTF-8/GBK)、会话各管各的(Cookie/Token)。 这不是缺陷,是「把复杂度放到两端」的必然结果——中间层越薄,两端越要自己操心。

三、开销到底多大

四层一共加 42 字节头(以太网 14 + IP 20 + UDP 8),这个绝对值很小,但占比看数据多大。

应用数据 帧总长 头占比
10 字节 52 字节 80.8%
100 字节 142 字节 29.6%
1400 字节 1442 字节 2.9%

第一行那个 80.8% 说明「小包极不划算」:一个 10 字节的确认包,八成带宽花在头上。 所以协议设计里大量出现「捎带确认」:把确认塞在数据包里一起发,不单独发小包。 这也是 TCP 有「延迟确认」的原因——等一小会儿,看能不能搭上顺风车。

四、动手 Demo:TCP/IP 这四层,每层要吃掉多少字节

同一份 100 字节的应用数据,逐层加头,看每层的累计字节数。 头部字节不是估的,是真拼出来再量长度——len() 出来多少就是多少。

import _netsim as N

payload = b'x' * 100
base = len(payload)
for tag, n in N.stack_sizes(payload):
    print('%-12s 累计 %4d 字节   比原始多 %+d'
          % (tag, n, n - base if tag != '应用数据' else 0))

top = N.stack_sizes(payload)[-1][1]
print('头共 %d 字节,占帧长 %.1f%%'
      % (top - base, (top - base) / top * 100))

实跑输出:

--------------------------------------------------------------------
TCP/IP 这四层,每层要吃掉多少字节
--------------------------------------------------------------------
**书里说 TCP/IP 是「手握金刚钻」的那一个,钻在哪?钻在「用最少的层数把事办成」。**

同一份 100 字节的应用数据,逐层包下去看字节数:

  层             累计字节     比原始数据多
  -----------------------------------------
  应用数据       100          —
  + UDP 头       108          +8
  + IP 头        128          +28
  + 以太网头     142          +42

**四层一共加了 42 字节头,占最终帧长的 29.6%。**

**42 字节头里,以太网 14、IP 20、UDP 8。**
**把应用数据放大到 1400 字节,这个比例会掉到 3% 以下。**
**所以「大包省头」是常识,但大包的代价是分片。**

42 字节头里,以太网 14、IP 20、UDP 8——这三个数是 RFC 里定死的,没有选项时就是这么多。 如果换成 TCP,头会变成 20 字节(无选项),总头数变 54。 TCP 有选项时最多 60 字节头,那时开销更大。 占比 29.6% 这个数只在「100 字节数据」时成立, 数据一放大,占比立刻掉下来——所以「协议开销大不大」不能脱离数据规模谈。

30 秒实验

  1. 把 100 字节改成 10 字节与 1400 字节,各算一次头占比,看变化有多剧烈。
  2. 把 UDP 换成 TCP(改 N.stack_sizes 或自己拼),看头从 42 变成多少。
  3. 算一下「每秒 1000 个 10 字节小包」需要多少带宽, 再算「每秒 10 个 1400 字节大包」需要多少——同样的有效数据量,带宽差多少倍?

常见误区

  1. 以为 OSI 七层是「更完整的 TCP/IP」。 它是另一套设计,完整但重, 实现成本高是它输掉的主因。
  2. 以为层数越少越好。 层少的代价是「两端要自己管更多事」,TCP/IP 的编码与会话就各写各的。
  3. 以为协议开销是个固定百分比。 它完全取决于数据大小,10 字节时占八成, 1400 字节时只占 3%。
自测三问(点开对答案) 1. OSI 标准更完整,为什么反而没赢? —— **因为实现太重**。TCP/IP 是「先有实现、后有文档」,每层都贴着真实需求; **OSI 先定标准再实现,落地成本高。** 2. TCP/IP 把 OSI 的表示层与会话层并进应用层,代价是什么? —— **编码与会话管理推给了应用自己**。所以应用协议五花八门,**统一性差,但灵活**。 3. 10 字节的数据加上 42 字节头,头占比是多少?这说明什么? —— **42/(10+42)=80.8%**。说明**小包极不划算**,所以协议里有「捎带确认」「延迟确认」这类优化。

1.2 节到此结束。下一节换到原理:协议到底是什么,为什么非得分成好几层。

相关笔记