TCP/IP 之 大明王朝邮差
TCP/IP之大明内阁
TCP/IP之蓟辽督师

大明王朝天启四年, 清晨。

天色刚蒙蒙亮,我就赶着装满货物的马车来到了南城门, 这里是集中处理货物的地方 , 一队一队的马车都来到这里, 城头的士兵带着头盔,身披盔甲, 手持长枪, 虎视眈眈的注视这下面的动静。

城门口的大棚里乱哄哄的,是一群人围在一起赌钱, 这些家伙都穿着同样的衣服, 前胸和后背写着三个大字 “TCP邮差”

我知道这就是我要找的人, 他们会帮我把货物发出去。

我下了车,在大棚里四处查看, 找到一个无聊的坐着独自喝闷酒的小伙子。

“邮差小哥 ,帮我把这车货发了呗”

小伙子懒洋洋的站起来说: “你从哪儿来,要到哪儿而去啊?”

我赶紧拿出写好的地址说: ”我住在咱们城里北拐街224号, 要发一车货物到内乡县衙“

“内乡县衙有很多门, 你的货进那个门啊?” 邮差小哥接着问。

“出发的时候老板给我说了, 发到80号门 。”

邮差小哥说: “走吧, 咱们到前面去。”

大棚的前面是一大批开阔地, 可能我们来的早 , 现在只有我,邮差小哥, 当然,还有我的马车。

“你等等, 我先给内乡县衙建立个连接 ”邮差说着, 吹了个口哨, 一匹马跑了过来。

他拿起毛笔在一张纸写了一封信:
“县衙县衙, 我是京城, 我想和你建立连接, 我的序号1024 , 收到请回话! ”

信封上写着:
发货地:京城北拐街224号
收货地:内乡县衙, 80号门

然后把这这个纸放到了马背上的褡裢里, 拍了拍马屁股: “快走吧。”

过了两个时辰, 那匹马回来了, 邮差掏出了马运回来的那封信, 上面写着:
“京城京城,收到了你的信, 你的信里边有个序号是1024,对不对? 同意建立咱们的连接, 我这边序号是2048”

邮差喜形于色 : “ 看看, 连接快要建立了, 我再给他们发一封信就行了”
”县衙县衙, 我收到你的确认信了, 也看到了你的序号是2048, 我开始发货了”

我问他: “这就是连接吗, 我没看见你扯一条线把京城和县衙连起来啊”

邮差说: “这你就不懂了吧,这就是TCP连接, 是虚拟的, 连接的状态信息并不会在路上保存; 相反, 连接的状态信息是在两端维持的, 也就是在我这里和县衙那里一起维持的。 ”

“那你们为啥要发三封信呢? ”

“这就是三次握手啊, 我给你分析一下啊, 这三次握手主要是为了验证我这边和县衙那边的发信/收信能力没问题, 这样就证明连接是通的, 可以正式发货了。”

第一次握手:京城发信,县衙收到了,此时县衙就会明白:京城发信能力和自己的收信能力是没问题的。

第二次握手:县衙发信,京城收到了,此时京城就会明白:京城的发信和收信都是好的, 县衙的发信和收信也都是没问题的。 要不然收不到县衙的回信 , 但是县衙还不知道自己的发信功能如何?所以需要第三次握手:

第三次握手:京城发信,县衙收到了,此时京城已经确认,双发的收信,发信都是没问题的, 这次回应的目的只是消除县衙对自己的发信功能和京城的收信功能的担忧而已。

说实在的, 我有点晕, 邮差小哥说 : “你多琢磨琢磨就明白了。”

我问他: “你这么辛苦的建立连接, 难道不亲自去送货吗?”

邮差说:“ 我才不去呢! 本朝新皇登基以来,整天像木匠一样做木工,不理朝政, 导致民不聊生, 大片田地荒芜, 强盗,野兽横行, 早就没有人敢冒着风险去送货了。所以内阁的那帮大臣们就想了个招,修建四通八达的官道, 让马,驴这些牲畜去送货, 即使被老虎吃掉也没啥损失, 天朝还是挺以人为本的。”

“那这些马怎么知道把我的货送的内乡县衙啊”

“不用担心, 它们都是训练过的, 会沿着官道走,在每一个每个岔路口朝廷都会修建一个驿站, 马累了可以吃草喝水休息, 更关键的是,每个驿站的衙役会看看我刚才写的信 ,他们知道路, 然后把马领到一个新的正确的官道,继续走, 最终就能到内乡县衙。 对了, 大家给这些驿站起来个别名:路由器”

“万一马跑丢了, 或者被老虎吃掉,到不了,或者回不来怎么办?”

“那就是我们TCP邮差要干的事儿了, 你马上就会看到, 我来看看你的货, 哎啊, 你这个柜子太大了, 一匹马驮不走, 得分成小包裹, 一个一个运”

我没办法, 只好把一件大货物拆开, 分成小包裹。

“ 给每个包裹编个号吧” 邮差说到。 “这样到了内乡县衙他们就能组装起来,原样恢复了”

我突然想到一个严重问题:“万一马被强盗抢走了。我这个柜子的一条腿岂不就丢了 ”

邮差见怪不怪: “没办法, 内阁的大人们说了, 这种情况, 就重新发送那一个包裹。”

擦, 我心头有一万头羊驼跑过: 这帮大人们真是站着说话不腰疼啊, 万一柜子的腿儿丢了, 我还得重做啊。

邮差把包裹按编号摆成一列, 1, 2, 3, … 10 ,一共10个包裹。

“按规定我们每次最多发3个包裹,按序号发, 先发 1, 2, 3号包裹” 邮差说着叫来3匹马, 装上货,马一溜烟的跑掉了。

我在那里提心吊胆的等着,生怕一个包裹丢了。

可是怎么知道包裹是不是到了县衙了呢。

邮差似乎看出了我的心思, 从怀里掏出一个沙漏说: 如果漏完了, 县衙还没给咱们确认, 那就是丢了, 只有重发了。

过了一个时辰, 我期盼的县衙的马终于来了, 里边的信里说: 1号包裹收到了。

“好了” 邮差说, “县衙确认收到了 1号包裹, 咱们可以再发一个了”, 说着叫来一匹马, 把第4号包裹发了出去。

我现在有点理解了, 邮差的做法是每次只保证有3个包裹发出去并且没有确认

又过了一会, 县衙一下子来了3匹马, 带来了2,3,4号包裹的确认。

邮差说: " 看来你的运气还不错, 我在把5,6,7 号发出去“ 说着他把沙漏掉了个个, 重新开始计时。

5号包裹的确认很快来了, 邮差又把8号发了出去, 这样已经发送但是没有确认的包裹还是三个。

现在6,7,8号包裹都发出去了, 可是6号包裹的确认迟迟不来, 我心急如焚。
正在此时, 沙漏漏完了, 我不安的向邮差看去。

他倒是满不在乎:“ 哎呀, 超时了,有可能是运送6号包裹的马被老虎吃了, 县衙没收到”

“那怎么办啊” 我焦急的问。

“我们只好从6号包裹开始重新发送了, 6号包裹恰好是柜子的一条腿儿, 回去给你老板说说, 再做做个柜子腿儿吧, 一定要保证和之前发出去的一模一样。”

我问他: “那7,8号包裹呢? 县衙收到没有?”

“我们现在还不知道,如果收到了, 他们会暂时存下来。 如果没收到, 那还得像6号包裹一样,继续重发。”

我的忍耐力到了极限, 真想跳起来揍邮差一顿。

冷静下来, 我想了想说:“不对,你为什么一下发了3个包裹, 你不能发一个等着确认一个吗? 我要告你去 。”

邮差说: “随便你了, 反正你是告不赢的, 这是内阁首辅大人确定的, 我们用的叫滑动窗口协议, 如果窗口N=1 , 即发一个等着确认一个, 那样就太慢了, 我这个邮差也不能一直被你占用, 我们把N的值设大一点, 例如N=3, 就是为了能够像流水线那样做事, 一边发包裹, 一边收确认, 这样快一点。”

没办法,只好回去找老板做柜子腿儿, 这耽误了很多时间。

邮差把6号包裹又发了出去, 再次重新计时。

6号包裹的确认还是没有收到! 7号的确认也没收到, 但是8号包裹的确认先收到了!

邮差说: “恩, 不错,6,7号的确认包裹估计是在路上丢了, 没关系, 只要县衙说收到了8号包裹, 暗含的意思就是 6, 7 号都收到了。 要不然他们不会发8号的确认。”

接下来就发9,10号包裹, 这次还行, 总算没丢, 终于把整个柜子全发出去了。

内乡县衙那边也把柜子给组装了起来。 我的任务总算完成了。

后来我得知, 县衙其实是收到了第6号包裹,只是他们的发给京城的确认包裹在路上给弄丢了, 我们没收到, 导致我们重新发了一份。

我算是明白了这所谓的TCP, 无非就是在那些不可靠马匹运输的基础上建立一个可靠的发送办法, 基本上就是失败重发, 受苦的还是我们这些底层老百姓。

我给邮差付了2两银子作为费用 , 拉着马车,头也不回的走了。

只听到邮差在后边喊:“ 欢迎再来, 内阁首辅正在研究新的协议呢, 下次一定要来试试啊。”

我没理他, 因为我再也不想来到这个鬼地方了!

本文是《TCP/IP之大明王朝邮差》的前传, 讲一讲大明内阁的各位大人是怎么设计TCP/IP网络的。
大明天启年间, 明熹宗朱由校醉心于木工, 重用宦官魏忠贤, 不上朝已经很久了。

内阁内阁首辅叶大人忧心忡忡, 大明各地民不聊生,大片田地荒芜, 强盗,野兽横行, 之前修建的官道也基本废弃了, 不但收不到各地送来的奏报, 自己昨天好不容易摆脱魏忠贤,面见了一次皇上, 但是请求颁发的一道圣旨竟然无法送到各个府县, 送信的邮差都被半路抢劫了,或者失踪了!

叶首辅决定召开一次内阁会议,研究下怎么建立一个可靠的,稳定的、通畅的上情下达机制。
虚电路
前来开会的大人们听了叶首辅说的情况, 立刻都是愁眉苦脸的, 面对这么一个艰巨的挑战, 没人愿意开口, 都是在不住的叹气摇头。

过了一炷香功夫, 韩大人看到首辅不断的给自己使眼色,只好开口了: “各位大人, 我有个不成熟的想法, 说出来大家评判一下。 现在主要的问题是强盗横行、野兽出没, 我想我们可以派出我们的大军, 沿路站岗, 五步一岗, 三部一哨, 给官道建立一个可靠的保障。 ”

朱大人道:“韩大人此法差矣! 我大明这么多官道, 大军再多也不够用啊。”

韩大人笑道: “朱大人, 看来你没明白, 我的意思不是把所有的官道都布上岗哨, 而是说我们要建立一个连接通道!”

“连接? 什么连接? ” 朱大人说 “没听说过”

“假如我们京城要和开封府通信, 中间会经过很多的市镇, 我们只需要派出一队官兵,把从京城到开封府的道路给保护好就可以了, 这样就不怕那些强盗虎豹, 等到双方通信一完,大军即可撤回, 去保护另外一个通信通道, 这就是用官兵建立一个连接!”

叶首辅道: ”韩大人说的有道理,至少能解决问题, 不过我们的主力大军都被派到东北对付努尔哈赤去了, 所以我们需要和沿途的市镇、驿站协商,主要让他们出兵, 和京城的大军一起建立安全的通道。“

“这样的话在一次通信中都可以走这个安全的通道, 很宽敞,很可靠, 但是代价也很高, 为了通信一次,得动用这么多士兵,还得和中间节点协商。 ” 朱大人也学会了抽象, 造出了”中间节点“这样的新词儿。

韩大人道:“嗯, 还有一点就是如果通道暂时不发信件的话, 就闲置浪费了。”

叶首辅道: “那也是没有办法的事情, 我们先这么试行一段时间吧。 ”

(码农翻身公众号注: 这就是所谓的虚电路, 绿色部分为连接通道, 所有的消息都从同一个通道上发送)

分组交换
“虚电路”运行了半年, 终于勉强上情下达了, 但是被魏忠贤得知,添油加醋的给皇帝朱由校说了很多坏话, 木匠皇帝雷霆大怒,大骂内阁浪费国家人力物力, 下令立即停止。

内阁恨透了魏忠贤, 但是又不得不停止。

这一天皇上又没上早朝, 大家愁眉苦脸的聚到一起商议。

礼部右侍郎孙承宗突然想起了一件事情:“我巡防边关的时候听说袁崇焕使用了一个奇怪的办法来传递军务物资, 他不用军队在官道站岗,不用建立安全的连接通道,完全依靠马匹、骡子这样的牲畜进行通信。”

“怎么可能? 马匹不通人性,跑丢了怎么办?”

孙承宗道:“他这些马是训练过的,身上带着信件或者物资, 可以在官道上走,每到一个驿站或者市镇,里边的衙役看看信件的目的地,喂喂马,然后把马引到下一个官道就可以了, 很省事。 当然具体到那个官道是衙役决定的, 他会搜集各种消息,确定那个官道匪患少、虎狼少。 ”

(码农翻身注:驿站类似路由器,需要构建路由表, 转发数据分组)

“这还解决不了问题, 路上没官兵保护, 马可能会把抢走,或者被虎豹吃掉, 这样物资还是丢了。”

孙承宗道: “这一点袁崇焕他们也想到了, 他们发明了一种叫失败重传的方法, 如果收不到对方的确认回信, 就会重新发送。 ”

“重新发送的代价太高了吧, 毕竟是物资啊!”

“是这样, 他们一般把一个大件的物资拆成小块, 因为一匹马也拉不了多少, 然后给每个小块变编号,哪个小块丢了, 就只发送那个编号的, 袁崇焕说他们有个叫‘幻月宝镜’的东西, 丢了的东西可以从中再取出来!”

“这真是个宝贝啊, 一般人怎么可能有啊。”

(插播寻人启事:感谢网友提供了幻月宝镜这个主意, 我忘记是谁了, 看到请和我联系。)

叶首辅道:“不过这倒是一个有意思的思路, 不需要事先建立真正的连接通道, 每个编号小块走的路可能也不一样, 完全由中间节点的衙役们来决定马匹的下一个路径是哪一个。 ”

(码农翻身注: 这叫做分组交换)

孙承宗补充道:”叶大人看的很透彻, 不仅路径不同, 这些小块也可能不按次序(失序)到达。 他用这种方法其实是说中间节点并不承诺提供可靠的连接通道, 物资完全可能失序、重复、甚至丢失。 所谓可靠的传输完全由两个端点(例如京城和开封府)来实现“

(码农翻身注: 京城午门给内乡县衙发了A1,A2, 京城德胜门给开封府发送B1,B2,B3, 图中显示分组的路径)

韩大人道: “首辅大人, 要不我们也试试?, 不过我们得想办法把幻月宝镜弄来。 ”

叶首辅道: “我们奏请皇上让袁崇焕进京述职, 让他把宝镜带来,这一次一定得让皇上支持,要不然还会中途夭折, 我马上进宫, 大家静候佳音吧。”

本文续《TCP/IP之大明内阁》, 不了解背景的同学可以先看看上一篇文章, 当然这篇也是《TCP/IP之大明邮差》的前传, 主要讲一讲可靠性传输的原理。
袁崇焕奉圣旨进京,也被迫带来了他的心肝宝贝幻月宝镜。

他一进京,顾上休息, 立刻就先去拜见曾经举荐提报自己的恩师孙承宗, 看到自己的爱将风尘仆仆的赶来,虽然心疼, 稍事寒暄过后,还是立刻问起了怎么用幻月宝镜实现可靠传输的问题。

袁崇焕道: “老师有所不知, 这幻月宝镜虽好,但是如果没有失败重传的方法,一切都是白搭。 关外的环境比关内更加恶劣, 除了强盗野兽,还有飘忽不定的清军骑兵,随时打劫你。 ”

“确实是实情, 老夫当年巡视辽东的时候也看到了, 那你发出去物资以后, 是不是要等待对方的回复确认啊?”

“老师说的对,这也是我们刚开始的设想, 请看这张状态图:”

“状态图是什么东西? 你自己弄的?”

“不, 这是荷兰红毛送红衣大炮的时候教我画的, 他们那边的人很擅长搞这种玩意, 说是‘科学’, 这张图的第一个状态是‘等待发送数据’, 然后发送分组数据进入了第二个状态‘等待反馈’, 此时如果对方发来了反馈说‘收到了’, 那就回到第一个状态, 否则, 重发之前的数据”

“荷兰红毛还是挺厉害的, 这是个描述系统的好方法啊,比纯用我们汉字好多了。 ”

“是的老师, 这个状态图的问题就是:如果对方发回的反馈损坏了改怎么办?”

孙承宗道:“有道理, 如果反馈损坏了, 发送方将无法理解接收方是否收到数据分组, 只好重新发送上一个分组, 但是从接收方来看, 没法区分这个分组是新的还是一次重传, 这就麻烦了。 ”

“所以我和满桂、祖大寿他们商量了下, 我们采用给数据编号的办法来解决这个问题, 第一次发送编号为A的, 然后就等待针对A的反馈, 如果反馈没法识别或者是没收到, 那就重新发送, 如果反馈是‘收到了’, 那就发送分组编号为B的数据。 ”

“有个关键问题, 那要是出现了反馈迟迟收不到怎么办, 你肯定不能无限制的等待吧? ”

“老师明鉴, 我们确实遇到了这个问题, 于是就搞了一个沙漏定时器, 针对上面的状态做了改进, 分组一发送就开始计时,如果超时就重新发送同一分组, 像这样:”

(点击看大图)

孙承宗道:”好复杂啊,老夫这脑子里全是四书五经, 这状态图让人头蒙啊。 “

师生二人正聊着, 下人通报首辅叶大人来了。

同样是老学究的叶首辅看到了袁崇焕画的西洋状态图, 大为吃惊,心想袁崇焕赢得宁远大捷和宁锦大捷,果然是与众不同。

经过袁崇焕连番讲解,叶首辅终于明白了这是怎么回事, 他捻着胡子思忖一下, 马上提出一个问题:“你每次发送一个分组都得等待, 多慢啊, 能不能连续发送?”

孙承宗和袁崇焕对视一眼, 心想果然姜还是老的辣。

袁崇焕道:“叶大人高瞻远瞩, 思虑缜密,属下佩服。 这个问题我们把我们困住了很久才想出一个办法, 这个方法约定,发送方可以连续的发送分组,但是有限制数量,例如只能连续发送4个, 我们称之为窗口, 发送窗口满了就不能发了,需要等待接收方的确认, 当确认来了以后才能继续发送, 向前移动窗口 。”

“这又是个什么图? ” 叶首辅问到。

“这也是红毛们教我的,可以称为交互图, 大人请看, 我们发送到分组4的时候, 窗口满了, 就停止发送, 只有等到分组1的确认(acknowledge, 简称ACK)来了以后,才继续发送下一个分组。”

孙承宗道: “我看到分组3在发送当中丢失了, 超时后重新发送, 可是接收端明明收到了分组4, 5, 6还要丢弃啊。 ”

袁崇焕道:“这个办法是满桂最先提出的, 他是一个粗人, 想出的方法也很粗暴, 非常依赖幻月宝镜, 把失败分组及其以后的全部重新发送, 的确浪费。”

(码农翻身注: 这叫做回退N步协议)

叶首辅道:“很明显, 你们得选择性的重传那些丢失的分组。”

“大人说的对, 请看这个图:”

“这个图中只发送丢失的分组3, 在接收端会暂时缓存分组4,5,6, 这样就省了很多事了”

(码农翻身注:这叫做选择性重传)

叶首辅一拍大腿道: “好 !应该不错了, 我们就用这种办法来建立大明的可靠传输网络吧“

接着他又郑重的补充到 : “ 二位要注意, 这些失败重传的方法,是我们三人的秘密, 绝不能让魏阉党知道, 要不然他又要去找皇上邀功请赏了。”

码农翻身讲网络2:TCP协议相关推荐

  1. 码农翻身讲网络3:从Socket编程到HTTP服务器

    小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?(HTTP请求) 原创: 老刘 码农翻身 1月2日 1前言 这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器 ...

  2. 码农翻身讲网络5:从Web安全到HTTPS

    浏览器:一个家族的奋斗 浏览器家族的安全反击战 黑客三兄弟 黑客三兄弟(续) 一个故事讲完https 深入浅出HTTPS工作原理 原创: 刘欣 码农翻身 2017-12-12 我是你们每天都要使用的浏 ...

  3. 码农翻身讲计算机基础:补码,程序编译与递归

    从1加到100:一道简单的数学题挑战下你的大脑 原创: 刘欣 码农翻身 2017-01-03 2017年的第一篇, 写给刚刚踏入计算机编程领域的小白吧. 所谓编程,就是把自然语言的需求翻译成计算机语言 ...

  4. 码农翻身讲计算机基础:并发,同步与信号量

    本文首发于我的个人公众号:程序员江湖 欢迎大家关注我的微信公众号:程序员江湖 努力成为最有影响力的程序员自媒体,专注于面试,职场,个人提升三大主题. 干货满满,不容错过. 那些烦人的同步和互斥问题 原 ...

  5. 《码农翻身》读后感---程序员的潜规则

    最近读了一本好书,<码农翻身>,推荐没读过的小伙伴可以读一下.前面通过小故事介绍计算机世界中的方方面面,特别的有意思. 作者在最后一章根据自己成为架构师路上点点滴滴的经验,给广大程序员提供 ...

  6. 码农翻身——JDBC的诞生

    随着 Oracle, Sybase, SQL Server ,DB2,  Mysql 等人陆陆续续住进数据库村, 这里呈现出一片兴旺发达的景象, 无数的程序在村里忙忙碌碌, 读写数据库,   实际上一 ...

  7. 学习《码农翻身》之精进

    学习<码农翻身>之精进 局部性原理 在一段时间内,整个程序的执行仅限于程序的某一部分,相应的,程序访问的存储空间也局限于某个内存区域. 时间局部性:如果程序中的某条指令一旦执行,则不久后该 ...

  8. 《码农翻身》之技术之路

    <码农翻身>读书笔记之技术之路 这是我的后端读书笔记系列文章的第四三篇,选取的是最近刚刚圈粉的知名博主刘欣创作的<码农翻身>.这篇文章只是最后一部分内容. 本文内容主要根据知名 ...

  9. 从抄书到开源之巅:章亦春的程序人生(转载自微信公众号 -- 码农翻身)

    2018-04-08 章亦春 码农翻身 国人主导的开源软件能建立世界级影响力的不多,章奕春的OpenResty是其中之一. 让人没有想到的是,他的程序人生是从抄书开始的...... 本文转载自公众号& ...

最新文章

  1. 用python写脚本筛选原创微博_基于python编写的微博应用
  2. 利用scrapy和MongoDB来开发一个爬虫
  3. pip安装时报错:以一种访问权限不允许的方式做了一个访问套接字的尝试
  4. 评价一个人,就是要看他把时间都花在哪了
  5. 大数据WEB阶段(十五)JavaEE三大核心技术之过滤器
  6. 企业需要的C++程序员
  7. c语言枚举常量,浅述C语言中枚举enum的用法
  8. c++ 编译代码时Link失败,无法关闭目标文件
  9. 学生信息管理系统(C语言)
  10. JSONObject.fromObject爆红,显示无fromObject方法
  11. JavaScript 动态生成表格 及删除表格
  12. 电磁场知识回顾——求解方法汇总
  13. JavaScript之深浅拷贝
  14. mysql远程主机强迫关闭了_HAProxy出现远程主机强迫关闭了一个现有的连接 的错误及解决...
  15. poj2315足球游戏
  16. C#入门4——税收计算
  17. php怎么设置段落之间的距离,html中P标签段落与CSS段落间距距离调整
  18. 计算机图形学:Mesh
  19. Transporter 上传iPA上架
  20. 如何批量创建文件夹?

热门文章

  1. OpenCV—画直角边的直线(粗线)
  2. Matlab:常见涡旋光束仿真
  3. MySQL表结构的管理
  4. 孙溟㠭凿印《猛击一掌》
  5. 软件测试之SDK开发(ios)——signal捕获
  6. 下一个汽车时代来临——诚迈科技赛道超车,布局“域控软件”
  7. java前端页面调用webservice_一个简单的Webservice的demo(中)_前端页面调用
  8. html中编辑广告位,广告位(banner)的可视化管理后台逻辑说明
  9. HDU 1208 Pascal‘s Travels
  10. 解决VM虚拟机导致硬盘灯常亮,很卡的问题