tcp的三次握手和四次挥手

三次握手

三次握手发生在客户端和服务器建立连接的阶段。流程如下:

  • 客户端向服务器发送一个同步报文SYN i
  • 服务器向客户端响应一个报文SYN j,同时对SYN i进行确认ACK i+1
  • 客户端再向服务器发送一个确认报文ACK j+1
    如下图:
    tcp3

    为什么需要三次握手

    防止已经失效的连接请求突然又传到服务器,因而产生错误。假设客户端向服务器发送第一个连接请求,但这个请求丢失了,服务器没有接收到,于是客户端向服务器发送第二个连接请求,这次正常建立了连接,交换完数据后关闭连接,而此时第一个丢失的连接请求又到达了服务器,服务器以为是客户端又重新发起了连接,于是向客户端发送响应报文,如果只有前两次握手,则服务器不等客户端回应就建立连接,等待客户端的数据,而这次连接是之前失效的连接,并不是客户端发起的连接,因而客户端也就没有数据传输,服务器就一直等待客户端,造成了服务器资源的浪费。若采用三次握手即可解决此问题,服务器要接收到客户端的第三次握手才会建立连接,而此次连接是无效的,因此客户端不会向服务器发起第三次握手,因此连接不会建立。

四次挥手

四次挥手发生在客户端和服务器关闭连接的阶段。流程如下:

  • 客户端主动关闭,向服务器发送一个FIN
  • 服务器接受到FIN,对这个FIN进行确认,发送ACK
  • 服务器向客户端也发送一个FIN
  • 客户端对服务器的FIN进行确认
    如下图:
    tcp4

    为什么需要四次挥手

    TCP连接是全双工的,数据可以双向传递,因此每个方向必须单独进行关闭。关闭连接时,服务器可能还有数据要发送,不能立即关闭连接,因此先发送一个ACK,等所有数据发送完,再向客户端发送FIN。

TIME_WAIT状态

首先发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait的状态,也就说该发送方会保持2MSL时间之后才会回到初始状态。MSL值是数据包在网络中的最大生存时间。产生这种结果使得这个TCP连接在2MSL连接等待期间,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。

为什么需要TIME_WAIT状态

1、假设客户端最后发送的ACK在网络上丢失,服务器没收到ACK向客户端重新发送FIN,因此客户端必须保持连接以发送ACK确认报文,这保证了TCP连接的可靠关闭。
2、假设没有TIME_WAIT状态,一个客户端关闭连接后又有一个新的客户端以相同的ip地址和端口号建立连接,此时在服务器看来,第二个客户端即为第一个客户端,因为TCP协议栈是无法区分前后两条TCP连接的不同的,因此会发生这种现象,前一个客户端发送给服务器的数据和后一个客户端发送的数据产生了混乱,会产生不可预期的后果。因此TIME_WAIT的第二个作用是使旧的数据包在网络上因为过期而消失。

最后,tcp的状态转移图:
tcp

分享到