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
为被动方(一般情况)
client
向server
发出syn=1
+seqClient
此时server
正在监听
server
向client
发出Ack=1
+syn=1
+seqServer
+ack=seqClient+1
client
向server
发出Ack=1
+seqClien++
+ack=seqServer+1
+data
syn
表明建立连接,seqClient
是初始随机数Ack
表明建立连接的请求收到了 返回syn
表明我也建连接了ack
是对client
的seqClient
做确认收到,表示client
可以发下一个了,seqServer
表明这是server
的初始随机数Ack
表示server
的连接请求client
也收到了,seqClien++
表明这个是上一条的后续,ack=seqServer+1
表明上一条server
的消息我也收到了,data
是具体内容,建立连接就是为了发这个东西。
本文依然这是通过场景来理解协议。