一、什么是TCP协议:
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP/IP模型中,TCP负责在网络中的两个主机之间建立一个可靠的通信连接。这个过程主要通过三次握手(Three-way Handshake)来实现,而结束一个连接则通过四次挥手(Four-way Handshake)来完成。
二、TCP三次握手和四次挥手介绍:
三次握手
-
第一次握手(SYN):
- 意义:客户端向服务器发送一个SYN包,表示客户端希望建立连接。这个SYN包中包含客户端的初始序列号(ISN),用于后续数据传输的序列号初始化。
- 目的:确认客户端能够发送数据,并且让服务器知道客户端的初始序列号。
-
第二次握手(SYN-ACK):
- 意义:服务器收到客户端的SYN包后,如果同意建立连接,会发送一个SYN-ACK包作为响应。这个包中包含服务器的初始序列号,并对客户端的SYN请求进行确认(ACK)。
- 目的:确认服务器能够接收和发送数据,并且让客户端知道服务器的初始序列号,同时确认客户端的SYN请求已被接收。
-
第三次握手(ACK):
- 意义:客户端收到服务器的SYN-ACK包后,发送一个ACK包作为响应,确认服务器的SYN请求已被接收。
- 目的:确认客户端能够接收服务器的数据,完成双向通信的建立。至此,TCP连接完全建立,双方可以开始数据传输。
不使用「两次握手」和「四次握手」的原因:
-
两次握手:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
-
四次握手:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
四、TCP的四次挥手
四次挥手
-
第一次挥手(FIN):
- 意义:客户端发送一个FIN包给服务器,表示客户端已经完成数据发送,希望关闭连接。
- 目的:通知服务器客户端已经没有数据要发送了,请求关闭连接。
-
第二次挥手(ACK):
- 意义:服务器收到客户端的FIN包后,发送一个ACK包作为响应,确认客户端的FIN请求。
- 目的:确认服务器已经收到客户端的关闭请求,并且告诉客户端服务器已经准备好关闭连接。
-
第三次挥手(FIN):
- 意义:服务器在发送完所有剩余数据后,发送一个FIN包给客户端,表示服务器也准备关闭连接。
- 目的:通知客户端服务器已经完成数据发送,请求关闭连接。
-
第四次挥手(ACK):
- 意义:客户端收到服务器的FIN包后,发送一个ACK包作为响应,确认服务器的FIN请求。
- 目的:确认客户端已经收到服务器的关闭请求,并且客户端已经准备好关闭连接。至此,TCP连接完全关闭。
通过这一系列的过程,TCP确保了连接的可靠性和数据的完整性,同时也允许双方在结束通信时能够优雅地关闭连接,释放资源。
三、TCP标志位
标志位 | 含义 |
SYN | 建立连接时同步序列号 |
ACK | 确认收到的数据 |
FIN | 关闭连接 |
RST | 重置连接 |
PSH | 推送数据给应用层 |
URG | 有紧急数据 |
ECE | 网络拥塞通知 |
CWR | 减少发送数据量 |
NS | 防止序列号预测攻击 |