前言:本文主要想说一下TCP的知识, 比喻有不恰当之处,敬请包涵。

 

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

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

城门口的大棚里乱哄哄的,是一群人围在一起赌钱, 这些家伙都穿着同样的衣服, 前胸和后背写着三个大字 “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网络的。

大明天启年间,明熹宗朱由校醉心于木工,重用宦官魏忠贤,不上朝已经很久了。
内阁首辅叶大人忧心忡忡,大明各地民不聊生,大片田地荒芜,强盗、野兽横行。之前修建的官道也基本废弃了,不但收不到各地送来的奏报, 自己昨天好不容易摆脱魏忠贤,面见了一次皇上,但是请求颁发的一道圣旨竟然无法送到各个府县,送信的邮差都被半路抢劫了,或者失踪了!
叶首辅决定召开一次内阁会议,研究下怎么建立一个可靠的、稳定的、通畅的上情下达机制。

虚电路(Virtual Circuit)

首先来看一下“360百科(虚电路)”给出的解释:虚电路是分组交换的两种传输方式中的一种。在通信和网络中,虚电路是由分组交换通信所提供的面向连接的通信服务。在两个节点或应用进程之间建立起一个逻辑上的连接或虚电路后,就可以再两个节点之间一次发送每一个分组,接收端收到分组的顺序必然与发送端的发送顺序一致,因此接收端无须负责在收集分组后重新进行排序。虚电路协议向高层协议隐藏了将数据分割成段、包或帧的过程。

虚电路是建立一条逻辑连接,发送方和接收方不需要预先建立连接。

好了,下面继续原文。

前来开会的大人们听了叶首辅说的情况,立刻都是愁眉苦脸的,面对这么一个艰巨的挑战,没人愿意开口,都是在不住的叹气摇头。
过了一炷香功夫,韩大人看到首辅不断的给自己使眼色,只好开口了: “各位大人,我有个不成熟的想法,说出来大家评判一下。现在主要的问题是强盗横行、野兽出没。我想我们可以派出我们的大军,沿路站岗,五步一岗,三部一哨, 给官道建立一个可靠的保障。”
朱大人道:“韩大人此法差矣!我大明这么多官道,大军再多也不够用啊。”
韩大人笑道: “朱大人,看来你没明白,我的意思不是把所有的官道都布上岗哨, 而是说我们要建立一个连接通道!”
“连接?什么连接? ” 朱大人说 ,“没听说过”。

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

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

“这样的话在一次通信中都可以走这个安全的通道,很宽敞、很可靠。但是代价也很高,为了通信一次,得动用这么多士兵,还得和中间节点协商。” 朱大人也学会了抽象,造出了”中间节点“这样的新词儿。
韩大人道:“嗯, 还有一点就是如果通道暂时不发信件的话,就闲置浪费了。”

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

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

虚电路的特点

关于“虚电路”,从上面可以总结出其如下特点:

虚电路通信与电路交换类似,两者都是面向连接的,即数据按照正确的顺序发送,并且在连接建立阶段都需要额外开销。但是,电路交换提供稳定的比特率和延迟时间,而虚电路服务的比特率和延迟时间要取决于以下因素:

1.网络节点上包队列的长度,

2.应用程序产生数据的比特率,

3.使用统计多路复用技术时,共享同一网络资源的其他用户的负荷。

4.许多虚电路协议通过数据重传,包括检错纠错和自动重传请求(ARQ),提供可靠的通信服务。

虚电路是在分组交换散列网络上的两个或多个端点站点间的链路。它为两个端点间提供临时或专用面向连接的会话。它的固有特点是,有一条通过多路径网络的预定路径。提前定义好一条路径,可以改进性能,并且消除了帧和分组对头的需求,从而增加了吞吐率。从技术上看,可以通过分组交换网络的物理路径进行改变,以避免拥挤和失效线路,但是两个端系统要保持一条连接,并根据需要改变路径描述。

分组交换

先看一下摘选自“360百科(分组交换)”上的解释:

在通信过程中,通信双方以分组为单位、使用存储-转发机制实现数据交互的通信方式,被称为分组交换(PS:packet switching)。

分组交换也称为包交换,它将用户通信的数据划分成多个更小的等长数据段,在每个数据段的前面加上必要的控制信息作为数据段的首部,每个带有首部的数据段就构成了一个分组。首部指明了该分组发送的地址,当交换机收到分组之后,将根据首部中的地址信息将分组转发到目的地,这个过程就是分组交换。能够进行分组交换的通信网被称为分组交换网。

分组交换网一般由分组交换机、网络管理中心、远程集中器、分组装拆设备、分组终端/非分组终端和传输线路等基本设备组成。

分组交换的本质就是存储转发,它将所接受的分组暂时存储下来,在目的方向路由上排队,当它可以发送信息时,再将信息发送到相应的路由上,完成转发。其存储转发的过程就是分组交换的过程

分组交换的思想来源于报文交换,报文交换也称为存储转发交换,它们交换过程的本质都是存储转发,所不同的是分组交换的最小信息单位是分组,而报文交换则是一个个报文。由于以较小的分组为单位进行传输和交换,所以分组交换比报文交换快。报文交换主要应用于公用电报网中。

分组由分组头和其后的用户数据部分组成,分组头包含接收地址和控制信息,其长度为3-10B,用户数据部分长度是固定的,平均为128B,最长不超过256B。分组交换路由选择确定了输出端口和下一个节点后,必须使用交换技术将分组从输入端口传送到输出端口,实现输送比特通过网络节点。

好,下面继续正文:

“虚电路”运行了半年,终于勉强上情下达了。但是被魏忠贤得知,添油加醋的给皇帝朱由校说了很多坏话,木匠皇帝雷霆大怒,大骂内阁浪费国家人力物力,下令立即停止。
内阁恨透了魏忠贤,但是又不得不停止。
这一天皇上又没上早朝,大家愁眉苦脸的聚到一起商议。
礼部右侍郎孙承宗突然想起了一件事情:“我巡防边关的时候听说袁崇焕使用了一个奇怪的办法来传递军务物资,他不用军队在官道站岗,不用建立安全的连接通道,完全依靠马匹、骡子这样的牲畜进行通信。”
“怎么可能? 马匹不通人性,跑丢了怎么办?”
孙承宗道:“他这些马是训练过的,身上带着信件或者物资,可以在官道上走,每到一个驿站或者市镇,里边的衙役看看信件的目的地,喂喂马,然后把马引到下一个官道就可以了。很省事! 当然具体到那个官道是衙役决定的,他会搜集各种消息,确定那个官道匪患少、虎狼少。”(码农翻身注:驿站类似路由器,需要构建路由表, 转发数据分组)
“这还解决不了问题,路上没官兵保护,马可能会把抢走,或者被虎豹吃掉,这样物资还是丢了。”
孙承宗道:“这一点袁崇焕他们也想到了,他们发明了一种叫失败重传的方法,如果收不到对方的确认回信,就会重新发送。”

“重新发送的代价太高了吧,毕竟是物资啊!”(在计算机中,物资是很廉价的数据分组)

“是这样,他们一般把一个大件的物资拆成小块,因为一匹马也拉不了多少,然后给每个小块变编号,哪个小块丢了,就只发送那个编号的。袁崇焕说他们有个叫‘幻月宝镜’的东西,丢了的东西可以从中再取出来!”
“这真是个宝贝啊, 一般人怎么可能有啊。”
叶首辅道:“不过这倒是一个有意思的思路,不需要事先建立真正的连接通道,每个编号小块走的路可能也不一样,完全由中间节点的衙役们来决定马匹的下一个路径是哪一个。”
(码农翻身注: 这叫做分组交换)
孙承宗补充道:”叶大人看的很透彻,不仅路径不同,这些小块也可能不按次序(失序)到达。他用这种方法其实是说中间节点并不承诺提供可靠的连接通道,物资完全可能失序、重复、甚至丢失。所谓可靠的传输完全由两个端点(例如京城和开封府)来实现。

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

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

分组交换的特点

补充知识,从上面的形象案例总结一下分组交换的特点,如下:

1、线路利用率高:分组交换以虚电路的形式进行信道的多路复用,实现资源共享,可在一条物理线路上提供多条逻辑信道,极大地提高线路的利用率。使传输费用明显下降。

 

2、不同种类的终端可以相互通信:分组网以X.25协议向用户提供标准接口,数据以分组为单位在网络内存储转发,使不同速率终端,不同协议的设备经网络提供的协议变换功能后实现互相通信。

3、信息传输可靠性高:在网络中每个分组进行传输时,在节点交换机之间采用差错校验与重发的功能,因而在网中传送的误码率大大降低。而且在网内发生故障时,网络中的路由机制会使分组自动地选择一条新的路由避开故障点,不会造成通信中断。

4、分组多路通信:由于每个分组都包含有控制信息,所以分组型终端可以同时与多个用户终端进行通信,可把同一信息发送到不同用户。

5、计费与传输距离无关:网络计费按时长、信息量计费,与传输距离无关,特别适合那些非实时性,而通信量不大的用户。

 (END)

 补充知识

除了虚电路、分组交换技术,还有电路交换和报文交换。

电路交换

电路交换就是计算机终端之间通信时,一方发起呼叫,独占一条物理线路。当交换机完成接续,对方收到发起端的信号,双方即可进行通信(主要应用于电话通信网中)。在整个通信过程中双方一直占用该电路。它的特点是实时性强,时延小,交换设备成本较低。但同时也带来线路利用率低,电路接续时间长,通信效率低,不同类型终端用户不能通信等缺点。电路交换比较适用于信息量大、长报文,经常使用的固定用户之间的通信。

报文交换

将用户的报文存储在交换机的存储器中。当所需要的输出电路空闲时,再将该报文发向接收交换机或终端,它以"存储-转发"方式在网内传输数据。报文交换的优点是中继电路利用率高,可以多个用户同时在一条线路上传送,可实现不同速率、不同规程的终端间互通。但它的缺点也是显而易见的。以报文为单位进行存储转发,网络传输时延大,且占用大量的交换机内存和外存,不能满足对实时性要求高的用户。报文交换适用于传输的报文较短、实时性要求较低的网络用户之间的通信,如公用电报网。电子邮件系统(E-mail)也适合采用报文交换方式。

 

本文续《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》)