三次握手和四次挥手

之前的TCP/IP 协议 从网络分层模型讲解,介绍了 TCP/IP 协议的分层模型。介绍了网络通信需要进行网络底层协议的层层嵌套。其中链路层离我们比较远,网络层的具体功能是提供了 IP 地址,传输层的代表是 TCP,它确保了传输的稳定可靠性,应用层则提供各种网络应用能力

在 HTTP 协议是基于传输层(TCP)的,在建立连接传输数据之前先有三次握手,等断开连接后,TCP 又会进行四次挥手

本文来讲讲 TCP 为什么要进行三次握手和四次挥手

http-tcp-three-handshakes

为什么要进行三次握手?

主要是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备

步骤为:

  • 客户端提出建立连接,发出客户端 seq:seq=client_isn
  • 服务端收到消息后返回 ack=client_isn+1 和服务端 seq:seq=server_isn
  • 客户端收到后返回ack=server_isn+1 表示收到了

可以理解为男女双方确认关系,男女双方要结婚,怎么办?先见父母得到父母认同,之前听过这样一句话:得不到父母祝福的婚姻是不幸福的(当然,不见父母直接结婚的也有,但不主流)

  • 男方提出去女方家,带上见面礼 seq:seq=男方的诚意
  • 女方家收到见面礼后返回(给男方)红包 ack=我们认可你啦 以及女方去男方家也带上见面礼 seq:seq=女方的诚意
  • 男方家收到见面礼后返回(给女方的)红包 ack=server_isn+1

这个叫确定关系。所以要又来又回三次,双方都确保知道对方的诚意和自己的诚意

那什么是四次挥手呢?

在断开之前,需要进行四次挥手

http-tcp-four-handshakes

为什么要有四次挥手?

主要是为了确保双方都知道对方断开连接

具体步骤为:

  • 客户端第一次发送消息给服务端告诉它需要断开连接
  • 服务端收到消息后返回消息告诉客户端:知道了,为了确保服务端收到了之前所有的 HTTP 请求,服务端需要等一等再断开连接
  • 服务端确认所有的 HTTP 请求都收到了,主动发消息给客户端:我这边所有的请求都处理完了,我也可以断开连接了
  • 客户端收到这个请求后,返回消息告诉服务端:我知道,断开连接吧

主要是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备

可以理解为一对男女要分手

  • 女方提出分手,说你对我不好,我要分手
  • 男方觉得需求合理,同意分手,但分手之前要把联系方式、合照、各种乱七八糟的帐啊、人情啊算清楚再分手
  • 男方理清楚后,主动发消息给女方,说这边都处理清楚了,以后你是你,我是我,我们可以分手了
  • 女方收到消息后,返回告诉男方:我知道了,分手吧

于是乎,它们就断了,分手手续完成

至于要往深了理解,可以看看猿人谷的面试官,不要再问我三次握手和四次挥手open in new window,一个字:细

Last Updated:
Contributors: johan