一、TCP三次握手
(一)背景
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。三次握手是TCP协议用来建立可靠连接的过程。它确保了通信双方在建立连接时能够正确地发送和接收数据。
(二)三次握手的过程
第一次握手(SYN)
- 发起方:客户端
- 动作:客户端向服务器发送一个TCP报文段,这个报文段的标志位中的SYN(同步序列编号)被置为1。同时,客户端会随机选择一个初始序列号(ISN,Initial Sequence Number),这个序列号会随着数据的传输而递增,用于保证数据传输的可靠性。例如,客户端选择的初始序列号为X。
- 目的:客户端通过这个报文段告诉服务器,它想要建立一个连接,并且通过初始序列号来标识这个连接。
- 状态变化:客户端从CLOSED(关闭状态)变为SYN - SENT(同步已发送状态)。
第二次握手(SYN - ACK)
- 发起方:服务器
- 动作:服务器收到客户端的SYN报文段后,会确认客户端的请求。它会发送一个TCP报文段作为响应。这个报文段有两个标志位被置为1,SYN和ACK(确认)。服务器会将客户端的初始序列号X加1(X + 1)作为确认号(acknowledgment number),表示它已经收到了客户端的序列号X。同时,服务器也会随机选择自己的初始序列号Y。
- 目的:服务器通过这个报文段告诉客户端,它已经收到了客户端的连接请求,并且同意建立连接。同时,服务器也向客户端发送自己的初始序列号,以便客户端能够确认服务器的连接请求。
- 状态变化:服务器从CLOSED变为SYN - RCVD(同步已接收状态)。
第三次握手(ACK)
- 发起方:客户端
- 动作:客户端收到服务器的SYN - ACK报文段后,会发送一个TCP报文段作为确认。这个报文段的ACK标志位被置为1。客户端会将服务器的初始序列号Y加1(Y + 1)作为确认号,表示它已经收到了服务器的序列号Y。此时,连接建立完成,客户端和服务器可以开始传输数据。
- 目的:客户端通过这个报文段确认了服务器的连接请求,使得连接建立过程完成。
- 状态变化:客户端从SYN - SENT变为ESTABLISHED(已建立状态),服务器从SYN - RCVD也变为ESTABLISHED。
(三)三次握手的作用
- 防止失效的连接请求报文段突然又传送到了服务端,因而产生错误:如果没有三次握手,当一个旧的连接请求报文段突然又传送到了服务端,服务端可能会误以为是一个新的连接请求,从而建立一个无效的连接。而通过三次握手,服务端可以通过客户端的确认来判断这个连接请求是否有效。
- 确保通信双方的发送和接收能力正常:在三次握手的过程中,客户端和服务器都发送和接收了报文段,这可以确保双方的网络连接是正常的,能够正常地发送和接收数据。
二、TCP四次挥手
(一)背景
当TCP连接完成数据传输任务后,需要释放连接。四次挥手就是TCP协议用来释放连接的过程。它能够保证数据传输的完整性,并且确保通信双方都能够正确地关闭连接。
(二)四次挥手的过程
第一次挥手(FIN)
- 发起方:通常是客户端(也可以是服务器,取决于谁先完成数据传输)
- 动作:客户端在数据传输完成后,会向服务器发送一个TCP报文段,这个报文段的标志位中的FIN(结束)被置为1。同时,客户端会发送一个序列号(假设为Z)。这表示客户端已经完成了数据的发送,不再发送数据了。
- 目的:客户端通知服务器,它已经完成了自己的数据发送任务,希望关闭连接。
- 状态变化:客户端从ESTABLISHED变为FIN - WAIT - 1(终止等待1状态)。
第二次挥手(ACK)
- 发起方:服务器
- 动作:服务器收到客户端的FIN报文段后,会发送一个TCP报文段作为确认。这个报文段的ACK标志位被置为1。服务器会将客户端的序列号Z加1(Z + 1)作为确认号,表示它已经收到了客户端的结束请求。
- 目的:服务器通过这个报文段确认客户端的结束请求,告诉客户端它已经收到了关闭连接的请求。
- 状态变化:服务器从ESTABLISHED变为CLOSE - WAIT(关闭等待状态),此时服务器仍然可以向客户端发送数据。
第三次挥手(FIN)
- 发起方:服务器
- 动作:当服务器也完成了数据的发送后,它会向客户端发送一个TCP报文段,这个报文段的FIN标志位被置为1。同时,服务器也会发送一个序列号(假设为W)。
- 目的:服务器通知客户端,它也完成了数据的发送,希望关闭连接。
- 状态变化:服务器从CLOSE - WAIT变为LAST - ACK(最后确认状态)。
第四次挥手(ACK)
- 发起方:客户端
- 动作:客户端收到服务器的FIN报文段后,会发送一个TCP报文段作为确认。这个报文段的ACK标志位被置为1。客户端会将服务器的序列号W加1(W + 1)作为确认号。然后客户端进入TIME - WAIT(时间等待状态),等待2MSL(最大报文段生存时间)后,如果没有收到任何报文段,客户端就关闭连接。
- 目的:客户端通过这个报文段确认服务器的结束请求。客户端等待2MSL是为了确保服务器能够收到客户端的确认报文段,防止网络延迟或丢包导致服务器没有收到确认报文段而一直等待。
- 状态变化:客户端从FIN - WAIT - 1变为FIN - WAIT - 2(终止等待2状态),再变为TIME - WAIT(时间等待状态),最后关闭连接。服务器从LAST - ACK变为CLOSED(关闭状态)。
(三)四次挥手的作用
- 确保数据传输的完整性:在四次挥手的过程中,通信双方都发送了结束请求和确认报文段,这可以确保在关闭连接之前,双方都已经完成了数据的发送和接收。
- 防止连接被错误地关闭:通过多次的确认过程,可以避免由于网络延迟或丢包等原因导致连接被错误地关闭。