TCP 三次握手与四次挥手

2022-11-14  本文已影响0人  xin源意码

目录

  1. TCP与UDP的区别

  1. TCP 三次握手

  2. 为什么需要三次握手?而不是两次

  3. TCP 四次挥手

  4. 为什么需要等待 2MSL

  5. 为什么需要四次挥手?而不是三次

1. TCP 与 UDP 的区别

TCP(Transmission Control Protocol,传输控制协议)是面向连接的,可靠的通信协议,而 UDP(User Datagram Protocol,用户数据报协议)是无连接的,不可靠的通信协议。

它们两者都是构成网络运输层的关键协议,接下来我们通过一个表格对比二者的区别:

从表格中我们可以看出,TCP 与 UDP 最大的区别就在于可靠传输。那 TCP 的可靠传输是由什么保证的呢?一个很重要的性质就是,TCP 是面向连接的通信协议。

TCP 每次在通信之前,客户端和服务端都需要通过发送数据消息,先建立一个稳定的传输"通道",然后再进行数据传输。这个过程我们称之为"TCP 连接的三次握手"。

2. TCP 三次握手

TCP 三次握手建立连接,是 TCP 数据传输的必要过程。流程大致分为以下几步:

在上述过程中,还有一些重要的概念:

3. 为什么三次握手

如上可见,TCP 建立通信连接时,需要进行三次握手。那么,为什么两次不行呢?举一个 A-B 拨打电话的场景:

我们可以发现,如果只有两次握手,会发生比如以下场景:

结合上面的电话拨号例子,两次连接可能出现的问题:

因此,采用三次握手建立连接可以防止上述问题的出现,当客户端收到一个已失效的建立连接确认报文时,不会向服务端进行第三次握手确认。而服务端由于收不到确认,就不会和客户端建立连接了。

总结:三次握手可以防止已失效的连接请求又传送到服务器端,导致无效连接的出现,浪费服务端资源。

4.  TCP 四次挥手

当数据传输完成后,为了节省服务器的资源和网络开销,需要进行断连。可以理解为,电话打完了,需要我们手动进行挂电话的操作。

当客户端(Client,以下简称C端)和服务器(Server,以下简称S端)都是连接状态时:

和我们的电话通话不同,TCP 连接是全双工的,也就是在通信的时候允许数据在两个方向上同时传输。可以理解为是电话+电话留言,两边都需要挂电话才会结束通讯过程,整个流程可以看成是如下场景:

5. 为什么要等待 2MSL

Max Segment Lifetime(简称 MSL),指报文的最大存活时间,它是任何报文段被丢弃前在网络内的最长时间。

从上面断连的第四次挥手阶段,我们发现客户端在收到服务端的断连请求后,还等待了 2MSL 才变为 CLOSED 状态。这是为什么呢?

1)可以保证 TCP 的全双工连接能够可靠关闭

由于 IP 协议的不可靠性或者其它网络原因,导致 S 端没有收到 C 端的 ACK 报文,那么 S 端就会在超时后重新发送 FIN,如果此时 C 端的连接已经关闭处于 CLOSED 状态,那么重发的 FIN 就找不到对应的连接了,从而导致连接错乱。

因此,C 端发送完最后的 ACK 不能直接进入 CLOSED 状态,而要保持 TIME_WAIT,等待可能重传的 FIN 报文,保证对方能收到 ACK。

2)保证此处连接的重复数据段从网络中消失

如果 C 端发送最后的 ACK 后直接进入 CLOSED 状态,然后再向 S 端发起一个新连接,这时无法保证新连接与刚关闭连接的端口号是不同的,就可能出现问题:如果前一次连接的某些数据滞留在网络中,这些延迟数据在建立新连接后到达 C 端,由于新老接口的端口号和 IP 都一样,TCP 协议就认为延迟数据是属于新连接的,新连接就会收到脏数据,导致数据包混乱。

所以,TCP 连接需要在 TIME_WAIT 状态等待 2 倍 MSL,保证本次连接的所有数据在网络中消失。

6. 为什么四次挥手

建立连接时当 Server 收到 Client 端的 SYN 连接请求时,可以直接发送带有同步标志位 SYN 和确认应答号 ACK 的报文,所以建立连接只需要三次握手。

由于 TCP 是全双工模式,这就意味着关闭连接时,当 C 端发出 FIN 报文段时,只是表示 C 端的数据已经发送完毕了,但 S 端还是可以发送数据到 C 端的。

因此,S 端很可能不会立即关闭 SOCKET,故 S 端数据发送完毕后就需要 "第四次挥手" 另外发送报文段通知 C 端去断开连接。

上一篇下一篇

猜你喜欢

热点阅读