为何创建TCP链接须要三次握手,为何断开TCP链接须要四次握手,TIME_WAIT状态的意义

为何创建TCP链接须要三次握手?

缘由:为了应对网络中存在的延迟的重复数组的问题

例子:

假设client发起链接的链接请求报文段在网络中没有丢失,而是在某个网络节点长时间滞留了,致使延迟到达server。原本这是一个已经失效的链接报文,可是server接收到这个链接报文以后,误认为client发起了新的链接,因而向client发送确认报文段。此时由于没有了链接的3次握手,client不会对server的确认报文做出回应,也不会向server发送数据,server就觉得链接已经创建,一直在空等client的数据,这样server的这一部分网络资源就被浪费了。数组

为何断开TCP链接须要进行四次握手 ?

由于TCP链接是全双工的网络协议,容许同时通讯的双方同时进行数据的收发,一样也容许收发两个方向的链接被独立关闭,以免client数据发送完毕,向server发送FIN关闭链接,而server还有发送到client的数据没有发送完毕的状况。因此关闭TCP链接须要进行四次握手,每次关闭一个方向上的链接须要FIN和ACK两次握手。网络

TIME_WAIT状态的意义

在TCP链接中,当被动关闭链接的一方(图中client)发送的FIN报文到达时,被动关闭链接的一方会发送ACK确认报文,而且进入TIME_WAIT状态,而且等待2MSL时间段(MSL:maximum segment life)。这么作有下述两个缘由:tcp

  1. 被动关闭链接的一方(图中的server)在一段时间内没有收到对方的ACK确认数据包,会从新发送FIN数据包,于是主动关闭链接的一方须要停留在等待状态以处理对方从新发送的FIN数据包。不然他会回应一个RST数据包给被动关闭链接的一方,使得对方莫名其妙。server

  2. 在TIME_WAIT状态下,不容许应用程序在当前ip和端口上和以前通讯的client(这个client的ip和端口号不变)创建一个新的链接。这样就能避免新的链接收到以前的ip和端口一致的链接残存在网络中的数据包。这也是TIME_WAIT状态的等待时间被设置为2MSL的缘由,以确保网络上当前链接两个方向上还没有接收的TCP报文已经所有消失。blog