什么是TCP
TCP,全称为传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP的主要特点包括:
- 面向连接:在数据传输之前,TCP需要建立连接,确保数据能够按照发送的顺序到达接收端。
- 可靠性:通过使用确认机制和重传机制,TCP确保数据包的可靠到达。如果数据包在传输过程中丢失或出错,TCP能够检测并重新发送这些数据包。
- 字节流:TCP将数据视为一系列的字节,并且保证这些字节的顺序与它们被发送时的顺序一致。
- 流量控制:TCP通过滑动窗口机制来控制数据的发送速率,以避免接收方被过快的数据淹没。
- 拥塞控制:TCP还能够根据网络的拥塞情况动态调整数据的发送速率,以减少网络拥塞的发生。
- 三次握手和四次挥手:这两个过程是TCP连接建立和断开的核心机制,它们确保了连接的稳定和数据的完整传输。
此外,TCP通常与IP协议一起使用,共同构成了TCP/IP协议族的核心,是互联网通信的基础。
TCP三次握手
- 第一次握手:客户端发送一个SYN包(同步序列编号)到服务器,并进入SYN_SENT状态,等待服务器确认。
- 第二次握手:服务器收到SYN包后,必须确认客户端的SYN(ACK),同时发送自己的SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。
- 第三次握手:客户端收到服务器的SYN+ACK包后,发送确认包ACK,服务器收到后,双方建立连接,可以开始数据传输。
(图源来自网络)
TCP四次挥手
- 第一次挥手:数据传输完成后,客户端发送一个FIN包(结束数据包)给服务器,表示自己已经没有数据要传输了,但仍然可以接收数据。
- 第二次挥手:服务器收到FIN包后,发送ACK包,表明自己已经收到了客户端的结束请求。
- 第三次挥手:服务器发送自己的FIN包给客户端,表示自己也结束了数据传输。
- 第四次挥手:客户端收到服务器的FIN包后,发送ACK包,之后双方都将关闭连接,释放资源。
(图源来自网络)
为什么不能两次握手?
1. 防止历史连接的初始化:三次握手可以防止网络中延迟到达的旧的连接请求突然被服务端接收,从而导致错误的连接建立。这是因为如果使用两次握手,服务端在收到旧的连接请求时可能会误认为是新的连接请求,从而建立起一个已经失效的连接。
2. 同步双方的初始序列号:三次握手过程中,双方都能够确定并确认对方的初始序列号,这是为了确保后续数据传输的正确性和顺序性。在第二次握手中,服务端确认客户端的SYN并发送自己的SYN,这样双方就能够同步彼此的初始序列号。
3. 避免资源浪费:如果只进行两次握手,那么在某些情况下,客户端可能在没有接收到服务端的确认之前就发送了大量数据,这可能导致服务端因为没有足够的资源来处理这些数据而造成资源的浪费。三次握手确保了在数据传输开始之前,双方都已经准备好并且确认了对方的存在和状态。