一串「0」和「1」是如何在网线里奔跑的?



这个问题让我仿佛看到自己年轻时候的影子,所以我想郑重地回答这个问题。

时间追溯到 2001 年,做硬件的组长和我一起调试数字地图系统,控制系统与数字地图系统用一根电缆相连接,控制系统负责发送指令,地图系统负责接收指令,并根据指令的具体内容“放大、缩小、Zoom、加载航线、去除航线”等等,做具体的动作。

比如放大的指令代码“0x85”,发出去之后,数字地图就会放大地图,有时放大指令发送了,可地图系统却没有动静,这时就需要排查了,最有效的排查工具就是组长的“示波器”,示波器的探针连在电路板接收、发送引脚,就会清晰地看到波形,组长把波形用二进制写下来:“10000101”,然后对我说,看来你的指令发送出来了,指令是十六进制的“0x85”,看来是地图系统没有处理,接下来进一步排查不表。

看组长娴熟的排查手法,内心充满着很多好奇,整天跟在组长屁股后头,看他怎么解决问题的。那时恰好在学 OSI 参考模型,我就问组长,

第一个问题:组长,为何我的指令数据“0x85”在线路上裸奔,没有一点数据链路层的协议头?

组长说:因为是点对点连接,这边发,对方接,无需华而不实的头部,对方接收到指令之后,只要明白指令的具体含义就 OK!这样实现起来简单明了。

第二个问题:组长,那如果我发送指令数据很快,会不会造成指令信号的重叠,相互干扰?

组长:我们使用的 RS-232 串行接口,默认有一个发送速率,9.6Kbps,两端需要速率匹配才能正常工作,假如这里两端都是 9.6Kbps,如果发送端的程序,比如这里的控制系统想发 15Kbps 的数据,可以把这个 RS-232 接口模块看成一个小蓄水池,一根进水管,流入速率 15Kbps,一根出水管,流出最大速率 9.6Kbps,很显然有 5.4Kbps 的水不能及时排出,留在蓄水池里(硬件缓冲内存),但这个蓄水池很小,总有盛满的时候,如果进水管不停、或者降速,则多余的水会溢出蓄水池!(数据丢弃)

所以控制系统最终能发多快的数据,最终是由硬件的发送速率限制的,硬件在发送数据时,信号与信号之间,是有间隔的,否则接收方无法分辨是一个信号、还是多个信号,既然有间隔,信号在线缆上的传输速率完全相同,所以不会造成信号重叠、干扰!

还要补充一点,发送方硬件即使知道有很多数据在排队发送,但是一秒钟能发多少位的数据是有上限的。

突然想到了高速公路的车流,高速公路入口涌入过多的汽车,高速公路的流速就会显著下降。可信号却不是这样的,只要信号发送到线路上,它的流速是恒定的,接近光速。通俗的话来说,要么不发,要发就是光速,网络的拥堵不是发生在出水管,而是发生在蓄水池!而高速公路因为没有蓄水池,只有依靠降低流速来容纳更多的车辆。

第三个问题:组长,访问美国的网站,数据在线路上,是不是也是 0、1 组成的大段的波形?这些波形之间是否也有间隙?我听到一个新名词:路由器,那路由器如何处理这些波形?使得这些 0、1 波形最终到达终点?

组长:是的,其实互联网上的原理和我们这个系统很相似,用户的数据是以一串的 0、1 二进制波形发送到线路上,这些波形之间是有间隙的,比如我们实验室的以太网上的波形(以太帧),帧与帧之间是有分隔的,这样接收方就可以将两个分隔的帧独立处理。

说到路由器,你最近不是在看网络的书的吗?路由器是用来帮用户 IP 包寻找目的地在哪里的!

比如上文路由器接到一个以太帧,经过路由器网卡处理,路由器就会看到一串 0、1 组成的字符串,如果这个字符串只是指令代码“0x85”,没有其他的了,那路由器如何知道这指令代码“0x85”是去往何处的呢?

这里如果在“0x85”前有地址信息,类似信封上的收件人地址一样的信息,路由器就不会懵逼了,路由器根据收件人地址,查询地址就可以发给更靠近目的地的下一跳路由器了,下一跳也是采用类似的办法,直到最终找到收件人,然后就可以将指令代码“0x85”转交给收件人!

用来容纳收件人地址的就是 IP 头,收件人地址对应的就是目的 IP 地址,那就是如下方式:IP + “0x85”

看出来了没有,有了这个 IP 头,假设目的 IP= “8.8.8.8”,我们就可以将这个指令代码,跨国太平洋光缆发往美国。如果愿意,可以将目的 IP 修改成任何公网 IP 地址,可以将指令代码“0x85”发到互联网世界上的任何一个角落。

而没有这个神奇的 IP 头,我们只能将指令代码“0x85”在两台物理直连的设备之间传输,物理局限性太大。

补充一点,不要忘记,IP 是 Internet Protocol 的缩写,IP 使得互联网成为可能。

车小胖望着组长儒雅而淡然的面孔,内心有一个想法,如果有一天有人问我同样的问题,我会把组长的答案原封不动地分享给他!

(知乎日報)

[4789817]

Facebook Comments