TCP

202 阅读2分钟

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:报文最大生存时间,是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。防止一些过期的包被当作有效包处理。