TCP 三次握手是建立 TCP 连接时使用的一种协议,确保通信双方的主机都能正常收发数据。下面是 TCP 三次握手的详细过程:
1. **客户端发送 SYN(同步)报文**:客户端发送一个带有 SYN 标志的 TCP 报文段,表示请求建立连接,并选择一个初始序列号(ISN)用于后续数据传输的序号计数。
2. **服务器回应 SYN-ACK 报文**:服务器接收到客户端的 SYN 报文后,如果同意建立连接,会发送一个带有 SYN 和 ACK(确认)标志的 TCP 报文段作为应答。服务器也会选择一个自己的初始序列号作为 ISN。
3. **客户端发送 ACK 报文**:客户端接收到服务器的 SYN-ACK 报文后,会向服务器发送一个带有 ACK 标志的 TCP 报文段作为确认。此时,TCP 连接已经建立,通信双方可以开始传输数据。
示例:
假设客户端 IP 地址为 192.168.1.100,服务器 IP 地址为 192.168.2.200,端口号分别为 12345(客户端)和 80(服务器)。
1. 客户端发送 SYN 报文:
``` 源 IP: 192.168.1.100 目的 IP: 192.168.2.200 源端口: 12345 目的端口: 80 序列号: x 标志位: SYN=1, ACK=0 ```
2. 服务器回应 SYN-ACK 报文:
``` 源 IP: 192.168.2.200 目的 IP: 192.168.1.100 源端口: 80 目的端口: 12345 序列号: y 确认号: x+1 标志位: SYN=1, ACK=1 ```
3. 客户端发送 ACK 报文:
``` 源 IP: 192.168.1.100 目的 IP: 192.168.2.200 源端口: 12345 目的端口: 80 序列号: x+1 确认号: y+1 标志位: ACK=1 ```
此时,TCP 连接建立成功,客户端和服务器可以开始进行数据传输。
当客户端和服务器之间的通信结束后,需要断开连接时,会使用 TCP 四次挥手来关闭连接。下面是 TCP 四次挥手的详细过程:
1. **客户端发送 FIN 报文**:当客户端需要关闭连接时,会发送一个带有 FIN(结束)标志的 TCP 报文段给服务器,表示客户端已经完成发送数据,希望关闭连接。
2. **服务器回应 ACK 报文**:服务器接收到客户端的 FIN 报文后,会发送一个带有 ACK 标志的 TCP 报文段作为确认。服务器此时进入半关闭状态,可以继续向客户端发送数据,但无法再接收来自客户端的数据。
3. **服务器发送 FIN 报文**:当服务器也需要关闭连接时,会发送一个带有 FIN 标志的 TCP 报文段给客户端,表示服务器已经完成发送数据,希望关闭连接。
4. **客户端回应 ACK 报文**:客户端接收到服务器的 FIN 报文后,会发送一个带有 ACK 标志的 TCP 报文段作为确认。此时,TCP 连接彻底关闭,双方都无法再发送数据。
示例:
假设客户端 IP 地址为 192.168.1.100,服务器 IP 地址为 192.168.2.200,端口号分别为 12345(客户端)和 80(服务器)。
1. 客户端发送 FIN 报文:
``` 源 IP: 192.168.1.100 目的 IP: 192.168.2.200 源端口: 12345 目的端口: 80 序列号: a 标志位: FIN=1, ACK=0 ```
2. 服务器回应 ACK 报文:
``` 源 IP: 192.168.2.200 目的 IP: 192.168.1.100 源端口: 80 目的端口: 12345 序列号: b 确认号: a+1 标志位: ACK=1 ```
3. 服务器发送 FIN 报文:
``` 源 IP: 192.168.2.200 目的 IP: 192.168.1.100 源端口: 80 目的端口: 12345 序列号: c 确认号: a+1 标志位: FIN=1, ACK=1 ```
4. 客户端回应 ACK 报文:
``` 源 IP: 192.168.1.100 目的 IP: 192.168.2.200 源端口: 12345 目的端口: 80 序列号: a+1 确认号: c+1 标志位: ACK=1 ```
此时,TCP 连接完全关闭,双方都可以释放连接的资源。