在Linux(以及其他支持TCP/IP协议的操作系统)中,TCP(Transmission Control Protocol,传输控制协议)为了建立一个可靠的数据传输连接,采用了三次握手(Three-way Handshake)的过程来初始化连接。以下是TCP三次握手的详细步骤和解释:
- 第一次握手(SYN):
- 客户端(Client)想要与服务器(Server)建立连接时,它会随机生成一个初始序列号(ISN),并发送一个SYN(同步)段给服务器,请求建立连接。此消息中包含了客户端的初始序列号(ISN_C)。
Client -> Server: SYN (ISN_C)
- 这个阶段客户端的状态变为
SYN_SENT
。 - 第二次握手(SYN+ACK):
- 服务器接收到客户端的SYN消息后,会回复一个SYN+ACK消息。服务器会确认客户端的SYN(即ACK(Acknowledgment)字段填入ISN_C + 1),同时也会生成自己的初始序列号(ISN_S),并将其包含在SYN消息中发送给客户端。
Server -> Client: SYN (ISN_S), ACK (ISN_C + 1)
- 此时,服务器进入
SYN_RECEIVED
状态。 - 第三次握手(ACK):
- 客户端收到服务器的SYN+ACK消息后,确认服务器的SYN(ACK字段填入ISN_S + 1),并向服务器发送一个ACK消息,表示客户端同意建立连接。
Client -> Server: ACK (ISN_S + 1)
- 客户端收到服务器的ACK确认后,连接正式建立,客户端和服务器的状态都转变为
ESTABLISHED
。
综上所述,通过三次握手,双方能够互相确认对方的接收能力和发送能力,并且协商了一套双方都认可的初始序列号,以便后续数据传输时进行校验和避免数据丢失。在三次握手过程中,双方都得到了一次相互的确认,保证了连接的可靠性。只有当三次握手全部完成后,客户端和服务器才会开始交换数据。