TCP协议的三次握手是一个关键过程,用于在客户端和服务器之间建立可靠的连接。以下是三次握手的详细过程,包括标志位、序列号以及ACK的变化规律:
第一次握手:
- 客户端:
- 标志位:SYN=1(表示请求建立连接)
- 序列号:随机生成一个初始序列号seq=x
- 发送数据包给服务器,并进入SYN_SENT状态,等待服务器确认
第二次握手:
- 服务器:
- 收到客户端的数据包后,从标志位SYN=1知道客户端请求建立连接
- 标志位:SYN=1(表示同意建立连接),ACK=1(表示确认客户端的序列号)
- 确认号:ack=x+1(表示期望收到的下一个字节的序列号)
- 随机生成一个自己的初始序列号seq=y
- 发送数据包给客户端,并进入SYN_RCVD状态
第三次握手:
- 客户端:
- 收到服务器的数据包后,检查ACK是否为1以及ack是否为x+1,以确保服务器已确认自己的序列号
- 标志位:ACK=1(表示确认服务器的序列号)
- 确认号:ack=y+1(表示期望收到的下一个字节的序列号)
- 发送数据包给服务器
- 服务器:
- 收到客户端的数据包后,检查ACK是否为1以及ack是否为y+1,以确保连接建立成功
- 客户端和服务器均进入ESTABLISHED状态,完成三次握手
随后,客户端和服务器之间可以开始传输数据。在整个过程中,序列号和确认号的变化规律确保了数据的顺序性和可靠性。每次发送数据包时,发送方都会将当前序列号加1,并在接收方确认后,接收方会发送一个带有下一个期望序列号的确认包。这种机制确保了数据的正确传输和接收。
二、传输3包数据
假设客户端向服务器发送3个数据包,序列号分别为seq=x+2, seq=x+3, seq=x+4。
服务器接收到每个数据包后,会回复一个ACK包进行确认。
三、四次挥手
当数据传输完成后,任何一方都可以发起四次挥手来关闭连接。
第一次挥手(假设由客户端发起):
- 客户端:
- 发送一个FIN包,标志位FIN=1,序列号seq=x+n(n为之前发送的数据包数量+1)
第二次挥手:
- 服务器:
- 收到FIN包后,发送ACK包确认,标志位ACK=1,确认号ack=x+n+1
第三次挥手(服务器关闭连接):
- 服务器:
- 发送一个FIN包,标志位FIN=1,序列号seq=y+m(m为服务器之前发送的数据包数量+1)
第四次挥手:
- 客户端:
- 收到FIN包后,发送ACK包确认,标志位ACK=1,确认号ack=y+m+1
至此,四次挥手完成,TCP连接关闭。
在整个过程中,序列号和确认号的变化始终保持着连续性,确保了数据的正确顺序和可靠性。每个数据包都有一个唯一的序列号,接收方在发送确认包时,会指定下一个期望接收的序列号。这种机制保证了数据的完整性和顺序性,使得TCP成为一个可靠的传输协议。