三次握手
-
第一次握手:
客户端向服务端发送连接请求SYN ,并进入SYN_SEND状态。 -
第二次握手:
服务端收到客户端发送的SYN请求后,向客户端发送回复信息ACK,并为该 TCP 连接分配缓存和变量,同时服务端也向客户端发送一个SYN包,即SYN+ACK包,之后服务器进入SYN_RECV状态。 -
第三次握手:
客户端收到服务端的SYN+ACK包,向服务端发送确认包ACK,此包发送完毕,客户端进入ESTABLISHED(建立)状态;服务端收到ACK后也进入ESTABLISHED状态。 -
三次握手完成,TCP连接建立。
注:
- 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。服务端的资源是在完成第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的,这就使得服务器容易受到 SYN 泛洪攻击。
为什么要三次握手?
- 两次握手会导致已失效的连接报文段到达服务器导致错误地建立不期望的连接;三次握手服务端可以确认此时的客户端还具有收发数据的能力。
四次挥手
-
第一次挥手:
客户端准备关闭连接时, 向服务端发送一个释放连接的数据包FIN包, 同时停止发送数据, 关闭客户端到服务端的数据传送,进入FIN_WAIT1状态。(发送 FIN 报文时,发送 FIN 的一端不能再发送数据,但还可以继续接收数据。) -
第二次挥手:
服务端收到FIN包后,发送一个ACK给客户端,进入 CLOSE_WAIT 状态,从客户端到服务端方向上的连接就释放了。但从服务端到客户端方向上的连接并未关闭。客户端收到ACK后, 进入FIN_WAIT2状态; -
第三次挥手:
服务端在所有数据发送完成后,发送FIN包,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态; -
第四次挥手:
客户端收到服务端发来的 FIN 后,发出确认ACK,进入 TIME_WAIT 状态。
此时,TCP 连接还未释放,经过时间等待计时器设置的 2MSL 时间后,客户端进入 CLOSE 的状态。
服务端收到ACK后进入CLOSE状态。 -
四次挥手完成,TCP连接释放。
为什么要四次握手?
- 三次握手的 SYN 与 ACK 一起发送,但关闭连接需要将 FIN 与 ACK 分开传送,因为一端关闭另一端仍然可以发送数据,维持半连接状态,将缓冲区中的数据全部发送,避免数据丢失。