近期在学习网络基础,对于tcp很多人在讨论,于是便结合自己的认知简单讲一下tcp协议中的三次握手和四次挥手。
一、三次握手和四次挥手的工作原理
1.1 三次握手
第一次握手:客户端向服务器发送一个带有 SYN 标志的数据包,请求建立连接。此时客户端进入 SYN_SENT 状态。
第二次握手:服务器收到客户端的 SYN 数据包后,向客户端发送一个带有 SYN 和 ACK 标志的数据包,确认客户端的请求并也请求建立连接。服务器进入 SYN_RECV 状态。
第三次握手:客户端收到服务器的 SYN+ACK 数据包后,向服务器发送一个带有 ACK 标志的数据包,确认服务器的请求。此时客户端和服务器都进入 ESTABLISHED 状态,连接建立成功。
1.2 四次挥手
第一次挥手:客户端发送一个带有 FIN 标志的数据包,表示客户端没有数据要发送了,想要关闭连接。客户端进入 FIN_WAIT_1 状态。
第二次挥手:服务器收到客户端的 FIN 数据包后,发送一个带有 ACK 标志的数据包,确认收到客户端的关闭请求。服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。
第三次挥手:服务器处理完剩余的数据后,发送一个带有 FIN 标志的数据包,表示服务器也没有数据要发送了,想要关闭连接。服务器进入 LAST_ACK 状态。
第四次挥手:客户端收到服务器的 FIN 数据包后,发送一个带有 ACK 标志的数据包,确认收到服务器的关闭请求。此时客户端进入 TIME_WAIT 状态,经过一段时间后进入 CLOSED 状态。服务器收到客户端的 ACK 数据包后,直接进入 CLOSED 状态,连接关闭。
1.3 各个状态的意思
SYN_SENT状态是客户端发送连接请求后的等待状态,表示已发送请求但还未收到服务器的确认。
SYN_RCVD状态是服务器接收到客户端连接请求后的等待状态,表示已接收到请求但还未收到客户端的确认。
ESTABLISHED状态表示连接已经建立,双方可以进行数据传输。
FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
FIN_WAIT_2:等待远端TCP 的连接终止请求。
CLOSE_WAIT:等待本地用户的连接终止请求。
CLOSING:等待远端TCP 的连接终止请求确认。
LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
TIME_WAIT 两个存在的理由
二、为什么是三次握手
因为一次握手不行,因为在建立连接时需要确认双方的发送和接收能力是否正常。如果只进行一次握手,那么无法确认对方是否能够接收到自己的消息。 两次握手表明客户端可以正常的像服务器发送报文(因为此时已经有ACK响应报文)。 但是服务器并不知道自己所发送的报文是能被客户端正常接收到!!!因为服务器向客户端发送的报文并没有得到过客户端的ACK响应报文。而第三次握手,客户端就能确保和服务端建立连接,同时四次握手也不行,因为多余的握手会导致过多的网络开销和资源消耗。三次握手就已经能够确认双方的发送和接收能力是正常的。
三、为什么是四次挥手
由于 TCP 是全双工通信,客户端(或者说主动关闭方)发送 FIN 请求只能表示客户端不再发送数据了,不代表完全断开连接,服务端(或者说被动关闭方)可能还要发送数据。所以不能将服务端的 FIN 包和对客户端的 ACK 包合并发送,只能先确认主动关闭方的 FIN,等服务端数据发送完毕时再发送 FIN 包,故挥手需要四次。
以上就是我对三次握手和四次挥手的简单理解,如有不足,还请各位补充。