跳转到正文

两台电脑交换数据,为什么要定协议? ​

阶段 0 · 计算机与数据基础 · 第 3 课

假设你把电脑 A 和电脑 B 用一根网线直接连起来,想把一个名为 note.txt、内容只有一个字母 A 的小文件传给电脑 B。在第 2 课中,电脑 A 的应用程序已经能通过操作系统、驱动和网卡把字节流发上网线了。

可是,当电脑 B 的网卡从信号里恢复出一连串字节时,电脑 B 的操作系统瞬间遇到了三个难题:这串字节从哪里开始是文件内容?对方发这串字节是想传文件还是想断开连接?如果中间漏掉了一个字节,谁负责重发?

学完本课后,你将能够:

  1. 解释网络协议的三个核心要素(语法、语义、时序),并把具体规则对号入座。
  2. 算出并画出一条带有简单控制首部(Header)和载荷(Payload)的消息格式。
  3. 完成阶段 0 总目标:用自己的话完整串起 A → 65 → 01000001 以及程序、操作系统、协议和网卡各自的工作。

电脑 A 向电脑 B 发送一串字节时,如果没有事先约定,电脑 B 无法判断字段边界、消息含义和重传顺序。

1. 先看图:只发纯数据为什么行不通? ​

如果电脑 A 不加任何说明,直接把文件名 note.txt(8 个字节)和文件内容 A(1 个字节)连在一起发出去,电脑 B 收到的只是紧挨着的 9 个字节:

0x6E 0x6F 0x74 0x65 0x2E 0x74 0x78 0x74 0x41

站在电脑 B 的角度思考,它会面临图中标出的三个疑问:

  1. 边界在哪里? 电脑 B 不知道文件名有几个字符,很可能把 note.txtA 整个当成文件名,或者把 te.txtA 当成文件内容。
  2. 含义是什么? 这 9 个字节到底是“请保存这个文件”,还是“请查找这个文件”,或者是“上一条消息收到啦”?
  3. 顺序怎么配合? 如果电脑 B 正在忙、缓冲区满了,或者网线受到干扰丢了最后一个字节 0x41,电脑 A 怎么知道要不要重发?

2. 给数据套上“信封”:首部与载荷 ​

寄信时,你不会只把信纸扔进邮筒,而是会在信纸外面套一个信封,在信封上按固定格子写好收信人、寄信人和邮编。

网络通信采用完全相同的思路。我们在真正要传的应用数据(称为载荷(Payload),Payload)前面,附加上一段按严格规则排列的控制信息(称为首部(Header),Header)。把控制首部加到载荷外面的过程,就叫作封装(Encapsulation)。

在应用载荷 0x41 前面加上 1 字节类型和 2 字节长度首部,并对应协议的语法、语义和时序三要素。

先预测,再核对字节表 ​

假设我们为电脑 A 和电脑 B 设计一个极简通信规则:每条消息前面固定加 3 个字节的首部——第 1 字节表示“消息类型”(0x01 代表发送数据,0x02 代表确认收到),第 2~3 字节用无符号整数表示后面载荷的字节长度。

现在电脑 A 要发送单个字母 A(ASCII 编码 0x41,长度 1 字节)。请先预测这笔消息总共占几个字节,再对照下表:

字节位置字段角色十六进制值8 位二进制表示接收端(电脑 B)读到它时做什么
第 1 字节首部(Header) · 类型(Type)0x0100000001识别出这是一条“发送数据请求”,准备接收数据
第 2~3 字节首部(Header) · 长度(Length)0x000100000000 00000001得知紧随其后的有效载荷恰好有 1 个字节
第 4 字节载荷(Payload) · 数据(Data)0x4101000001精准取出这 1 个字节交给应用程序,解码为字符 A

电脑 B 顺利收下 0x41 后,再按约定给电脑 A 回发一条 3 字节的确认消息:0x02 0x00 0x00(类型为 0x02 确认收到,载荷长度为 0)。

3. 协议的三要素:语法、语义与时序 ​

刚才我们设计的这套约定,就是一份迷你的网络协议。任何网络协议(无论是后续课程要学的以太网、IP、TCP、OSPF 还是 HTTP),都可以拆解为三个要素:

协议要素回答什么问题在本课例子里的体现在真实网络协议里的常见例子
语法(Syntax)数据长什么样?每个字段占几位、排在哪里?第 1 字节是 Type,第 2–3 字节是 Length,后面是 PayloadIPv4 首部固定部分占 20 字节,源 IP 占 32 位
语义(Semantics)字段的数值代表什么意思?收到后要做什么动作?Type = 0x01 表示携带数据;Type = 0x02 表示确认收到TCP 首部里 SYN = 1 表示请求建立连接
时序(Timing / 同步)谁先发、谁后回?发多快?超时多久没收到算失败?A 先发 0x01 数据,B 收到后回 0x02;A 等待超 500 ms 未收到则重传ARP 先广播请求再单播应答;TCP 超时重传与速率控制

课后巩固 · 练习 · 单选

两台电脑约定:“消息第 1 字节表示消息类型(0x01 为请求,0x02 为确认),第 2–3 字节表示载荷长度,发送方发出请求后若 500 ms 未收到确认则重传。”其中“0x01 代表请求、0x02 代表确认”属于协议三要素中的哪一项?

4. 从简单约定到网络分层封装 ​

在真实网络里,两台电脑之间往往隔着交换机、路由器甚至整个互联网。如果把“物理信号怎么发、局域网怎么找邻居、跨网段怎么选路、丢包怎么重传”全都塞进同一个巨大的首部里,任何一处硬件升级(比如从铜线换成 Wi-Fi)都会迫使所有软件重写。

因此,计算机网络采用了**分层(Layering)**思想:每一层只解决一类问题,并在自己的首部里写下本层需要的信息:

  1. 应用层准备好要传的数据(如 A)。
  2. 传输层加上传输层首部(Header)(标明交给电脑上的哪个程序、编上序号)。
  3. 网络层加上 IP 首部(标明最终发往哪台电脑的 IP 地址)。
  4. 数据链路层加上以太网帧头和帧尾(标明当前这一段网线交给哪块网卡,并附上差错校验码)。
  5. 物理层把整串比特流转换成电信号、光脉冲或无线电波送上介质。

课后巩固 · 练习 · 单选

在分层网络模型中,应用层数据向下传递时被依次加上各层控制信息(如地址、长度、校验码),这一过程被称为什么?

5. 阶段 0 总结与下一步 ​

恭喜你完成了**阶段 0(计算机与数据基础)**的全部三课!现在你可以不看提示,完整复述一次发送端的故事:

  1. 字符与二进制(第 1 课):字母 A 按 ASCII 规则映射为十进制 65,写成 8 位二进制是一个字节(Byte) 01000001。
  2. 进程与操作系统(第 2 课):聊天进程通过系统调用把 01000001 交给操作系统内核缓冲区,网卡驱动程序利用 直接内存访问(DMA) 让网卡从内存取走数据。
  3. 协议与封装(第 3 课):通信双方遵守共同的协议(语法、语义、时序),通过逐层封装加上控制首部(Header),让接收端能够准确识别边界、理解含义并按序还原数据。

从下一课(第 4 课 · 信号、波形、噪声与编码)开始,我们正式进入阶段 1 · 物理层:当 01000001 变成电信号冲进几十米长的网线后,信号为什么会变弱、变形?接收端网卡怎样在噪声干扰中找准时钟,把 0 和 1 毫发无损地认出来?