跳至主要內容

TCP三次握手

yyshino大约 3 分钟

TCP三次握手

客户端和服务端都需要直到各自可收发,因此需要三次握手。

img
img

从图片可以得到三次握手可以简化为:C 发起请求连接 | S 确认,发起连接 | C 确认

双方要连接,要等待对端同意并返回确认,一端请求后收到确认包就意味着,网络可达并且对端同意建立连接。最后的模型则是

A  --请求-->  B

A  <--确认--  B

A  <--请求--  B

A  --确认-->  B

中间两次可以一起返回,所以是三次握手
引自知乎@Manistein

三次握手的作用

过程

  1. 第一次握手:客户端主动链接服务器,发送初始序列号seq=xSYN=1同步请求标志,并进入同步已发送SYN_SENT状态,等待服务器确认。
  2. 第二次握手:服务端收到消息后发送确认标志ACK=1与同步请求标志SYN=1,发送自己的序列号seq=y以及客户端确认序号ack=x+1,此时服务器进入同步收到SYN_RECV状态。
  3. 第三次握手:客户端收到消息后发送确认标志ACK=1,发送自己的序列号seq=x+1与服务器确认号ack=y+1,发送过后即确认链接已建立状态ESTABLISHED,服务端接收确认信息后进入链接已建立状态ESTABLISHED

解释

  1. 第一次握手:客户端:“兄弟,待会咱们出去玩吧,能看到我的消息吗,能就吱一声,让我知道我有发消息的能力”
  2. 第二次握手:服务端:“吱,走走走咱们去哪玩?我收到你的消息了,你有发消息的能力,要不你再给我回个消息,让我也确定我有发消息的能力”
  3. 第三次握手:客户端:“咱们先去河里摸鱼玩,然后上山摘点果子。我也收到你的消息了,你这发消息的能力也没问题,咱俩的发消息的能力都没问题,可以愉快的玩耍了”

四次挥手

client                                      server
主动关闭 →          FIN=1,seq=u          → 被动关闭,接收
(终止等待1)                               (关闭等待)
接收     ←      ACK=1,seq=v,ack=u+1      ← 发送
(终止等待2)                               (关闭等待)
接收     ←   FIN=1,ACK=1,seq=w,ack=u+1   ← 发送
(时间等待)                                (最后确认)
发送     →      ACK=1,seq=u+1,ack=w+1    → 接收
(时间等待 2MSL 关闭)                      (关闭)

来自@touchczy 的博客 https://blog.touchczy.top/#/Browser/TCP%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B
  1. 第一次挥手:客户端发出释放标识FIN=1,自己的序列号seq=u,进入终止等待FIN-WAIT-1状态
  2. 第二次挥手:服务端收到消息后发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入关闭等待CLOSE-WAIT状态,客户端收到消息后进入终止等待FIN-WAIT-2状态
  3. 第三次挥手:服务器发送释放标识FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己的序列号seq=w,服务器进入最后确认LAST-ACK状态
  4. 第四次挥手:客户端收到回复后,发送确认标志ACK=1,确认序号ack=w+1,自己的序列号seq=u+1,客户端进入时间等待TIME-WAIT状态,经过2个最长报文段寿命后,客户端CLOSE。服务器收到确认后,立刻进入CLOSE状态。

参考

TCP三次握手 (touchczy.top)open in new window