zoukankan      html  css  js  c++  java
  • JAVA面试-计算机网络-TCP三次握手

    学习原因

    这个是面试的一个常问热点,所以务必要掌握。

    通俗示例

    小红是人事部门的员工,现在正在招收IT人员,小明看到招聘信息和待遇,感觉很适合自己,所以准备和小红发消息了解具体情况。而简历在本故事中代表最终要发送的数据。

    首先,小明发消息给小红,向她表示想要应聘公司的IT部门,想要投简历进一步交流了解。这是第一次信息交流,这个时候简历还没有投递,只是小明让小红知道他想要投简历应聘这个职位。这也是第一次握手的作用,用于客户端询问服务端是否可以进行交互。

    而小红看到了小明的信息后,就回消息和他说,可以啊,我们人数还没招满,我欢迎你投简历。这是第二次信息交流,是小红表示她有空,也有兴趣接收小明的简历。这也是第二次握手的作用,用于服务端向客户端表示可以接收信息。

    小明看到消息后,又回了小红信息说,谢谢你能给我机会去应聘这个职位,我现在简历准备好了,也做好发送简历的准备了,你现在开放一下邮箱,两分钟后就能接收到我的简历了。这是第三次信息交互,为了小红知道小明已经做好发送简历准备,并让小红开放接收简历的渠道,让简历能顺利接收。这也是第三次握手的作用,让服务端知道客户端已经做好发送信息准备,并让服务端开放信息接收,从而完成三次握手。

    小红看到消息后,打开了邮箱接收功能,过了一会,就接收到了小明的简历了。

    以上就是三次握手的通俗表达,第一次小明询问是否还招人,第二次是小红回复还招人,第三次是小明为了确保小红能收到信息,进行最终的确认。这就是三次握手的通俗表达。

    有的人可能觉得最后还要再提醒,就很墨迹,觉得可以改成下面这个步骤:

    1、小明跟小红发消息,我想要应聘贵公司,如果还招人的话,我直接投简历给您。这是第一次

    2、小红回消息说,我们还招人,你投吧。然后就打开邮箱等待接收简历。这是第二次

    3、小明看到信息后,直接发送简历,然后小红就可以接受到简历了。

    按照上面的描述,直接就省略了小明第三次最终确认的步骤,减少了信息交互的步骤,提升了信息交互效率,何乐而不为呢?按照效率来说,的确是这样的,毕竟少了一次信息最终确认,但是这样可能导致资源浪费的问题。

    我再讲两个例子,来描述只交换信息两次的两大弊端。

    弊端一:

    1、小明跟小红发消息,我想要应聘贵公司,如果还招人的话,我直接投简历给您。这是第一次。但是好巧不巧,这一次发送时页面一直转圈圈等待,小明以为没有发送出去,刷新页面又再发送一遍。而实际上第一次由于网络卡顿,已经发出去了,但是比第二次更晚到达。

    2、这时候,小红接受到小明第二次发送的信息,小红回消息说,我们还招人,你投吧。然后就打开邮箱等待接收简历。这是第二次。小明接收到信息后就直接发送简历过去,完成信息交互。

    3、而在小红接收到简历后,突然,小明发送的第一次信息突破重重关卡又到了,这是时候小红就接收到小明第一次的发送信息。然后小红以为这是小明要重新发一个建立给她,所以又开放邮箱,并回复小明说,你可以发消息了。

    4、这时候小明看到消息直接蒙逼,简历都发过去了,没法发第二遍了,所以小红和小明都只能在那干瞪眼。半小时后小红气愤的关闭了邮箱。

    弊端二:

    1、小明跟小红发消息,我想要应聘贵公司,如果还招人的话,我直接投简历给您。这是第一次。

    2、小红回消息说,我们还招人,你投吧。然后就打开邮箱等待接收简历。这是第二次。

    小明看到消息后,刚准备发消息,但好巧不巧,家里停电了,没网了,小明只能在这苦苦等待。而小红呢,完全不知道小明那边的问题,也是在那里傻等,等着小明发简历。从而导致小红没法去处理其它问题,而小红等了半小时后,直接关了小明的联系。

    可以看到,如果没有第三次的最终确认,提前确认发送环境等,可能就导致小红白等半小时。

    而又有人可能会说了,你这不扯淡嘛,难道第三次确认之后,就能保证小明能百分百成功发送简历到小红那里了吗?就算有第三次的环境确认,最后发送的时候还是可能因为停电没网而导致发送不成功嘛。

    对,的确,即使最终确认后,最终发送也会有断网的风险。甚至就算提升到10000000次握手,都无法确保信息能够准确发送和接收,为什么?因为发送过去的确认信息,只能保证发送当时的那一刻,发送方环境是好的,就好像12点整小明发送信息说我的电脑好的一匹,随时可以发送信息,但是小红接收到信息可能是12点10分,这十分钟时间里面的电脑状态是随时会变化的,可能十二点零一秒,电脑就用不了了,所以,无论多少次握手,都无法确保信息能准确发送。

    那三次握手的意义是什么?

    因为三次握手是确保双方互相知道对方状态正常的最低成本方案。

    这句话怎么理解?

    我们再说如果只要两次握手,

    第一次发送信息,是小明发送信息给小红,只是确认小红是否还招人,并没有向小红表述他的环境能百分百发送成功简历。所以小红不知道小明能否百分百发送成功简历。

    第二次发送信息,是小红发送信息给小明,让小明知道她能接收信息。这个时候小明知道小红做好接收简历准备,但是小红不知道小明做好简历发送准备。

    如果是三次握手,

    第一次发送信息,是小明发送信息给小红,只是确认小红是否还招人,并没有向小红表述他的环境能百分百发送成功简历。所以小红不知道小明能否百分百发送成功简历。

    第二次发送信息,是小红发送信息给小明,让小明知道她能接收信息。这个时候小明知道小红做好接收简历准备,但是小红不知道小明做好简历发送准备。

    第三次发送信息,是小明发送信息给小红,让小红知道小明已经做好发送简历的准备。这个时候小明知道小红做好接收简历准备,小红也知道小明做好简历发送准备。

    这就是三次握手和两次握手的本质区别。一个是双方知道,一个只是单方面知道。如此三次握手比两次握手更加安全。

    而最低成本方案的概念就是说,通过三次接收,双方都知道对方已经OK了,直接发数据就行,没必要再第四次,第五次握手了。

    三次握手处理问题的本质

    三次握手最终要解决的问题,就是网络信息交互的不稳定问题。提升信息交互成功率,降低由于无法接受到信息而导致的资源浪费问题。

    以上就是三次握手的理解,之后还会继续进行修改,如果有什么建议,我会及时采纳和更正。

  • 相关阅读:
    mysql数据库给别人访问权限
    linux 5-sort,uniq,tar,split
    linux 4 -awk
    Linux 3 -grep
    linux 基础2-null,cut,wc,head,tail
    linux 基础-变量,shell基本语法
    [ActionScript 3.0] 利用InteractivePNG.as类精确选择识别png图片有像素的区域
    [ActionScript 3.0] 嵌入字体
    [ActionScript 3.0] AS利用ByteArray向PHP发送二进制数据生成图片
    [ActionScript 3.0] AS向php发送二进制数据方法之——在URLRequest中构造HTTP协议发送数据
  • 原文地址:https://www.cnblogs.com/LY-CS/p/14593663.html
Copyright © 2011-2022 走看看