TCP 连接建立完后,客户端还是服务端都能发送和接收数据,所以 TCP 是一个全双工的协议。
第一次握手 客户端向服务端发送连接请求报文段。该报文段中包含syn:表示当前报文段是一个连接请求报文
第二次握手 服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含syn,ack:表示当前报文段是一个同意建立连接的应答报文
第三次握手
当客户端收到连接同意的应答后,还要向服务端发送一个包含ack标识的确认报文
为什么 TCP 建立连接需要三次握手,明明两次就可以建立起连接
如果没有第三次握手:不需要客户端确认需要建立连接,如下场景:
客户端发送连接请求A,因网络原因导致超时,tcp超时重传机制会重发连接请求B,服务端顺利收到数据,最终释放连接,此时两端都已关闭。
假设此时,请求A到达服务端,服务端收到并发出同意报文,处于建立连接状态,一直等待客户端发送数据,此时客户端处于close状态,那么将造成资源浪费。
断开连接四次挥手
因为TCP 是全双工的,在断开连接时两端都需要发送 FIN 和 ACK。
第一次: A发送释放连接请求,包含FIN标识
第二次: B收到释放连接请求后,通知应用层释放tcp连接,然后发送ack,并处于close-wait状态。此时表明A到B的连接已释放,但全双工通信,B仍然可以向A发数据。
第三次: B有未发送完的数据可以继续发送,完毕后向A发释放连接请求,包含FIN标识
第四次: A收到B的释放连接请求,发送ack,进入 TIME-WAIT 状态。持续2MSL后,进入close状态。
为什么要等2MSL?
等待2MSL时间主要目的是怕最后一个ACK包对方没收到,为了保证 B 能收到 A 的确认应答。,那么对方在超时后将重发第三次握手的FIN包,A接到重发的FIN包后可以再发一个ACK应答包
MSL:报文最大生存时间,是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。防止一些过期的包被当作有效包处理。