Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

尝试连接两台计算机

复习

  • 用户、权限与访问控制:操作系统怎样判断谁能读文件、操作进程和使用设备
  • 隔离的边界:虚拟机与容器:虚拟机隔离的是一整台“机器”,每个虚拟机里有自己的操作系统内核
  • 操作系统总装:这一章不引入新概念,只让一个程序从磁盘完整跑起来

TL;DR

  • 两台计算机通信的最小目标,是让一端的 0 和 1 在另一端被可靠区分
  • 一根线只解决“能传过去”,还没有解决“传的是什么、给谁、怎样跨越更多机器”
  • 网络不是突然出现的云,它先是一段物理信号和一组共同约定

正文

  到这里,我们已经把一台计算机从逻辑门一直造到了操作系统。它可以管理自己的程序、内存和设备,但它始终是一座孤岛——没有和任何别的机器说过话。

  这一章,我们要做的第一件事很简单:把两台已经启动的计算机,用一根导线连起来。

先让电压承载比特

  最朴素的约定是:一段时间内用较高的电压代表 1,较低电压代表 0。左边依次改变电压,右边在相同的时间点观察电压,两边就有机会交换比特。

  这已经是通信了。发送方改变物理状态,接收方测量物理状态——比特就这样从一个盒子“流”到了另一个盒子。听起来是不是有点眼熟?这和我们前面用高低电平表示 0、1 是同一个思路,只不过这次信号要走出机箱,经过一段线缆。

但“能传”还不等于“传对”

  别急着说大功告成。接收方要在正确的时刻测量,可它的时钟和发送方未必完全同步;电压会因线太长、干扰太多而变形,本来该读成 1 的,可能被读成 0;两边还得知道一串比特从哪里开始、到哪里结束,否则连续的 0 和 1 只是没头没尾的流水。

  所以,“把 0 和 1 送过去”只是万里长征的第一步。真正要解决的,是一连串问题:用什么东西承载信号?怎样在噪声中尽量不出错?怎样把一长串比特切成一段段消息?交给谁?又怎样跨越不止两台机器?

  别担心,我们不一次性解决它们,而是一层一层来。下一章,先看看比特可以借哪些东西旅行,而不是急着给它套上复杂的协议。

思考题 1

为什么仅约定“高电压是 1、低电压是 0”还不能保证通信成功?

思考题 2

两台计算机直接相连,和一个人对着另一个人喊话,有哪些相似之处?又多了哪些麻烦?

小结

知识点

  • 通信首先要让物理状态承载并传递比特
  • 双方需要共同约定如何发送和观察这些状态
  • 同步、衰减、噪声与消息边界都是随之而来的问题

参考资料

  1. Wikipedia(zh):计算机网络:多台计算机互相通信的系统
  2. Wikipedia(zh):物理层:网络中最底层、负责传递原始比特的一层

思考题答案(仅供参考)

思考题 1

  双方还要同步测量的时刻,并共同应对衰减、噪声和“一段消息到哪儿结束”等问题。电压约定只解决了“用什么表示比特”,没解决“在何时、怎样可靠地读出比特”。

思考题 2

  相似之处在于,都要有发送方、接收方和一条传播的通道,也都怕“听不清”和“抢话”。麻烦则多得多:人可以在听不清时请求重复,机器却要先约定好在哪一刻采样;声音在空气中会衰减,电信号在线缆里同样会衰减,而且还要面对双方时钟不同步的问题。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪