三次握手(建立连接)
在TCP中,客户端与服务端之所以能够建立可靠的连接,就是因为它们之间发生了三次握手。
第一次握手 客户端→服务端
一般情况下,一个连接往往都是由客户端主动发起,服务端则被动地等待。因此,要建立一个连接,首先由客户端向服务端发送一个数据包,这个数据包包含了一些关键的信息:
SYN=1 建立连接标志位
seq=n 计算机随机生成的序号
意思是:服务端,我(客户端)要和你建立连接(SYN=1)。
第二次握手 服务端→客户端
此时,服务端接收到这个数据包,也会发送一个数据包给客户端,作为回应,这个数据包中也包含了一些关键的信息:
SYN=1 建立连接标志位
seq=m 计算机随机生成的序号
ACK=1 确认标志位
ack=n+1 确认序号
意思是:客户端,我收到你的连接请求了(ACK=1),我也要和你建立连接(SYN=1),另外,我已经收到序号为n的数据包,下次你需要从序号为n+1的数据包开始发送(ack=n+1)。
第三次握手 客户端→服务端
客户端收到服务端发来的数据包,可以知道两件事情:我(客户端)可以向服务端发送数据,也可以接收到服务端发送过来的数据。
但是,服务端只能知道自己可以接收从客户端发送过来的数据,却不知道客户端能否接收到自己发送出去的数据。所以,客户端需要再给服务端发送一个数据包,告诉服务端,客户端已经收到服务端发送的数据了。这个数据包包含的关键信息有:
ACK=1 确认标志位
ack=m+1 确认序号
seq=n+1 报文序号
意思是:服务端,我已经收到你发来的序号为m的数据包了,下次你需要从序号为m+1的数据包开始发送(ACK=1,ack=m+1)。
经过三次握手,客户端与服务端之间的连接就成功建立起来了。
Q:为什么不四次握手?
A:可以,但没必要。经过两次握手,客户端就已经可以确认自己是可以向服务端收发数据的,但服务端只能确认自己可以收到客户端发来的数据。有了第三次握手,服务端就可以进一步确认,自己也可以向客户端发送数据,就可以放心地向客户端发送数据了。
四次挥手(断开连接)
建立连接时,客户端与服务端之间只需要进行三次握手,但是断开双方的连接时,却需要进行四次挥手。
第一次挥手 客户端→服务端
一般情况下,断开连接的请求也是由客户端主动发起的。客户端要断开一个连接,先向服务端发送一个数据包,这个数据包包含以下关键信息:
FIN=1 断开连接标志位
seq=x 报文序号,不是随机生成的,取决于客户端在建立连接后发送了多少数据包,是一个与n有关的累计值
意思是:服务端,我(客户端)要和你断开连接了(FIN=1)。
第二次挥手 服务端→客户端
服务端收到由客户端发送来的断开连接的请求,但是,这时候服务端可能还有数据没有发送完,还需要做一些收尾工作,不能立刻断开连接,所以,服务端会向客户端发送一个数据包,这个数据包包含以下关键信息:
ACK=1 确认标志位
ack=x+1 确认序号
seq=y 报文序号 不是随机生成的,取决于服务端在建立连接后发送了多少数据包,是一个与m有关的累计值
意思是:好了好了我知道了(ACK=1,ack=x+1),但是现在一时半会断不了,等我通知吧(?)
客户端收到这个数据包,知道服务端已经获悉自己想要断开连接了,就进入半关闭状态,可以关闭客户端→服务端这个方向上的连接,客户端也就没法向服务端发送消息了,但服务端依然可以向客户端发送消息,也就是继续它的收尾工作。
第三次挥手 服务端→客户端
服务端完成收尾工作后,就会发送一个数据包来通知客户端,这个数据包包含以下关键信息:
FIN=1 断开连接标志位
ACK=1 确认标志位
ack=x+1 确认序号
seq=z 不是随机生成的,取决于服务端在建立连接后发送了多少数据包,是一个与m有关的累计值
意思是:客户端,我这边完事了,可以断开连接了(FIN=1)。
第四次挥手 客户端→服务端
客户端收到客户端发来的数据包,就知道客户端已经处理完手头上的工作了,于是客户端也向服务端发送一个数据包,这个数据包包含以下关键数据:
ACK=1 确认标志位
ack=z+1 确认序号
seq=x+1 报文序号
意思是:服务端,我收到你断开连接的请求了(ACK=1,ack=z+1),你可以断开连接了。
服务端收到这个数据包,就可以放心地断开到客户端方向上的连接了。
Q:为什么要有四次挥手?
A:因为客户端想断开连接,但是不能确保服务端这边就能立刻停止数据的发送,所以客户端只能发起一个请求,让服务端知道它想断开连接。服务端也只能告诉客户端:已经接收到你的断开连接请求了,但是我这边可能还有一些数据需要发送,你先等我消息吧。然后客户端就等候,等到服务端处理好所有事情后,主动发来断开连接的请求,这时候客户端再向服务端发送确认消息,告诉服务端:我收到了你的断开连接请求。这样才能真正断开一个连接。
参考:
详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”
tcp/ip协议三次握手、四次挥手
P.S:如有错误,欢迎指正~