8 个回答

我简单点说吧。

无论多少次握手都不能满足传输的绝对可靠。
TCP的核心思想:保证数据可靠传输
其次:保证传输效率。

那么,就可以开始回答了:

为什么要握手(为什么不是2次握手)?

**为了保证传输的可靠。**
第一次握手CLIENT告诉SERVER“我将要开始传输数据了”。
第二次握手SERVER告诉CLIENT“我已经知道你将要传输数据了,我已经做好准备”。
第三次握手CLIENT告诉SERVER“我已经知道你已经知道'我知道你已经做好准备'”,SERVER端收到这个信号,开始传输数据。
但是此时CLIENT并不知道SERVER已经知道“CLIENT 已经知道SERVER已经知道”(有点绕,可以忽略这一句)。

为什么是3次而不是4次?

**为了提高传输的效率**
总之不管多少次握手,总会有一方不知道对方已经知道。因此为了传输效率,只要3次握手就认为已经可以开始传输数据,三次握手之后,
CLIENT和SERVER就进入ESTABLISHED状态,开始数据传输。

详情可以查看我的这篇博客:计算机网络五层协议——TCP协议实例图解

为什么不是两次:

  • A->B: 洞幺洞幺,我是洞拐,收到请回复,Over。

  • B->A: 洞拐洞拐,洞幺收到,Over。

请问根据以上对话判断,

  1. B是否能收到A的信息? (答案是肯定的)

  2. A是否能收到B的信息? (你猜?)

为什么不是四次:

  • A->B: 洞幺洞幺,我是洞拐,收到请回复,Over。

  • B->A: 洞拐洞拐,洞幺收到,收到请回复,Over。

  • A->B: 洞幺洞幺,洞拐收到,收到请回复,Over。

  • B->A: 洞拐你是鱼吗。。。 (传说鱼只有7秒记忆。)

你问她 你喜欢吃什么
她告诉你我喜欢吃苹果
然后你知道了她喜欢吃苹果,回答了一句‘哦’。

女神在你说了‘哦’之后就不理你了,这个话题就终结了。

你说是不是这个道理?三次握手不就是这样的吗?(调侃向)

tcp/ip connect: tcp/ip的三次握手
                  syn握手信号
                  ------------->
                  syn/ack确认字符
          client  <-------------  server
                  ack确认包
                  -------------->

哈,有意思的问题。
tcp三次握手,四次挥手。
我的理解是:
tcp是全双工双向通信,因此通信双方都要发送syn握手信号,而对方都要回复一个ack确认信号。
因此握手通常应该是2个syn+2个ack=4个信号包,tcp里服务端发送ack信号和发送syn信号,可以合并成一个包,所以可以减少一个包,因此就变成了3个包。
挥手也是4个信号包(2个fin+2个ack=4)哈,那能不能模仿握手合并信号包呢?答案是不能,因为ack信号后,可能有部分数据没有发送完,还要等待一段时机(比如发送某些数据后),才能发送fin信号。

简单理解就是,双向可靠通信,4个包,握手可以节省一个包,挥手不能节省包。

新手上路,请多包涵

我的理解是这样的:
第一次握手:人群中有人向你向你喊了一声:草拟马!(syn=j)
第二次握手:然后你听到有人骂你找到那个人回复了一句:我(syn=k)听到有人骂我了是你(ask=j+1)喊的吗?
第三次握手:那个人回答你:是我(ask=k+1)。

开始交互数据: 开始打到一方逃跑为止。

新手上路,请多包涵

上面那个说两次洞幺的,你没考虑到一个问题吗?
你用着呼叫机,你打电话给你朋友。开始第一次:你吃饭了吗?(你问)
第二次:还没吃(你朋友回到)
然后到这里,你就没声音了。你不在回一句朋友怎么知道你有没有听到?
电话打进来,问了一句就没消息,会不会觉得你消失了,或出事了?

建立连接过程中需要确定,双方都能收到消息。不然就是UDP了

http协议就是这么规定的,还想咋握手

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题