TCP三挥四握
TCP最关键的三个步骤:建立连接、数据传输、释放连接,这里的三次握手实现的是服务端和客户端建立连接;四次握手实现的是服务端和客户端释放连接。
三次握手: 建立数据连接
TCP连接需要三次握手的原因:
三次握手为了确保连接的可靠性和正确性,这样可以让双方都能够确认彼此的身份和能力,以便于在数据传输过程中建立可靠的链接。(本质上来说就是为了解决网络信道不可靠的问题)
三次握手一定是三次吗?为什么?
三次握手不一定是三次,可能是更多次,但绝对不会是两次或一次。三次握手是指在建立TCP连接时,客户端和服务器之间进行的一系列通信步骤。这个过程通常包括三个阶段:
- 客户端向服务器发送一个连接请求报文段(SYN)
- 服务器端收到请求后,回复一个确认报文段(SYN-ACK)
- 客户端再次回复一个确认报文段(ACK)
这种情况下,三次握手确保了客户端和服务器之间的双向通信,但是在某些特殊情况下,可能会发生额外的握手步骤。
例如说,如果客户端发送的第一个SYN报文段丢失,服务器将无法收到连接请求。这种情况下,客户端将重新发送SYN报文段,这将导致四次握手(第一次握手失败,重新开始三次握手)
此外,还可能发生网络延迟或丢包的情况,导致握手过程中的报文段丢失或重传,从而导致握手的次数超过三次
为什么是三次握手而不是两次握手呢?换句话说,为什么不在服务端回复完SYN+ACK之后就建立连接呢?
这里我们假设采用两次握手来建立连接,客户端向服务端发送一个SYN包来请求建立连接,因为某些未知原因并没有到达服务器,在中间某个网络节点产生了滞留。此时,为了建立连接客户端会重发SYN包,这次数据包正常送达,服务器回复SYN+ACK之后建立起了连接,但是第一包数据阻塞的网络节点突然恢复,第一包SYN包有送达到服务器,这时服务器端会误认为是客户端又发起的一个新的连接,服务端认为是两个连接,而客户端认为是一个连接,这就造成了状态不一致。
如果在三次握手的情况下,服务端收不到最后的ACK包就自然不会认为连接建立成功。
**四次挥手:**释放连接
四次挥手是指在TCP连接中,终止连接时需要进行四个步骤。这四个步骤分别是:
4. 发送方发送一个FIN报文,表示数据发送完毕。(发送方发送FIN报文仅代表自己不会再发送数据,并不代表自己不会继续接收数据)
5. 接收方收到FIN报文后,发送一个ACK报文,表示确认收到FIN报文。
6. 接收方发送一个FIN报文,表示自己也没有数据要发送了,同意关闭连接的请求
7. 发送方收到FIN报文后,发送一个ACK报文,表示确认收到FIN报文。
这四个步骤的目的是为了确保双方都不会再进行数据传输并同意关闭连接。因此四次挥手是必要的,不能缺少任何一步。