TCP/IP之蓟辽督师
真正的知识是深入浅出的,码农翻身” 公共号将苦涩难懂的计算机知识,用形象有趣的生活中实例呈现给我们,让我们更好地理解。
本文源地址:TCP/IP之蓟辽督师
本文续《TCP/IP之大明内阁》,不了解背景的同学可以先看看上一篇文章,当然这篇也是《TCP/IP之大明邮差》的前传,主要讲一讲可靠性传输的原理。
袁崇焕奉圣旨进京,也被迫带来了他的心肝宝贝幻月宝镜。
他一进京,顾不上休息,立刻就先去拜见曾经举荐提报自己的恩师孙承宗。孙承宗看到自己的爱将风尘仆仆的赶来,虽然心疼,稍事寒暄过后,还是立刻问起了怎么用幻月宝镜实现可靠传输的问题。
袁崇焕道:“老师有所不知,这幻月宝镜虽好,但是如果没有失败重传的方法,一切都是白搭。关外的环境比关内更加恶劣,除了强盗野兽,还有飘忽不定的清军骑兵,随时打劫你。”
“确实是实情,老夫当年巡视辽东的时候也看到了,那你发出去物资以后,是不是要等待对方的回复确认啊?”
“老师说的对,这也是我们刚开始的设想,请看这张状态图:”

“状态图是什么东西?你自己弄的?”
“不,这是荷兰红毛送红衣大炮的时候教我画的,他们那边的人很擅长搞这种玩意,说是‘科学’。这张图的第一个状态是‘等待发送数据’, 然后发送分组数据进入了第二个状态‘等待反馈’,此时如果对方发来了反馈说‘收到了’,那就回到第一个状态。否则,重发之前的数据。”
“荷兰红毛还是挺厉害的,这是个描述系统的好方法啊,比纯用我们汉字好多了。”
“是的老师,这个状态图的问题就是:如果对方发回的反馈损坏了该怎么办?”
孙承宗道:“有道理,如果反馈损坏了,发送方将无法理解接收方是否收到数据分组,只好重新发送上一个分组,但是从接收方来看,没法区分这个分组是新的还是一次重传,这就麻烦了。”
“所以我和满桂、祖大寿他们商量了下。我们采用给数据编号的办法来解决这个问题,第一次发送编号为A的,然后就等待针对A的反馈。如果反馈没法识别或者是没收到,那就重新发送;如果反馈是‘收到了’,那就发送分组编号为B的数据。”

“有个关键问题,那要是出现了反馈迟迟收不到怎么办,你肯定不能无限制的等待吧?”
“老师明鉴,我们确实遇到了这个问题,于是就搞了一个沙漏定时器,针对上面的状态做了改进。分组一发送就开始计时,如果超时就重新发送同一分组。像这样:”

孙承宗道:”好复杂啊,老夫这脑子里全是四书五经, 这状态图让人头蒙啊。 “
师生二人正聊着,下人通报首辅叶大人来了。
同样是老学究的叶首辅看到了袁崇焕画的西洋状态图,大为吃惊,心想袁崇焕赢得宁远大捷和宁锦大捷,果然是与众不同。
经过袁崇焕连番讲解,叶首辅终于明白了这是怎么回事。他捻着胡子思忖一下,马上提出一个问题:“你每次发送一个分组都得等待,多慢啊!能不能连续发送?”
孙承宗和袁崇焕对视一眼,心想果然姜还是老的辣。
袁崇焕道:“叶大人高瞻远瞩,思虑缜密,属下佩服。这个问题我们把我们困住了很久才想出一个办法,这个方法约定,发送方可以连续的发送分组,但是有限制数量。例如只能连续发送4个,我们称之为窗口,发送窗口满了就不能发了,需要等待接收方的确认。当确认来了以后才能继续发送,向前移动窗口。”

“这又是个什么图?” 叶首辅问到。
“这也是红毛们教我的,可以称为交互图,大人请看,我们发送到分组4的时候,窗口满了,就停止发送,只有等到分组1的确认(acknowledge, 简称ACK)来了以后,才继续发送下一个分组。”
孙承宗道:“我看到分组3在发送当中丢失了,超时后重新发送,可是接收端明明收到了分组4、5、6还要丢弃啊。”
袁崇焕道:“这个办法是满桂最先提出的,他是一个粗人,想出的方法也很粗暴,非常依赖幻月宝镜,把失败分组及其以后的全部重新发送,的确浪费。”---回退N步协议
叶首辅道:“很明显,你们得选择性的重传那些丢失的分组。”
“大人说的对,请看这个图:”

“这个图中只发送丢失的分组3,在接收端会暂时缓存分组4、5、6,这样就省了很多事了。”---选择性重传
叶首辅一拍大腿道:“好!应该不错了,我们就用这种办法来建立大明的可靠传输网络吧。”
接着他又郑重的补充到:“ 二位要注意,这些失败重传的方法,是我们三人的秘密,绝不能让魏阉党知道,要不然他又要去找皇上邀功请赏了。”
(码农翻身注:这只是可靠性传输的原则,实际的TCP协议要更复杂,需要考虑双向的全双工通信,想了解详情的可以看《TCP/IP详解 卷1》)
“码农翻身” 公共号 : 由工作15年的前IBM架构师创建,分享编程和职场的经验教训。
长按二维码, 关注码农翻身

TCP/IP之蓟辽督师的更多相关文章
- TCP/IP之蓟辽督师 转
原创: 刘欣 码农翻身 2016-11-07 本文续<TCP/IP之大明内阁>, 不了解背景的同学可以先看看上一篇文章, 当然这篇也是<TCP/IP之大明邮差>的前传, 主要讲 ...
- TCP/IP之大明内阁---协议的制定
个人感言:真正的知识是深入浅出的,码农翻身" 公共号将苦涩难懂的计算机知识,用形象有趣的生活中实例呈现给我们,让我们更好地理解.感谢"码农翻身" 公共号,感谢你们的成果, ...
- TCP/IP 之大明王朝邮差
本系列文章全部摘选自"码农翻身"公众号,仅供个人学习和分享之用.文章会给出原文的链接地址,希望不会涉及到版权问题. 个人感言:真正的知识是深入浅出的,码农翻身" 公共号将 ...
- WIZnet通过启动在线培训活动:计算机网络TCP/IP协议而事实上,现在的方法
为了给大家营造更好的学习环境.WIZnet特此举办第一期培训活动,由WIZnet一线project师为你分享最最前沿和有用的网络技术知识,帮你解答开发过程中的疑问.欢迎前来交流.名额有限(20名满), ...
- 牛客网Java刷题知识点之OSI七层参考模型 和 TCP/IP五层参考模型
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- TCP/IP协议 (图解+秒懂+史上最全)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 白话TCP/IP原理
TCP/IP(Transmission-Control-Protocol/Internet-Protocol),中文译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议 ...
- TCP/IP基础
TCP/IP 是用于因特网 (Internet) 的通信协议. 计算机通信协议是对那些计算机必须遵守以便彼此通信的规则的描述. 什么是 TCP/IP? TCP/IP 是供已连接因特网的计算机进行通信的 ...
- TCP/IP之TCP_NODELAY与TCP_CORK
TCP/IP之Nagle算法与40ms延迟提到了Nagle 算法.这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Nagl ...
随机推荐
- js中cookie的使用详细分析
JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...
- CNC Fanuc 设备数据采集
为了这个Fanuc(发那科)数控机床数据的采集也花费了不少精力,先是去供应商那里了解,基本都是代理商,没有技术支持. 在网上也有关于Fanuc的以太网Ethernet连接文档,那里面有说明,大概是开发 ...
- 存储过程procedure
存储过程(procedure) 修改mysql结束符 delimiter name procedure创建语法: create procedure p ...
- 结构体struct 与 联合union
1.C语言中的结构体 1.1 定义 结构体是由一系列相同或不同类型的变量组成的集合. struct 结构体名{ //struct为关键字,“结构体名”为用户定义的类型标识. ...
- 01.Bootstrap入门
Bootstrap介绍: Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加 ...
- html中空格转义字符
记录一下,空格的转义字符分为如下几种: 平时一般用的是 1. &160#;不断行的空白(1个字符宽度) 2. &8194#;半个空白(1个字符宽度) 3. &8195# ...
- JavaScript:彻底理解同步、异步和事件循环(Event Loop) (转)
原文出处:https://segmentfault.com/a/1190000004322358 一. 单线程 我们常说"JavaScript是单线程的". 所谓单线程,是指在JS ...
- ses_cations 值顺序
16个位置的字符所代表的操作依次如下: 1. ALTER 2. AUDIT 3.COMMENT 4.DELETE 5.GRANT 6.INDEX 7.INSERT 8.LOCK 9.RENAME 10 ...
- 利用swap技巧去除容器多余的容量
假设我们预先为容器添加了一部分元素,接着用clear将它们删除,容器内部分配的存储空间实际上不会减小,改变的只是能够访问的元素个数.如下所示: std::vector<int> vec; ...
- 利用微软AntiXss Library过滤输出字符,防止XSS攻击
假如项目在前期没有过滤客户提交的字符,那么可以在输出的时候,对输出的字符进行过滤,防止出现XSS跨域攻击. 原理简单:利用ASP.NET API的管道原理,在MessageHandlers中添加一个自 ...