TCP/IP的三次握手和四次挥手
TCP协议是传输层的协议,在TCP/IP协议中提供可靠的连接服务,三次握手是建立连接的过程,四次挥手则是断开连接的过程。
三次握手
TCP建立连接前需要进行三次握手。
- 第一次握手:客户端向服务端发送连接请求,告诉服务端“我要和你建立连接,你听得到我吗?”,SYN=1表示连接请求,seq是随机生成的一个序列,用于之后的接收检验。
- 第二次握手:服务端收到了客户端的消息后,会发送一个确认消息,告诉客户端“我听到你了,你能听到我吗?”,ACK=1表示确认收到,服务端的seq也会随机生成一个序列,用于之后的接收检验,ack=x+1代表了确认收到了客户端的seq=x这个序列,表示期望下一次收到的序列为x+1。
- 第三次握手:客户端收到了服务端的消息后,会发送一个确认消息,告诉服务端“我能听到你,我们可以开始传输数据了。”,ACK=1表示确认收到,seq=x+1表示服务端期待收到的序列,ack=y+1表示确认收到了服务端的seq=y这个序列,表示期望下一次收到的序列为y+1。然后就建立起了连接。
四次挥手
TCP断开连接前需要进行四次挥手。
- 第一次挥手:客户端发送一个断开连接的请求给服务端,告诉服务端“我要断开连接了,你能听到吗?”,FIN=1表示已经没有数据要发送给服务端了,seq=u是随机生成的一个序列,用于之后的接受检验。
- 第二次挥手:服务端收到客户端的消息后,发送一个确认消息,告诉客户端“我能听到,我知道你没有数据发给我了。”,ACK=1表示确认,seq=v是随机生成的一个序列,用于之后的接受检验。ack=u+1表示期望下一次收到的seq。(注意:此时服务端还没有发送FIN,所以服务端在这之后仍然可以向客户端发送数据。)
- 第三次挥手:客户端收到了服务端的确认消息后知道了服务端已经收到自己的消息了,于是继续等待。然后服务端发送一个断开连接的消息给客户端,告诉客户端“我也要断开连接了,你能听到吗?”,FIN=1表示已经没有数据要发送给客户端了,生成一个新的随机序列seq=w,ack仍然是u+1。
- 第四次挥手:客户端收到服务端的消息后,知道了服务端已经没有数据要发过来了,于是发送一个确认消息给服务端,告诉服务端“我能听到,我们可以断开连接了。”ACK=1表示确认收到了服务端的消息,seq=u+1表示服务端希望收到的序列,ack=w+1表示期望下一次收到的seq。