认知逻辑与TCP

共有知识 和 公共知识

本文要引入一些逻辑学上关于认知的概念,以便更清晰地认识**“可靠”**的含义。

参考这篇帖子:红眼睛自杀问题 和其引用的两篇 wiki,我们可以有这样一些概念:

  • 知识(knowledge):一种信息实体,可以被主体认知
  • 主体(agent):可进行认知行为的对象,如人或者主机
  • 认知(know):主体获得知识的状态

这三个概念如果用关系型数据库来描述,就是一张 “知识” 表,一张 “主体” 表,和一张 “主体-知识” 关系表。关系表有两列:分别指向主体和知识的外键(将此关系命名为 X)。

当一条知识被一组主体认知的时候,我们就说这条知识是这组主体的共有知识(mutual knowledge)

然后问题升级:高阶知识出现了。即一个主体对一条知识的认知——这样一件事也被认为是一条可以被认知的对象,称为二阶知识,且二阶知识本身也可以被认知,称为三阶知识。。。用数据库来描述就是:关系表增加了一列——指向自己的外键(将此类关系命名为Y)。

公共知识(commom knowledge) 就是这样一种知识:首先它是一组主体的共有知识,然后这组主体内的每个主体都知道彼此拥有这条知识,也知道其他主体都知道自己知道其他主体拥有这条知识,。。。无穷嵌套。即每个主体都拥有对该知识的无穷阶知识。

用数据库来描述就是:在关系表中,存在一组主体 a1, a2, ..., an 和 一条知识 p 的关系 x1, x2, ..., xn,还存在这组主体和这组一阶关系的关系,y1, y2, ..., yn,还存在这组主体和这组二阶关系的关系, y11, y12, ..., ynn-1,无穷嵌套,数据库爆了。。。 :D

两军问题

两军问题本质上就是一个试图在不可靠链路上达成公共知识的问题。其结果是:无解。

由于两位将军的心思过于细腻,对于一起发动攻击的时机这条知识,他们都要求其成为公共知识后才肯执行。而又因为线路的不可靠,使他们只能依赖确认消息来生成高阶知识,那么对于公共知识这个无穷阶需求,显然是无法满足的。

TCP 的问题

TCP 的可靠比特流需求比两军问题的目标简单(必须简单,不然无解),它是要达成一个二阶知识

在我们的 TCP 问题中,一段数据可以看成是一条知识,需要传输这段数据的两台主机(甲和乙)可以看成两个主体。初始状态下甲拥有对数据的认知,它的任务是:

  1. 把数据传递给乙,即让乙也拥有对数据的认知
  2. 传递过程要可靠,即甲需要知道“乙成功接收这段数据”这样一条二阶知识

需要注意的是事情到此为止,即不需要 “乙知道甲知道乙成功接收数据” 这样一条三阶知识。

而二阶知识的建立,在不可靠协议(IP)上是可能的。最直观的解决方案是使用到达回执。即发送端可以给段(知识)编一个序号,然后接收端有义务在成功接收时将序号告诉发送端。如果在一定时间内没有收到确认,发送端就重发,这样一直坚持到收到确认(二阶知识达成)或者放弃(向上层报告失败)。这个过程很像电子邮件的“已读回执”或者钉钉的“已读”确认。

因此在 TCP 中,段可以分两种,一种是需要确认的段,一种是不需要确认的段。需要确认的段包含的都是一阶知识,不需要确认的段包含的都是二阶知识。

另一些现实问题

然而实际情况下还有第二个问题,就是 TCP 的载荷——“字节流”允许的长度是无限的,而 IP 包的最大载荷是有限的,这就导致在一次 TCP 传输任务中(极有)可能需要使用多个段。而又因为字节流本身具有有序的性质,为了确保一阶知识的正确达成,这些段在接收端组合时也必须保持原始的顺序。

该问题的最简单解决办法是为 IP 包在网络中的存活时间设置上限,假设为 t。发送端每发送一个段后,要么收到确认,要么等待 2t 的时间后再发送下一个段。这样便可保证段到达的顺序和发送时是一样的。但是显然这种方法的传输速率太低,无法应用。

第二种直观的方法,我们给每个段分配一个不重复的序号,然后使用一个额外的段来排序这些序号。这样我们就可以一股脑发送一堆段,然后等待所有确认。更进一步的,排序段甚至可以被省略掉,只需要我们的序号本身有序且连续即可。

在解决了顺序问题后,很讨厌的还有第三个现实问题。题外话:我感觉编程这件事并不是一个“纯软件”或者“纯逻辑”的工程,它时时处处被硬件限制着。操作系统、数据库、通讯协议栈被设计成现在的样子都是软件适配硬件产生的结果,它们设计的合理性都依赖现实硬件的设计。比如很难说量子通讯发展以后当下的分布式系统设计不会发生质的改变。

假设我们希望维护一条 TCP 连接时只占用常量内存空间的话,就意味着我们只能保留固定数量的序号记录,我们暂且将其称为序号空间。可以想见,每当序号空间中的某个序号被确认后我们就可以将之删除,并加入下一个新的序号,通常这种手段被称为滑动窗口(sliding window)

转载于:https://my.oschina.net/lionets/blog/1114065

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值