有女朋友之后我终于知道了tcp为什么是三步握手

545 阅读4分钟

1. 前言:交流的要素

正常人/物,有序,有回应。

2. 人与人之间建立交流

首先这不是哲学或者沟通学的博客,这是纯技术的博客,只是本次主题与人的关系实在太大,借此比喻太过于形象而让我不忍舍弃。

人与人的交流建立在大家有相同的语言含义,比如话语,文字,肢体语言等。

有以下场景:

我和我女朋友一起逛街,她在给我挑衣服,我在看她给我挑衣服,那认真的样子让我嘴角弧度渐起,脑子里想着以后的孩子叫什么(虽然想了很多遍但是每次都有新创意)。(0)

突然,她说:“这件衣服你看怎么样?来试试。”(1)

我听到她说话反应过来,露出一脸傻笑的说:“好啊。”(2)

她点点头,把衣服递给我说:“快去换出来让我康康。”(3)

以上就是一次沟通的过程,目的是女朋友让我去换新衣服让她康康,其中(0)是前置条件,表明人是正常人。好了话不多说开始分析。

(1)女朋友和我说话,表明她有事。

(2)我听到女朋友的话,反应过来,表达出我很在意她,我在听她说话,(露出傻笑,顺着她的话说了一句)

(3)她很满意我的表现(点点头),把衣服递过来叫我去换,同时调戏我(让我康康)。

好,重点来了: 沟通的重点是,事事对应。上面的场景中我和女朋友是通过 讲话表情眼睛动作 这些 确认机制 来完成的,那对于只有二进制的计算机硬件如何完成呢?往后看。

tcp交流

假如我和我女朋友现在只是两个计算机硬件,只能通过tcp连接来交流了(伤心了),那她现在是这样和我建立上述场景的交流的:

1.她发起一个建立连接的请求,syn 字段(表示她要和我说话了)+ seq 字段(表达了她的心情,可能的话题等等因素)。

2.我收到这个连接请求,我要是以前就露出一个傻笑,然而现在不行,我只能回复一个)ack 字段 + seq 字段(表明我听到这个消息我的反应倾向)。

3.她收到了之后就对我的表现打了个评价(这里表明已经收到)ack 字段 + seq 字段(话题方向)+ data(具体内容)一起发给我。

这就还原了第一个场景的过程(抽象)

那现在我们来思考,为什么必须要三步,她其实可以直接和我说她怎么怎么了,对吧?但是,(此处应有柯南BGM),但是,女朋友在第一句话开始就观察你的反应了,所以其实还是三步:

1.她表达 2.我接收并反应 3.她收到我的反馈并决定下一句说些什么。

三步的必要性

好吧,有些人还是要倔强说不用三步,一步到胃不可以总可以两步吧。

那我就说说三次握手的必要性吧(末尾点题很合理吧?)

现实生活中:

假如女朋友不对我第二步做出的反应,继续我行我素,说话不考虑我的感受,我会难受,我会伤心,然后离家出走,~~~网吧包夜~~~,很危险。

网络世界:

第一种情况:假如女朋友对我的 ack 视而不见,我就会担心她的安全问题。(因为只有 ack 确认机制)为了保护我和她的小秘密,我拒绝和任何冒充她的人交流。

第二种情况:假如女朋友第一次发的 segment 超时了,她就继续发,此时有两个请求同时发过来了,我该响应谁?是不是要响应第二个,是吧。那我如何保证呢?我保证不了,我只能通过第三步,发出 segment 问她( ack ),她现在要和我建立哪个连接,这样我们的沟通才能进行下去。

由此看来,不论是现实还是网络世界,第三步(让女朋友知道我接收到了她想要表达的意思)很重要。

最后,附一下技术表达

client 为主动方,server 为被动方(一般情况)

  1. clientserver 发出 syn=1 + seqClient 此时 server 正在监听
  1. serverclient 发出 Ack=1 + syn=1 + seqServer + ack=seqClient+1
  1. clientserver 发出 Ack=1 + seqClien++ + ack=seqServer+1 + data

syn 表明建立连接,seqClient 是初始随机数 Ack 表明建立连接的请求收到了 返回 syn 表明我也建连接了 ack 是对 clientseqClient 做确认收到,表示 client 可以发下一个了,seqServer 表明这是 server 的初始随机数 Ack 表示 server 的连接请求 client 也收到了,seqClien++ 表明这个是上一条的后续,ack=seqServer+1 表明上一条 server 的消息我也收到了,data是具体内容,建立连接就是为了发这个东西。

本文依然这是通过场景来理解协议。