三次握手
当两台计算机之间建立TCP连接时,它们之间会执行一个称为“三次握手”的过程。这个过程允许双方在通信开始前进行一些必要的协商,确保双方都准备好发送和接收数据。下面是TCP三次握手的详细过程:
- 第一次握手(SYN):
- 客户端向服务器发送一个特殊的TCP数据包,称为SYN包(同步序列编号)。这个包包含了一个随机生成的序列号(client_isn),用于后续的数据传输。
- 客户端将SYN标志位设置为1,表明这是一个连接请求。
- 第二次握手(SYN + ACK):
- 服务器收到客户端发送的SYN包后,会回复一个SYN包和一个ACK包(确认),称为SYN-ACK包。
- 服务器在SYN-ACK包中将SYN标志位设置为1,表示它接受了客户端的连接请求,并且同时发送一个确认序号(ACK),确认客户端的序列号加1,以表明它准备好接收数据。
- 第三次握手(ACK):
- 客户端收到服务器发送的SYN-ACK包后,会向服务器发送一个确认ACK包。
- 这个ACK包不包含任何数据,只是用来确认服务器的SYN-ACK包已经收到了。
- 客户端将确认序号设置为服务器发送的序列号加1。
完成了这个三次握手过程后,TCP连接就建立起来了,双方就可以开始通过这个连接传输数据。此时,双方都知道对方已经准备好了,并且双方也都知道对方的序列号,从而可以保证数据的可靠传输。
需要注意的是,如果在这个过程中的任何一个阶段出现了问题,比如某个数据包丢失或者超时,TCP协议会尝试重新发送数据包或者触发超时重传机制,以确保连接的建立。
四次挥手
TCP连接的四次挥手是在通信结束时,双方关闭连接的过程。它相比于三次握手有更多的细节,因为在这个过程中,每一方都需要确保对方收到了关闭请求,并且双方都知道连接已经关闭。以下是四次挥手的详细过程:
- 第一次挥手(FIN):
- 客户端或服务器其中一方决定关闭连接,发送一个FIN包给对方。
- FIN包中的FIN标志位被置为1,表示发起方已经没有数据要发送了,但仍能接收数据。
- 第二次挥手(ACK):
- 接收到FIN包的一方(假设为服务器)确认收到了关闭请求,发送一个ACK包作为确认。
- 这个ACK包通常不会携带任何数据,只是简单地确认收到了FIN包。
- 第三次挥手(FIN):
- 确认收到关闭请求的一方(服务器)也决定关闭连接,向对方发送一个FIN包。
- 这个FIN包告诉对方它也没有数据要发送了,但仍能接收数据。
- 第四次挥手(ACK):
- 收到第三次挥手的一方(假设为客户端)发送一个ACK包作为确认。
- 这个ACK包通常不会携带任何数据,只是简单地确认收到了第三次挥手的FIN包。
完成了这个四次挥手过程后,连接就完全关闭了。双方都知道对方已经关闭了连接,不会再发送数据。这样可以确保数据的可靠传输,并且释放了双方的资源,使其可以用于其他连接。