TCP为什么需要三次握手四次挥手

TCP为什么需要三次握手四次挥手

三次握手

TCP是通过程序实现的,可靠的,面向连接的协议。而程序是严谨的,每一次建立连接都会进行“三次握手”这样的步骤。

建立连接的目的是为了可靠的数据传输。所以需要保证客户端和服务端都能正常的发送或接收数据。

如果有一方无法正常发送、接收数据,那么整个数据传输既不可靠也不能成功。

所以为什么会需要三次,而不是两次?

三次握手流程:

1.刚开始客户端和服务端都是关闭状态,服务端会一直处在监听状态,监听是否有建立连接的请求。

2.客户端需要建立连接时,会发送确认连接报文,此报文是同步报文SYN=1,同时生产一个随机序列号seq=x,这是第一次握手

第一次握手,客户端发送同步报文到服务端,客户端知道自己有发送数据能力,不知道服务端是否有发送、接受数据能力。

3.当服务端接收到连接请求报文时,会发送一个同步报文确认报文,此报文SYN=1,并且ACK=1(大写ACK表示报文为确认报文),同时服务端也会生成一个随机序列号seq=y,并且将ack设置为x+1(x是客户端发送的同步报文序列号),确认报文回传给客户端,这是第二次握手

第二次握手,服务端收到同步报文,并回复确认同步报文,此时,服务端知道自己有接收、发送数据能力,并且客服端有发送数据能力,但不知道客户端是否有接收数据能力。

4.当客户端收到服务端的ACK报文后,会回复一个ACK确认报文,用于确认确认报文已收到,此报文 ACK = 1,seq = x + 1, ack = y + 1(y是确认报文序列号),这是第三次握手

第三次握手,当客户端收到确认同步报文后,知道服务端具备发送、接收能力,也知道自己具备,但是服务端只知道客户端具备发送能力,还不知道也有接收能力,所以需要发送确认报文,告诉服务端自己具备接收能力。

当三次握手流程结束后,客户端服务端都知道自己和对方具备发送、接收数据能力,建立连接完成,就可以进行数据传输了。

所以两次握手是无法满足以上条件的, 因为服务端并不知道客户端是具备接收数据的能力,需要第三次握手,客户端告知服务端自己有接收能力。
TCP为什么需要三次握手四次挥手_第1张图片

四次挥手

三次握手是为了建立可靠的数据传输通道,四次挥手是为了保证等数据传输完再关闭连接,保证双方都达到关闭连接的条件才能断开。

四次挥手流程:

  1. 客户端发起 FIN=1 断开连接的报文,携带随机生成的 seq=u,发送给服务端,并且自己处于 FIN-WAIT状态,这是第一次挥手

    第一次挥手客户端发起关闭连接的请求给服务端;
    
  2. 服务端接收到 FIN 报文后,回复一个确认报文,其中 ACK = 1,随机生成一个 seq=v,以及 ack=u+1(u为客户端发送报文的序列号),这是第二次挥手

    第二次挥手:服务端收到关闭请求的时候可能这个时候数据还没发送完,所以服务端会先回复一个确认报文,表示自己知道客户端想要关闭连接了,但需要等待数据传输完;
    
  3. 当服务端数据发送完了过后,再发送一个 FIN 报文给客户端,通知客户端,服务端准备关闭连接了,此报文 FIN=1,ACK=1,ack=u+1(u为客户端发送报文的序列号),seq=w这是第三次挥手

    第三次挥手,当数据传输玩,服务端会主动发送FIN报文,告知客户端,标识数据已发送万传给你,服务端准备关闭连接了。
    
  4. 当客户端收到 FIN 确认报文时再发送一个FIN 的确认报文,其中 ACK = 1,seq = u + 1,ack = w + 1(w为服务端发送报文的序列号),并进入 TIME-WAIT 状态,当等待 2MSL ( 报文最大生存时间 *2)后关闭连接,这是第四次挥手

    第四次挥手,当客户端收到服务端的FIN报文后,会回复ACK报文,告知服务端自己知道了,在等待一会就关闭连接。
    

TCP为什么需要三次握手四次挥手_第2张图片

疑问:

1.为什么握手三次,挥手却要四次?

尾音我说的时候没有数据传输,服务端的SYN和ACK报文可以一起发送,但是挥手时有数据传输,ACK和FIN报文不能同时发送,需要分为两步,所以多了一步流程。

2.为什么客户端在第四次挥手后还会等待2MSL?

等待2MSL是因为保证服务端接收到了ACK报文,因为网络是复杂的,ACk报文可能会丢失,如果服务端没接收到ACK报文的话,会重新发送FIN报文,只有当客户端等待了2MSL都没有收到重新发送的FIN报文时,才表示服务端是正常接收到了ACK报文,这个时候客户端就能关闭了。

总结

TCP协议是面向连接的可靠的传输层协议,它的拥塞控制,失败重传等机制在互联网数据传输中是不可或缺的。当下互联网行业中,基于TCP实现的程序数不胜数。虽然程序员很少有机会主动编写TCP相关代码,但理解其实现原理,还是有所帮助的。

你可能感兴趣的:(网络)