趣解三次握手

Posted by hurshi on 2018.01.01

转自知乎 – TCP 为什么是三次握手,而不是两次或四次?

三次握手

  • A: 喂,你听得见么?
  • B: 我听得见呀,你听得到我么?
  • A: 我能听到你

    旁白: 于是,他们愉快地聊了起来

四次挥手

  • A: 我事情说完了,要挂电话了哈。
  • B: 好的,我知道了。我想想看我还有没有忘记说的。

    旁白: 过了一会

  • B: 好了,我说完了,挂了哈。
  • A: 好的,拜拜。

    旁白: 于是B就挂了电话,A等了一会没有听到B讲话,也挂了电话.

Questions

  1. 为什么非得三次握手,不能2次么?

    • A: 喂,你听得见么?

    • B: 我听得见呀,你听得到我么?

    • 旁白: B并不能知道A能不能听见呀

  2. 来自@zskingking的解释: 第三次握手是为了避免服务端造成资源的浪费

假如TCP是两次握手:

  1. 主机A向主机B发送了一个建立连接的请求x,但这个请求在半路里给堵了。

  2. 主机A没有得到主机B的响应于是又发了一个建立连接的请求y,主机B收到了请求y,于是给主机A发送了一个确认,此时连接建立。
  3. 数据传输完毕后断开了连接。
  4. 但在断开连接后堵在半路的请求x到达了主机B,此时主机B认为主机A又给自己发送了一个建立连接的请求,于是给主机A发送了一个确认,此时主机B认为连接已经建立,处于等待状态从而导致主机B资源的浪费。
  5. 但如果是三次握手就可以避免这种情况的出现,所以这才是TCP第三次握手的原因。