TCP三次握手
大约 3 分钟
TCP三次握手
客户端和服务端都需要直到各自可收发,因此需要三次握手。
从图片可以得到三次握手可以简化为:C 发起请求连接 | S 确认,发起连接 | C 确认
双方要连接,要等待对端同意并返回确认,一端请求后收到确认包就意味着,网络可达并且对端同意建立连接。最后的模型则是
A --请求--> B
A <--确认-- B
A <--请求-- B
A --确认--> B
中间两次可以一起返回,所以是三次握手
引自知乎@Manistein
三次握手的作用
过程
- 第一次握手:客户端主动链接服务器,发送初始序列号
seq=x
与SYN=1
同步请求标志,并进入同步已发送SYN_SENT
状态,等待服务器确认。 - 第二次握手:服务端收到消息后发送确认标志
ACK=1
与同步请求标志SYN=1
,发送自己的序列号seq=y
以及客户端确认序号ack=x+1
,此时服务器进入同步收到SYN_RECV
状态。 - 第三次握手:客户端收到消息后发送确认标志
ACK=1
,发送自己的序列号seq=x+1
与服务器确认号ack=y+1
,发送过后即确认链接已建立状态ESTABLISHED
,服务端接收确认信息后进入链接已建立状态ESTABLISHED
解释
- 第一次握手:客户端:“兄弟,待会咱们出去玩吧,能看到我的消息吗,能就吱一声,让我知道我有发消息的能力”
- 第二次握手:服务端:“吱,走走走咱们去哪玩?我收到你的消息了,你有发消息的能力,要不你再给我回个消息,让我也确定我有发消息的能力”
- 第三次握手:客户端:“咱们先去河里摸鱼玩,然后上山摘点果子。我也收到你的消息了,你这发消息的能力也没问题,咱俩的发消息的能力都没问题,可以愉快的玩耍了”
四次挥手
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
- 第一次挥手:客户端发出释放标识
FIN=1
,自己的序列号seq=u
,进入终止等待FIN-WAIT-1
状态 - 第二次挥手:服务端收到消息后发出
ACK=1
确认标志和客户端的确认号ack=u+1
,自己的序列号seq=v
,进入关闭等待CLOSE-WAIT
状态,客户端收到消息后进入终止等待FIN-WAIT-2
状态 - 第三次挥手:服务器发送释放标识
FIN=1
信号,确认标志ACK=1
,确认序号ack=u+1
,自己的序列号seq=w
,服务器进入最后确认LAST-ACK
状态 - 第四次挥手:客户端收到回复后,发送确认标志
ACK=1
,确认序号ack=w+1
,自己的序列号seq=u+1
,客户端进入时间等待TIME-WAIT
状态,经过2
个最长报文段寿命后,客户端CLOSE
。服务器收到确认后,立刻进入CLOSE
状态。