首先先了解一下什么是TCP:
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP中,连接的建立和终止都需要一系列的握手动作来完成。
符号概念:
SNY:同步位,表示连接请求;
ACK:确认位, 有效(=1),无效(=0);
Ack:确认号,对方发送序号(Seq)+1;
SEQ:序号;
FIN:断开连接,停止发送数据;
三次握手用于建立一个TCP连接,确保双方都已经准备好接收数据。以下是三次握手的具体步骤:
1. 第一次握手(SYN):
客户端向服务器发送一个带有SYN标志的TCP段,同时选择一个初始序列号Seq=x,这表示客户端请求与服务器建立连接。
此时客户端进入SYN_SENT状态,等待服务器确认。
2. 第二次握手(SYN+ACK):
服务器接收到客户端的SYN请求后,如果同意建立连接,则回复一个带有SYN和ACK标志的TCP段,确认号为Ack=x+1(确认客户端的序列号),同时选择自己的初始序列号Seq=y。
此时服务器进入SYN_RCVD状态。
客户端接收到这个包后,进入ESTABLISHED状态。
3. 第三次握手(ACK):
客户端接收到服务器的SYN+ACK后,会发送一个带有ACK标志的TCP段,确认号为Ack=z=y+1,表明已经收到了服务器的SYN。
此时客户端和服务器都进入`ESTABLISHED`状态,连接建立完成。
图解如下:
四次断开用于终止一个TCP连接,确保所有的数据都被正确接收,并且没有数据丢失。以下是四次断开的具体步骤:
1. 第一次挥手(FIN):
假设客户端首先决定关闭连接,它将发送一个带有`FIN`标志的TCP段,同时包含一个序列号Seq=u。
此时客户端进入`FIN_WAIT_1`状态。
2. 第二次挥手(ACK):
服务器接收到`FIN`后,发送一个带有`ACK`标志的TCP段作为确认,确认号为Ack=v=u+1。
此时服务器进入`CLOSE_WAIT`状态,客户端进入`FIN_WAIT_2`状态,等待服务器关闭连接。
3. 第三次挥手(FIN):
服务器在完成所有数据的发送后,也发送一个带有`FIN`标志的TCP段,同时包含一个序列号Seq=w。
此时服务器进入`LAST_ACK`状态。
4.第四次挥手(ACK):
客户端接收到服务器的`FIN`后,发送一个带有`ACK`标志的TCP段作为确认,确认号为Ack=x=w+1。
客户端进入`TIME_WAIT`状态,等待足够的时间(通常是2MSL,Maximum Segment Lifetime)以确保服务器收到了最后一个`ACK`。
服务器收到`ACK`后,进入`CLOSED`状态。
客户端在`TIME_WAIT`状态结束后,也进入`CLOSED`状态,连接完全关闭。
图解:
这些握手和挥手过程确保了数据的可靠传输和连接的有序关闭。