外观
两台电脑交换数据,为什么要定协议?
阶段 0 · 计算机与数据基础 · 第 3 课
假设你把电脑 A 和电脑 B 用一根网线直接连起来,想把一个名为 note.txt、内容只有一个字母 A 的小文件传给电脑 B。在第 2 课中,电脑 A 的应用程序已经能通过操作系统、驱动和网卡把字节流发上网线了。
可是,当电脑 B 的网卡从信号里恢复出一连串字节时,电脑 B 的操作系统瞬间遇到了三个难题:这串字节从哪里开始是文件内容?对方发这串字节是想传文件还是想断开连接?如果中间漏掉了一个字节,谁负责重发?
学完本课后,你将能够:
- 解释网络协议的三个核心要素(语法、语义、时序),并把具体规则对号入座。
- 算出并画出一条带有简单控制首部(Header)和载荷(Payload)的消息格式。
- 完成阶段 0 总目标:用自己的话完整串起
A → 65 → 01000001以及程序、操作系统、协议和网卡各自的工作。
1. 先看图:只发纯数据为什么行不通?
如果电脑 A 不加任何说明,直接把文件名 note.txt(8 个字节)和文件内容 A(1 个字节)连在一起发出去,电脑 B 收到的只是紧挨着的 9 个字节:
0x6E 0x6F 0x74 0x65 0x2E 0x74 0x78 0x74 0x41
站在电脑 B 的角度思考,它会面临图中标出的三个疑问:
- 边界在哪里? 电脑 B 不知道文件名有几个字符,很可能把
note.txtA整个当成文件名,或者把te.txtA当成文件内容。 - 含义是什么? 这 9 个字节到底是“请保存这个文件”,还是“请查找这个文件”,或者是“上一条消息收到啦”?
- 顺序怎么配合? 如果电脑 B 正在忙、缓冲区满了,或者网线受到干扰丢了最后一个字节
0x41,电脑 A 怎么知道要不要重发?
2. 给数据套上“信封”:首部与载荷
寄信时,你不会只把信纸扔进邮筒,而是会在信纸外面套一个信封,在信封上按固定格子写好收信人、寄信人和邮编。
网络通信采用完全相同的思路。我们在真正要传的应用数据(称为载荷(Payload),Payload)前面,附加上一段按严格规则排列的控制信息(称为首部(Header),Header)。把控制首部加到载荷外面的过程,就叫作封装(Encapsulation)。
先预测,再核对字节表
假设我们为电脑 A 和电脑 B 设计一个极简通信规则:每条消息前面固定加 3 个字节的首部——第 1 字节表示“消息类型”(0x01 代表发送数据,0x02 代表确认收到),第 2~3 字节用无符号整数表示后面载荷的字节长度。
现在电脑 A 要发送单个字母 A(ASCII 编码 0x41,长度 1 字节)。请先预测这笔消息总共占几个字节,再对照下表:
| 字节位置 | 字段角色 | 十六进制值 | 8 位二进制表示 | 接收端(电脑 B)读到它时做什么 |
|---|---|---|---|---|
| 第 1 字节 | 首部(Header) · 类型(Type) | 0x01 | 00000001 | 识别出这是一条“发送数据请求”,准备接收数据 |
| 第 2~3 字节 | 首部(Header) · 长度(Length) | 0x0001 | 00000000 00000001 | 得知紧随其后的有效载荷恰好有 1 个字节 |
| 第 4 字节 | 载荷(Payload) · 数据(Data) | 0x41 | 01000001 | 精准取出这 1 个字节交给应用程序,解码为字符 A |
电脑 B 顺利收下 0x41 后,再按约定给电脑 A 回发一条 3 字节的确认消息:0x02 0x00 0x00(类型为 0x02 确认收到,载荷长度为 0)。
3. 协议的三要素:语法、语义与时序
刚才我们设计的这套约定,就是一份迷你的网络协议。任何网络协议(无论是后续课程要学的以太网、IP、TCP、OSPF 还是 HTTP),都可以拆解为三个要素:
| 协议要素 | 回答什么问题 | 在本课例子里的体现 | 在真实网络协议里的常见例子 |
|---|---|---|---|
| 语法(Syntax) | 数据长什么样?每个字段占几位、排在哪里? | 第 1 字节是 Type,第 2–3 字节是 Length,后面是 Payload | IPv4 首部固定部分占 20 字节,源 IP 占 32 位 |
| 语义(Semantics) | 字段的数值代表什么意思?收到后要做什么动作? | Type = 0x01 表示携带数据;Type = 0x02 表示确认收到 | TCP 首部里 SYN = 1 表示请求建立连接 |
| 时序(Timing / 同步) | 谁先发、谁后回?发多快?超时多久没收到算失败? | A 先发 0x01 数据,B 收到后回 0x02;A 等待超 500 ms 未收到则重传 | ARP 先广播请求再单播应答;TCP 超时重传与速率控制 |
4. 从简单约定到网络分层封装
在真实网络里,两台电脑之间往往隔着交换机、路由器甚至整个互联网。如果把“物理信号怎么发、局域网怎么找邻居、跨网段怎么选路、丢包怎么重传”全都塞进同一个巨大的首部里,任何一处硬件升级(比如从铜线换成 Wi-Fi)都会迫使所有软件重写。
因此,计算机网络采用了**分层(Layering)**思想:每一层只解决一类问题,并在自己的首部里写下本层需要的信息:
- 应用层准备好要传的数据(如
A)。 - 传输层加上传输层首部(Header)(标明交给电脑上的哪个程序、编上序号)。
- 网络层加上 IP 首部(标明最终发往哪台电脑的 IP 地址)。
- 数据链路层加上以太网帧头和帧尾(标明当前这一段网线交给哪块网卡,并附上差错校验码)。
- 物理层把整串比特流转换成电信号、光脉冲或无线电波送上介质。
5. 阶段 0 总结与下一步
恭喜你完成了**阶段 0(计算机与数据基础)**的全部三课!现在你可以不看提示,完整复述一次发送端的故事:
- 字符与二进制(第 1 课):字母
A按 ASCII 规则映射为十进制65,写成 8 位二进制是一个字节(Byte)01000001。 - 进程与操作系统(第 2 课):聊天进程通过系统调用把
01000001交给操作系统内核缓冲区,网卡驱动程序利用 直接内存访问(DMA) 让网卡从内存取走数据。 - 协议与封装(第 3 课):通信双方遵守共同的协议(语法、语义、时序),通过逐层封装加上控制首部(Header),让接收端能够准确识别边界、理解含义并按序还原数据。
从下一课(第 4 课 · 信号、波形、噪声与编码)开始,我们正式进入阶段 1 · 物理层:当 01000001 变成电信号冲进几十米长的网线后,信号为什么会变弱、变形?接收端网卡怎样在噪声干扰中找准时钟,把 0 和 1 毫发无损地认出来?